Java - 一条从点(a,b)到点(c,d)的线段是否与点(x,y)相交?

5
我正在用Java编写一个工具,可以在Graphics对象上进行一些绘图。但是,我遇到了一个问题,不知道该如何解决。希望有人能够帮忙解答。如何确定坐标为x,y的点在图形对象上与从(例如)200,200到392,144延伸的线相交。听起来很简单,但我被卡住了……求助!

7个回答

7

这实际上与 Graphics 对象无关,只是一些简单的数学计算。

你的示例行有以下公式:

        

t在[0, 1]之间时,为了确定该点是否在直线上,只需解决线性方程组即可。

        

如果系统中两个方程的t相同且在0到1之间,则有解。因此,您需要计算:

        

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

小补充:在您的情况下,给出了(x,y),您可以为两个子公式计算tx=200+t_x*192y=200+t_y*-56)。如果t_xt_y是相同的值,并且此值介于0和1之间,则(x,y)在该线上。 - schnaader
嗯,考虑到我们通常处理屏幕上的像素,也许数学方法只是问题的一半答案。 - Joey
这不是 t_x = (x - 200) / 192t_y = (y - 200) / -56 吗? - Yew Long
谢谢,这就是早上做数学的结果。已经修复了。 - Joey
请注意,如果您需要对线段上或线段外的点进行一定的容差处理,那么也许本的答案更适合。 - Joey

2
你可以计算连接这两个点的直线方程。
直线方程:y = mx+c 其中,m为斜率:m = (y2-y1)/(x2-x1); c为y轴截距:c = y1 - m * x1; 得到方程后,你可以通过将其x坐标代入方程并检查输出的y坐标是否匹配来测试任何点是否在该直线上。

请注意,您需要检查点是否超出了线段的起点或终点。这可能不适用于 Line2D 变量,但适用于数学变量。 - Joey
2
Line2D.contains() 总是返回 false。 - proactif

2
已经有正确的答案了,但我认为更普遍有用的是有一个公式可以给出任何点到指定直线的距离。然后你只需要检查这个距离是否为零,或者在你选择的容差范围内。以下公式应该适用于任何特殊情况,如垂直线(无限梯度)。
点X到线AB的距离为:

    

其中ABX是三个点的三维位置向量(如果您只在二维空间中工作,请将z设为0),x表示向量积。这就是答案。

    

其中A = (a,b),B = (c,d),X = (x,y)。然后,为了检查该点实际上是否在线段内而不是在无限直线的其他位置,可以使用标量积:从AB沿着直线的X距离为。

    

即,也就是。

    

这应该介于0和之间。

哦,对了。我完全忘记了那个。稍微有点余地的话,它应该也可以在屏幕上的像素上可接受地工作(在这里,我猜点不会恰好在线上)。 - Joey
感谢Joey提供的公式图片。 - Ben
嗨@Ben(或@Joey),你能确认上述方程式是基于...点X是(x,y),线段AB是从(a,b)到(c,d)的一条直线吗?谢谢。 - rog8gm
嗨@rog8gm。是的,没错。我现在已经在文本中澄清了这一点。 - Ben

1

0
听起来你需要找到连接两个点之间的直线方程。然后你可以使用这个方程来证明你的点是否碰到了这条直线。 一条直线的方程通常写成y=mx+b的形式,其中m是斜率,b是y截距。

0

Line2D API会对您有所帮助。请查看ptLineDist(double PX,double PY)方法。如果点位于直线上,则返回0.0。


-1

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

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

编辑:stackoverflow上的人们非常迅速。:-)


Line2D.contains() 总是返回 false。 - Joey
你是正确的。在回答论坛问题之前应该先阅读Javadoc!根据Javadoc - “测试指定的坐标是否在此Line2D的边界内。虽然这种方法需要实现Shape接口,但在Line2D对象的情况下,它总是返回false,因为线条不包含任何区域。” - Manimaran Selvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接