2017-09-03 1 views
0

그림에서 두 객체가 서로를 가리키는 위치를 계산하려고합니다. 객체를 직선으로 변환 할 수 있기 때문에 교차 선을 사용하여이 작업을 수행 할 것이라고 생각했습니다. 한 가지 문제는 내가 필요없는 무한한 선 사이의 교차점을 찾는 코드를 찾은 것 같습니다.두 객체 사이에 교차하는 선

이 코드는 교차하는 무한대를 찾는 방법을 자세히 설명한 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에 대해 해결할 수 있습니다. 선분/선분 교차 알고리즘을 찾고 있다면 [here] (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

죄송합니다. 그래, 나는 두 선분 사이의 교차점을 찾고 있는데, 한 선분은 세그먼트로, 다른 선분은 무한대로 남아있다. –

답변

1

는 소리가 난다. 일단 그 점이 있으면 교차가 선분에 속하는지 쉽게 확인할 수 있습니다.

p0p1은 linesegment의 끝점을 정의하는 점이고 px은 두 개의 무한한 선 사이의 교차점이라고 가정합니다. 다음 조건은 pxp0p1 사이에 있는지 확인합니다.

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

정당성

우리가 다음의 파라미터 벡터 식으로 표현 될 수있는 다음 p0p1 의해 정의 된 선을 따라 하강 px 점을 가정하면 d

px = p0 + (p1 - p0)*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 
관련 문제