我有一个由x1,y1,x2,y2标识的线,它们是双值。然后我有 几个图形对象(让我们命名为TShape类) 是左,上,右,下:双。只有Top和Left属性是可写的 值。在顶部和左侧拖动TShape时,会更新。
当TShape靠近Line时,我正在使用函数来发现。功能 定义是:
function NearLine(const Target: TPoint; X1, Y1, X2, Y2: double; Off: integer = 5): boolean;
如果Target指定的点靠近Point1指定的行,则NearLine返回true 和Point2。该点必须在Off指定的距离。
我使用Off = 0
;
在我的实现中,Target是我不断更新的TShape的中心 从顶部和左侧属性计算它。因为目标 是TPoint我做的:
1 -
CPoint.X := Trunc(Center.X);
CPoint.Y := Trunc(Center.Y);
2- 当上面的函数NearLine为真时,我强制鼠标释放:
3 -
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
1,2和3在一个名为UpdateMove的事件中被调用 拖动形状。
这让我可以“坚持”TShape几乎接近线路,但事实并非如此 正是我想要实现的......显然由于Trunc功能而出现错误 错误是:
deltaX := Frac(Center.X);
deltaY := Frac(Center.Y);
以编程方式释放鼠标后如何强制所有中心 因此所有的形状都完美地排列(共线) 线?
有任何帮助吗? :(
答案 0 :(得分:4)
你问的问题是错的,这就是为什么你不能'看到自己的答案。如果3个点不共线,除非你改变数学和/或物理定律,否则你不会“强迫”它们共线。
您可能想要的是在距离您的参考点最近的两个点定义的线上找到一个点。这是非常简单的几何形状:最近的点是从第三个点到前两个定义的直线的垂线的“脚”!你可以单独使用毕达哥拉斯理论解决这个问题,你甚至不需要花哨的解析几何。