2017-01-17 1 views
0

각 선상의 한 점과 그 선의 기울기를 통해 각 방향으로 연장되는 선이 무한대로 선분 (x1,y1), (x2,y2)과 교차하는지, 그리고 그렇다면 교차점이 발생하는 지점을 어떻게 결정합니까?무한한 선과 선분이 교차하는지 확인하는 공식?

나는 이것을 발견했지만, 도움이되는지 확신 할 수 없다.
누군가 내가 "광선"을 이해하는 데 도움이되고 싶다면, 나와 함께 괜찮습니다. http://www.realtimerendering.com/intersections.html

저는 바보 인 점 사과드립니다.

+0

그래서 선은 수직 일 수 없습니까? – Beta

답변

1

임의의 점은 파라 메트릭 식에게 제 2 세그먼트

dxx = x2 - x1 
dyy = y2 - y1 
x = x1 + u * dxx (2) 
y = y1 + u * dyy 
함유

dx = Cos(slope) 
dy = Sin(Slope) 
x = x0 + t * dx  (1) 
y = y0 + t * dy 

선이

x0 + t * dx = x1 + u * dxx (3)  
y0 + t * dy = y1 + u * dyy 

미지수에 대한 솔루션을 시스템 선형 경우 교차점이 존재 tu
u 범위에있다 [0..1]

교차점 (2)

+0

이 답변을 http://gamedev.stackexchange.com/a/44733/60691과 결합하면 내 문제를 완전히 해결할 수 있습니다. – bradleygriffith

+0

사실, @Mbo는 왜 기울기에 cos와 sin이 나와 그 값을 부여하는지에 대한 dx와 dy에 대한 추가 문서를 제공 할 수 있습니까? 대답은 대체로 정확하지만 경사면이 완전한 수직성에 가까워지는 것을보고있는 Im는 이상합니다. – bradleygriffith

+0

'기울기'는 OX 축과 라인 방향 사이의 각도라고 가정합니다. 선의 단위 길이 방향 벡터를 정의하려면 그 성분은 코사인과 사인'(dirx, diry) = (cos (기울기), sin (기울기))'이 방법은 수직선을 포함한 모든 기울기에 적용됩니다. 너는 어떤 기이함을 보았는가? – MBo

0

무엇을 검색 하시겠습니까? dot product입니다. 선은 벡터로 나타낼 수 있습니다.

두 줄이 있으면 어느 시점에서 교차합니다. 그들이 평행 한 경우를 제외하고.

병렬 벡터 은 (모두 정규화) (1)의 내적이, B (점 (a, b) = 1).

당신은 시작과 라인 내가의 끝 지점이 있다면, 당신은 또한 내가 쉽게 벡터 을 구성 할 수 있습니다.

첫번째 라인
1

나는했습니다이 작동하는 방법을 정확하게 설명 부탁하지 마십시오 방정식 쌍에서 발견 u의 대체 계산 될 수있다 그냥 내가 놓아 둔 고대 코드에서 외삽/재 작성했습니다. (액션 스크립트 1)

이 예를 들어 개체를 구축하는 일부 기능 :

function point(x, y){ 
    return {x, y} 
} 
function line(x0, y0, x1, y1){ 
    return { 
    start: point(x0, y0), 
    end: point(x1, y1) 
    } 
} 
function ray(x, y, vx, vy){ 
    return { 
    start: point(x, y), 
    vector: point(vx, vy) 
    } 
} 
function ray2(x, y, angle){ 
    var rad = angle * Math.PI/180; 
    return ray(x, y, Math.cos(rad), Math.sin(rad)); 
} 

교차로 코드 :

//returns the difference vector between two points (pointB - pointA) 
function delta(a, b){ return point(b.x - a.x, b.y - a.y) } 
//kind of a 2D-version of the cross-product 
function cp(a, b){ return a.y * b.x - a.x * b.y } 

function intersection(a, b){ 
    var d21 = a.vector || delta(a.start, a.end), 
     d43 = b.vector || delta(b.start, b.end), 
     d13 = delta(b.start, a.start), 
     d = cp(d43, d21); 

    //rays are paralell, no intersection possible 
    if(!d) return null; 
    //if(!d) return { a, b, position: null, hitsA: false, hitsB: false }; 

    var u = cp(d13, d21)/d, 
     v = cp(d13, d43)/d; 

    return { 
     a, b, 

     //position of the intersection 
     position: point(
      a.start.x + d21.x * v, 
      a.start.y + d21.y * v 
     ), 
     //is position on lineA? 
     hitsA: v >= 0 && v <= 1, 
     //is position on lineB? 
     hitsB: u >= 0 && u <= 1, 

     timeTillIntersection: v, 
    }; 
} 

및 예 :

var a = line(0, 0, 50, 50); 

var b = line(0, 50, 50, 0);    //lines are crossing 
console.log(intersection(a, b)); 

var c = line(100, 50, 150, 0);   //lines are not crossing 
console.log(intersection(a, c)); 

var d = line(100, -1000, 100, 1000); //intersection is only on d, not on a 
console.log(intersection(a, d)); 

var e = ray(100, 50, -1, -1);   //paralell to a 
console.log(intersection(a, e)); 

반환 정보를 교점을 중심으로 지나가고, 지나가는 선/광선 위에 있습니다. 당신이 라인이나 광선을 통과하는 것은 중요하지 않습니다.

에 대한 timeTillIntersection : 첫 번째 인수/레이는 현재 위치와 모션 벡터 및 두 번째 인수 그렇다면, 벽이나 v을 나타내는 어떤 공/총알/일명 timeTillIntersection 그것까지 걸리는 시간이 얼마나 결정을 나타내는 경우 이 볼은 공의 속도에 사용 된 것과 같은 단위로 벽을 가로 지르거나 (현재 조건에서) 벽에 닿습니다. 따라서 기본적으로 무료로 정보를 얻을 수 있습니다.

관련 문제