2012-07-13 3 views
4

QuadCurve2D의 두 인스턴스가 교차하는 지점 (있는 경우)을 쉽게 접근 할 수 있습니까?QuadCurve2D 쌍의 교차점 찾기

즉,이 다이어그램에서 빨간색 점의 좌표를 어떻게 계산할 수 있습니까? 이렇게하려면 QuadCurve2D에 분명한 방법이 없습니다.

Two quadratic Bézier curves (blue), approximate intersection points (red)

(참고 : 포인트는 정확하지 내가 그림을 위해 수동으로 쥐게 한과 같다는 거짓말에도 불구하고 또한 (곡선 세그먼트에 거짓말을하지 않는다 "없는"네 번째 점을 유의하십시오. 무한) 포물선)

이 두 곡선 세그먼트는 다음 코드를 사용하여 만든 :.

QuadCurve2D curve1 = new QuadCurve2D.Double(-2.00, -2.00, +0.75, +4.75, +2.00, -0.75); 
QuadCurve2D curve2 = new QuadCurve2D.Double(-2.50, -0.75, +5.50, -0.50, +0.50, +1.25); 

주 2 : 나는 또한 직선 & 이차 곡선을 교차 할 수 있도록하고 싶습니다 ,하지만이 컨트롤 포인트 중 하나를 끝점과 동일하게 설정하여 처리 할 수 ​​있다고 가정합니다.

+0

베지에 곡선을 추가했습니다. 커브가 기본 포물선처럼 보일 때도 필요합니까? – mathematician1975

+0

@ mathematician1975, 그렇습니다. 왜냐하면 입력 값이 끝점 + 제어점이기 때문입니다. – finnw

답변

4

대략적인 솔루션인지 정확한 솔루션인지 (최대 배정도까지)에 따라 다릅니다. 근사치의 경우 곡선을 몇 가지 함수로 간단히 매개 변수화 할 수 있습니다. f ( t) 그런 다음 곡선 사이의 거리를 최소화하는 t의 값을 찾기 위해 일부 간격을 중첩합니다.

정확한 해답을 얻으려면 두 개의 원뿔 곡선이 교차하는 4 개의 점을 찾아야합니다. 이 짧은 문단은 on wikipedia입니다. 책 Perspectives on Projective Geometry에는 자세한 내용을 설명하는 긴 섹션이 있습니다. 확실히 다양한 언어에 대한 구현이 가능합니다. one for Asymptote가 지금 내 마음에 온다. 그것의 general case에 대한 구현은 상당히 무서운 것처럼 보이기 때문에, 그들은 거기에서 지나치게 복잡한 것을하고 있을지도 모릅니다.

네 개의 교차점을 모두 갖게되면 QuadCurve의 끝점으로 구분 된 원뿔 곡선 부분에 어느 것이 있는지 결정해야하지만 비교하면 간단합니다. 그래서 총에, 당신은이 세 가지 단계를 것 :

    엔드 포인트 및 제어 지점에서 원뿔 곡선 부분의
  1. 계산 매트릭스
  2. 이 교차로 사이에 거짓말 여부를 결정 자신의 연필 degenerat 요소를 사용하여 원뿔 곡선 교차 끝점

이러한 단계 중 하나의 수학적 세부 사항에 문제가있는 경우 mathematics stack exchange에서 질문하는 것이 좋습니다. 사람들이 수학 문제를 해결하는 데 더 많은 경험을 할뿐만 아니라 수학을 조판하는 MathJax의 기능을 통해 여기에 제시된 해답보다 훨씬 더 쉽게 해답을 얻을 수 있습니다.

주에 관해서는 직선에 대해서 2 : 좌표계로 그 문제를 표현하면 다음과 같은 방정식 대신에 2 차 방정식으로 끝나기 때문에 훨씬 쉽습니다. 일반적인 문제에 대한 순진한 접근법, 그리고 위의 참고 문헌에 설명 된대로 해결할 경우 여전히 3 단계입니다. 원뿔 곡선과 선을 교차시키는 것이 솔루션의 한 단계 인 일반적인 방법을 쓸 수 있으므로이 방법을 사용하면 충분히 잘 작동 할 수 있습니다.

1

실용적인 접근법은 곡선을 추가하고 결과를 닫음으로써 두 개의 문자를 생성하는 것입니다. 이들의 교차점은 일부 세그먼트의 끝 점으로 모든 원래의 교차점을 가져야합니다. 따라서 결과 경로를 반복하고 베 지어 제어점을 무시하고 발생한 각 세그먼트 종점에 대해 원래 곡선에 있는지 확인하십시오.

또는 Area의 구현 방법을 살펴보고 필요에 맞게 조정할 수 있는지 확인하십시오. 라이선스에 GPL2 코드가 허용되는 경우.

+0

흥미 롭지 만 직선의 경우에는 작동하지 않을 것이라고 생각합니다. – finnw

+1

@finnw : 직선의 경우 단순히 모양을 닫으면 빈 영역이 생기므로 삼각형이나 이와 유사한 모양으로 만들려면 추가 점을 추가해야 할 것입니다. – MvG