检查Java Swing中的点是否在线

时间:2012-02-02 13:56:05

标签: java swing math line

我画了一条线然后是一个点,然后我想检查点是否在线上。我在数组中采用了一个线坐标(因为有多个线)。我想检查最后一行的当前点吗?

if (positionX1 == positionX2 && positionY1 == positionY2) {
    float m = line.getSlope(
        drawLines[currentLines - 1][2], drawLines[currentLines - 1][3],
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    m = Float.parseFloat(df.format(m));
    float c = line.getIntercept(
        drawLines[currentLines - 1][2], drawLines[currentLines - 1][3],
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    c = Math.round(c);
    m1 = line.getSlope(positionX2, positionY2,
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    m1 = Float.parseFloat(df.format(m1));
    System.out.println(m + "   " + m1);
    c1 = line.getIntercept(positionX2, positionY2,
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    c1 = Math.round(c1);

    if (m == m1 && ((c == c1) || (c == c1 - 1) || (c == c1 + 1))) {
        System.out.println("Point is on Line");
    }
}

问题是当一个点靠近线的起点或一条线约为m1的垂直值时,c1的变化差别很大。因此,检测线上是否有点存在问题。我该如何检查这种情况?

3 个答案:

答案 0 :(得分:9)

如果点(xP,yP)位于从(x1,y1)到(x2,y2)的线段上,则

Line2D.ptSegDist(x1, y1, x2, y2, xP, yP)返回0.0。 Line2D.ptLineDist为无限线做同样的事情。

答案 1 :(得分:2)

使用distance from a point to a line的矢量形式,其中行 x = a + t n

如果使用单位向量 n 而不是单位向量 N ,则 d = ||( a - p ) - (( a - p )· N N < / strong> /( N · N )||,它消除了平方根。

假设您用来描述线条的浮点数组被解释为{x1,y1,x2,y2},那么 a =(x1,y1)和 N =(x2 - x1,y2 - y1)。

如果计算的距离与测量或算术误差相当,则该点在线上。同样,您不需要计算模数中的平方根,但可以比较平方值。

答案 2 :(得分:1)

就算法而言,一条线(除了具有x =常数之类的垂直的线之外)具有y = mx + b的形式。如果你的观点满足那个等式,那么它就在线上。因此,您只需找到线的斜率值及其y轴截距,并检查点的x和y值是否满足每条线的等式。

编辑:

正如上面的评论所指出的,你可以使用点斜率形式(斜率为(y2-y1)/(x2 / x1))而不是斜率截距形式。这将为您提供一个方程式,该方程式仅取决于y,x以及更容易编码的线的起点和终点(因为您通过其起点和终点定义线,至少在摆动中)。我建议使用斜率截距形式的唯一原因是因为您已经尝试在算法中使用它。