求算法:求环绕一条线的矩形的四个端点。(100分)

  • 主题发起人 主题发起人 笑他
  • 开始时间 开始时间

笑他

Unregistered / Unconfirmed
GUEST, unregistred user!
已知a,b两点,求环绕着条线的四个端点:p0,p1,p2,p3
图示如下:
p0 ----------------------p1
| |
| a----------------b |
| |
p3 ----------------------p2
其中边距为2(像素),已知线段不一定平行或垂直,可以是任意方向。
不知我描述清楚否?
 
其中边距为2(像素)?
 
边距就是a,b两点和框的距离,也是已知线段和框的距离。框必须是矩形。只不过此矩形可以任意摆放的。
 
求屏幕上的坐标(象素)还是实际坐标(mm)?
 
求屏幕上的坐标(象素)
 
procedure LineRect(Pt1, Pt2: TPoint;
var x1, y1, x2, y2, x3, y3, x4, y4: Extended);
const
Width = 2; //边界距
var
Theta, s, c: Extended;
begin
Theta := ArcTan2(Pt2.Y - Pt1.Y, Pt2.X - Pt1.X);
SinCos(Theta, s, c);

x1 := Pt1.X + Width * (-s - c);
y1 := Pt1.Y - Width * (-c + s);

x2 := x1 + 2 * Width * s;
y2 := y1 - 2 * Width * c;

x3 := Pt2.X + Width * (s + c);
y3 := Pt2.Y - Width * (c - s);

x4 := x3 - 2 * Width * s;
y4 := y3 + 2 * Width * c;
end;
 
稍等,我测试一下。
 
minx:=min(p1.x,p2.x)-2;
miny:=min(p1.y,p2.y)-2;
maxx:=max(p1.x,p2.x)+2;
maxy:=max(p1.y,p2.y)+2;

四个点为 (minx,miny)、(minx,maxy)、(maxx,maxy)、(maxx,miny)
 
测试结果很不理想,算了,不难为大家了,结贴。
 
多人接受答案了。
 
后退
顶部