Java - 是否从(a,b)延伸到(c,d)触及Point(x,y)的线?

时间:2011-06-08 08:54:16

标签: java graphics

我正在用Java编写一个工具,它可以对Graphics对象进行一些绘制。

但是,我遇到了一个我不太清楚如何解决的问题。希望有人可以提供帮助。

如何确定Graphics对象上的点x,y是否接触从例如200,200到392,144的延伸线。

听起来很简单,但我很难过......帮忙!

7 个答案:

答案 0 :(得分:7)

实际上,这与Graphics对象几乎没有关系。这只是一些简单的数学。

您的示例行具有公式

http://hypftier.de/dump/SO-6276361-1.png

在[0,1]中使用 t 。因此,要找出该点是否在线,只需求解线性方程组

http://hypftier.de/dump/SO-6276361-2.png

如果 t 对于系统中的两个等式在0和1之间相同,则可以得到解决方案。所以你需要计算:

http://hypftier.de/dump/SO-6276361-3.png

除非我的数学失败了;已经有一段时间了。

答案 1 :(得分:2)

你可以算出连接两点的直线方程。

行方程:y = mx+c

m是渐变:m = (y2-y1)/(x2-x1);

c是y轴截距:c = y1 - m * x1;

一旦得到了等式,就可以通过插入x坐标并检查方程中出现的y坐标是否匹配来测试线上是否有任何点。

答案 2 :(得分:2)

已经有正确的答案,但我认为有一个公式给出指定线的任何点的距离可能更有用。然后你可以检查它是否为零,或者你选择的公差范围内。无论垂直线(无限渐变)等特殊情况如下,以下情况都应有效。

X 点与 AB 行之间的距离为

http://hypftier.de/dump/SO-6276361-Ben-1.png

其中 A B X 是三个点的3D位置矢量(只需设置 z 如果您只在2D工作,则= 0,而 x 是矢量积。那来了

http://hypftier.de/dump/SO-6276361-Ben-2.png

其中 A =(a,b), B =(c,d)和 X =(x,y)。然后要检查该点是否实际位于线段内而不是无限线上的其他位置,您可以使用标量积: X A 之间的距离到 B

http://hypftier.de/dump/SO-6276361-Ben-3.png

http://hypftier.de/dump/SO-6276361-Ben-4.png

这应该介于0和http://hypftier.de/dump/SO-6276361-Ben-5.png

之间

答案 3 :(得分:1)

答案 4 :(得分:0)

听起来你需要找到两点之间的直线方程。从那里你可以使用那个等式证明,如果你的点触及线。 线的方程通常写为y = mx + b,其中m是斜率,b是y轴截距。

答案 5 :(得分:0)

Line2D API会对您有所帮助。请参阅ptLineDist(双PX,双PY)方法。如果点在线上,则返回0.0。

答案 6 :(得分:-1)

在数学上,您可以找到两个点的斜率,并与每个旧点的新点的斜率进行比较。

在Java中,您可以使用Line2D.contains(double x,double y);

编辑:stackoverflow上的人员非常快。 : - )