簡體   English   中英

檢查Java Swing中的點是否在線

[英]Check if point is on line in Java Swing

我畫了一條線然后是一個點,然后我想檢查點是否在線上。 我在數組中采用了一個線坐標(因為有多個線)。 我想檢查最后一行的當前點嗎?

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的變化差別很大。 因此,檢測線上是否有點存在問題。 我該如何檢查這種情況?

如果點(xP,yP)在從(x1,y1)到(x2,y2)的線段上,則Line2D.ptSegDist(x1, y1, x2, y2, xP, yP)返回0.0。 Line2D.ptLineDist為無限線做同樣的事情。

使用從點到線距離的向量形式,其中線是x = a + t n

如果使用非單位向量N代替單位向量n ,則d = ||( a - p ) - (( a - p )· NN /( N · N )||,這消除了一個正方形根。

假設您用於描述行的浮點數組被解釋為{x1,y1,x2,y2},則a =(x1,y1)和N =(x2 - x1,y2 - y1)。

如果計算的距離與測量或算術誤差相當,則該點在線上。 同樣,您不需要計算模數中的平方根,但可以比較平方值。

就算法而言,一條線(除了具有x =常數之類的垂直的線之外)具有y = mx + b的形式。 如果你的觀點滿足那個等式,那么它就在線上。 因此,您只需要找到線的斜率值及其y軸截距,並檢查點的x和y值是否滿足每條線的方程。

編輯:

正如上面的注釋所指出的,你可以使用點斜率形式(斜率為(y2-y1)/(x2 / x1))而不是斜率截距形式。 這將為您提供一個方程式,該方程式僅取決於y,x以及更容易編碼的線的起點和終點(因為您通過其起點和終點定義線,至少在擺動中)。 我建議使用斜率截距形式的唯一原因是因為您已經嘗試在算法中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM