请教任意矩形改变大小的算法(200分)

X

x3000

Unregistered / Unconfirmed
GUEST, unregistred user!
正在做一个矢量图制作软件,在矩形的算法上有点问题,请大家指教
设定矩形有四个顶点,移动一个顶点时,对角顶点不动,其它两个顶点移动,使之保持矩形形状。当矩形旋转后,我的算法出现一些问题:
0 ----- 3
| |
1 ----- 2
如上图矩形有0,1,2,3四个点,当移动1,3时,使用我的算法 0和2的位置有可能互换
程序如下:
PointsList[aIndex mod 4]:= P;
PointsList[(aIndex+3) Mod 4 ] := LineCross(P,PointsList[(aIndex+2) Mod 4 ],PointsList[(aIndex+2) Mod 4 ],PointsList[(aIndex+3) Mod 4 ]);
PointsList[(aIndex+1) Mod 4 ] := LineCross(P,PointsList[(aIndex+2) Mod 4 ],PointsList[(aIndex+2) Mod 4 ],PointsList[(aIndex+1) Mod 4 ]);

function LineCross(const aModifiedPoint, AnotherPoint,KAnglePoint1, KanglePoint2: TCad2dPoint): TCad2dPoint;
var
k:TRealType;
begin
if Abs(KAnglePoint1.x - KAnglePoint2.x)<littleNum then begin
Result.x := aModifiedPoint.x;
Result.y := AnotherPoint.y;
end else if Abs(KAnglePoint1.Y - KAnglePoint2.Y)<littleNum then begin
Result.Y := aModifiedPoint.Y;
Result.X := AnotherPoint.X;
end else begin
k:=(KanglePoint1.y - KanglePoint2.y) / (KanglePoint1.X - KanglePoint2.X);
Result.x :=(k*( k* aModifiedPoint.x + AnotherPoint.y - aModifiedPoint.y) + AnotherPoint.x ) / ( K*K +1);
Result.Y :=(k*( k* AnotherPoint.y - aModifiedPoint.x + AnotherPoint.x ) + aModifiedPoint.y ) / ( K*K +1);
end;
end;
其中:
PointsList放四个点的坐标,aIndex是移动的顶点, p 是新的位置
请大家帮忙看看出了什么问题或者给一个新的算法,谢谢
 
X

x3000

Unregistered / Unconfirmed
GUEST, unregistred user!
真的没人会吗?
 
X

xuxiaohan

Unregistered / Unconfirmed
GUEST, unregistred user!
比较偏的问题要有足够耐心的人才能回答,我帮你顶!
 

来如风

Unregistered / Unconfirmed
GUEST, unregistred user!
我帮你看看吧
 

陈晨

Unregistered / Unconfirmed
GUEST, unregistred user!
解释一下你的代码。然后我帮你解决
 
J

jackchin

Unregistered / Unconfirmed
GUEST, unregistred user!
仅保持"矩形形状"吗?
如果没有其他条件,(例如 1.保持原有的长宽比例,2.保持面积,3.保持原有的边长)
那么无法确定其他两个点(有很多点对符合要求)
如果加上上述条件3,则动点不是每一个点都可以到达的(动点轨迹是一个圆)
 

陈晨

Unregistered / Unconfirmed
GUEST, unregistred user!
用什么斜率????
直接取得修改点坐标的位移量,然后再另外两个点修改对应的x,y的值,
用斜率容易造成偏差的。
得到变化的矩形后载处理旋转。不知道你说的旋转保不包括倾角,
如果有的话仍然不要用斜率。可以直接计算几个定点的位置化线
 
J

jackchin

Unregistered / Unconfirmed
GUEST, unregistred user!
楼主的意思可能是要保持矩形四条边的方向不变?
 
X

x3000

Unregistered / Unconfirmed
GUEST, unregistred user!
可能我说得不太清楚
请看下图:
ret.jpg

只需要满足四个点连起来是一个矩形就行了
 
P

Passion

Unregistered / Unconfirmed
GUEST, unregistred user!
应该是边的方向不变吧,否则哪还叫不变。
 
J

jackchin

Unregistered / Unconfirmed
GUEST, unregistred user!
明白了,就是要保持四条边的方向不变
平面几何的问题,转化为解方程组问题
但要处理四条边与坐标轴平行的特别情况
就是你的两个if语句(可以合为一句呀?)
但判断和计算K应该是用aModifiedPoint吧,
if (Abs(KAnglePoint1.x - aModifiedPoint.x)<littleNum) or
(Abs(KAnglePoint1.y - aModifiedPoint.y)<littleNum) or
(Abs(KAnglePoint2.x - aModifiedPoint.x)<littleNum) or
(Abs(KAnglePoint2.y - aModifiedPoint.y)<littleNum) then
begin
Result.x := aModifiedPoint.x;
Result.y := AnotherPoint.y;
end else ....
后面的就不知道了,平面几何线平行的方程组
另外,你原有的四个点的合法性也要判断(是否组成一个矩形?)
 
J

jackchin

Unregistered / Unconfirmed
GUEST, unregistred user!
sorry,
我的答案明显是错的
我不明白你的代码各个参数的含义
另外,函数返回值是两个点,应该有4个数呀?
 
X

x3000

Unregistered / Unconfirmed
GUEST, unregistred user!
终于找到原因了,是我从别的地方抄来的linecross代码需要修改一下。
谢谢大家!分已经送出
 
顶部