2017-09-03 73 views
0

我正試圖計算圖片中兩個對象指向另一個的位置。我想我會使用相交線來執行此操作,因爲對象可以轉換成直線。一個問題是,我似乎在尋找代碼主要是爲了找到無用線之間的交集,這是我不需要的。2個對象之間的相交線

我發現這個代碼從a matlab blog詳細說明如何找到相交的無限行。

A = [lineA(1,:) - lineA(2,:); lineB(2,:) - lineB(1,:)]'; 
if rank(A) < 2 
    disp('Parallel') 
    B = [lineA(1,:) - lineA(2,:); lineA(1,:) - lineB(1,:)]'; 
    if rank(B) < 2 
     disp('Collinear') 
     if all((sort(lineA(:,1),'descend')-sort(lineB(:,1))) ... 
       .*[-1;1] <= sqrt(eps)) 
      tf = true; 
     else 
      tf = false; 
     end 
    else 
     tf = false; 
    end 
else 
    pq = linsolve(A,(lineB(2,:) - lineA(2,:))'); 
    tf = all(pq>=-sqrt(eps)) & all(pq<=1+sqrt(eps)); 
end 

我也相距約line + circle intersections看起來接近我可能需要老問題。

但問題是,我正在嘗試檢查1行與有限行相交。這張照片代表了我想要畫的東西。藍線的長度是有限的,而紅線是無限的,我試圖確定它們是否相交。

enter image description here

+1

這不是很清楚,我從圖中你正在嘗試完成解決d。如果你正在尋找一個線段/線段交集算法,你可以找到一些信息[這裏](https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-段相交)和[這裏](http://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/) – jodag

+0

對不起。是的,我正在尋找2條線段之間的交叉點,但是一條線段保持不變,另一條線段無限。 –

回答

1

這聽起來像您已經有確定的兩行(即無限線)之間的交叉點的能力。一旦你有了這一點,你可以很容易地檢查交叉點是否落在線段上。

我們假設p0p1是定義線段端點的點,px是兩條無限線之間的交點。以下條件將檢查px是否在p0p1之間。

d = dot(px-p0,p1-p0)/sum((p1-p0).^2); 
if d >= 0 && d <= 1 
    % intersecting 
else 
    % not intersecting 
end 

正當性

如果我們假設px沿着由p0p1然後限定的線落在它可以通過下面的參數向量的等式來表示的點

px = p0 + (p1 - p0)*d 

其中d是標量參數。根據公式,應該清楚pxp0p1之間當且僅當0 <= d <= 1

我們可以使用一些線性代數

% subtract p0 from both sides 
(px - p0) = (p1 - p0)*d 

% multiply by (p1 - p0)' to make the vectors into scalars 
(p1 - p0)'(px - p0) = (p1 - p0)'(p1 - p0)*d 

% divide to find d 
d = ((p1 - p0)'(px - p0))/((p1 - p0)'(p1 - p0)) 

% express using dot product and l2 norm. 
d = dot(p1-p0,px-p0)/norm(p1-p0)^2