簡體   English   中英

如何判斷一個點是否在某條線附近?

[英]How can I tell if a point is nearby a certain line?

我之前問過“ 我怎么能判斷一個點是否屬於某條線? ”我找到了合適的答案,所以非常感謝你。

現在,我想知道如何確定某一點是否接近我的界限。

您需要計算到線的直角距離 然后你必須定義“關閉”是什么,並測試它是否在該距離內。

你想要的等式是:

d = | V ^^·R | =(|(X_2-X_1)(Y_1-y_0) - (X_1-X_0)(Y_2-Y_1)|)/(SQRT((X_2-X_1)^ 2 +(y_2- Y_1)^ 2))。

@Alan Jackson的答案幾乎是完美的 - 但他的第一個(也是最多投票的)評論表明端點沒有得到正確處理。 要確保點在段上,只需創建一個框,其中段是對角線,然后檢查該點是否包含在其中。 這是偽代碼

給定線ab,包括點a和b,以及點p,有問題:

int buffer = 25;//this is the distance that you would still consider the point nearby
Point topLeft = new Point(minimum(a.x, b.x), minimum(a.y, b.y));
Point bottomRight = new Point(maximum(a.x, b.x), maximum(a.y, b.y));
Rect box = new Rect(topLeft.x - buffer, topLeft.y - buffer, bottomRight.x + buffer, bottomRight.y + buffer);
if (box.contains(p))
{
    //now run the test provided by Alan
    if (test)
        return true;
}
return false;

計算最接近該點的線上的點。

假設線段是a和b,並且該點是p。

float vAPx = p.x - a.x;
float vAPy = p.y - a.y;
float vABx = b.x - a.x;
float vABy = b.y - a.y;
float sqDistanceAB = a.distanceSq(b);
float ABAPproduct = vABx*vAPx + vABy*vAPy;
float amount = ABAPproduct / sqDistanceAB;
if (amount > 1) amount = 1;
if (amount < 0) amount = 0;

這給你'數量',你在A和B之間的線段有多遠(正確有界)。

    float nx = (amount * (b.x - a.x)) + a.x;
    float ny = (amount * (b.y - a.y)) + a.y;

給你點(nx,ny)。

if (p.distance(nx,ny) > threshold) reject;

這將在線段末尾之后正常工作,因為它將“數量”保持在0和1之間。

如果你不希望它有界線段擺脫金額的界限。 其余的代碼仍然可以工作,計算A和B之前和之后的位置。

還有一個問題聲稱這個問題是重復的,但是,它要求一個不同的東西,因此我的解決方案解決了點的位置,然后只解決歐幾里德距離(實際上解決了兩個問題)。

a.distanceSq(b)也可以作為vABx vABx + vABy vABy來完成,因為我們已經完成了這些操作。

這是一個python函數,可以解決這個問題。 它應該工作在2維或3維(或更多),並處理垂直和水平線,沒有特殊情況。 如果將clipToSegment設置為true,則如果投影線超出提供的線段,則返回的點將被剪切到末尾。

def nearestPointOnLine(pt, r0, r1, clipToSegment = True):
    r01 = r1 - r0           # vector from r0 to r1 
    d = np.linalg.norm(r01) # length of r01
    r01u = r01 / d          # unit vector from r0 to r1
    r = pt - r0             # vector from r0 to pt
    rid = np.dot(r, r01u)   # projection (length) of r onto r01u
    ri = r01u * rid         # projection vector
    lpt = r0 + ri           # point on line

    if clipToSegment:       # if projection is not on line segment
        if rid > d:         # clip to endpoints if clipToSegment set
            return r1
        if rid < 0:
            return r0 

    return lpt

用法:(點[4,5]距離線段[2,4]到[4,6])

r0 = np.array([2,4])
r1 = np.array([4,6])
rpt = np.array([4,5])
pt = nearestPointOnLine(rpt, r0, r1, True)

dist = np.linalg.norm(rpt-pt)
print('dist', dist)

谷歌是你的朋友: 點線距離(二維) 您可以在底部使用等式,然后就可以了。

基本上,你想要做的就是找到法線 - 也就是垂直於你的線的線 - 與你的點和線相交,然后計算沿着那條線的距離。

離附近有多近?

某些幾何體將為您提供所需的答案,您只需要了解以下步驟即可。

假設你的形狀是y = mx + b,那么到你的點的最短距離將是垂直於你的起始線的線(m1 = -1 / m),與你所討論的點相交。

從那里計算交叉點和相關點之間的距離。

暫無
暫無

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

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