2013-09-02 2 views
0

원과 선이 교차하는지 확인하는 방법을 구현하려고합니다. 나는 this 코드 (답변에 따라 고정)를 가장 많이 사용했으며 Point의 코드를 Vector2f의 's 대신 약간 수정했습니다.C에서 원과 선분 충돌 #

이 내가 무엇을 현재 : 그것은 this 알고리즘과 일치 보이는

private bool CircleLineIntersect(int x, int y, int radius, Point linePoint1, Point linePoint2) { 
      Point p1 = new Point(linePoint1.X,linePoint1.Y); 
      Point p2 = new Point(linePoint2.X,linePoint2.Y); 
      p1.X -= x; 
      p1.Y -= y; 
      p2.X -= x; 
      p2.Y -= y; 
      float dx = p2.X - p1.X; 
      float dy = p2.Y - p1.Y; 
      float dr = (float)Math.Sqrt((double)(dx * dx) + (double)(dy * dy)); 
      float D = (p1.X * p2.Y) - (p2.X * p1.Y); 

      float di = (radius * radius) * (dr * dr) - (D * D); 

      if (di < 0) return false; 
      else return true; 
     } 

, 그래서 문제가 무엇인지 확실하지 않다.

누군가가 지침을 제공 할 수 있다면 많은 도움이 될 것입니다.

편집 :

정확하게 계산되지 않는 것 같습니다. 예를 들어, 입력 x = 1272, y = 1809, 반경 = 80, linePoint1 = {X = 1272, Y = 2332}, linePoint2 = {X = 1272, Y = 2544} 교차점 (y + radius 선분의 y 값보다 작음) 함수가 true를 반환합니다.

+0

무엇이 문제입니까? 이 코드는 어떤 방식으로 원하는 것을 수행하지 않습니까? – Aron

+0

@Aron 올바르게 계산되지 않는 것 같습니다. 예를 들어, 입력 x = 1272, y = 1809, 반경 = 80, linePoint1 = {X = 1272, Y = 2332}, linePoint2 = {X = 1272, Y = 2544} 교차점 (y + radius 선분의 y 값보다 작음) 함수가 true를 반환합니다. – Brad

답변

1

테스트 케이스에 오류가 있습니다. 교차 할뿐만 아니라 선이 원의 중심을 통과합니다. 선은 세로선 (X = 1272)입니다. 귀하의 서클 중심을 중심으로 (1272, 1809). ERGO는 중심을 통과합니다.

아마 당신은 수학에서 라인과 라인 세그먼트라는 용어 사이에 오해가있을 것입니다.

+0

라인이 아닌 라인 세그먼트를 테스트하는 함수가 필요합니다. 선 대신 세그먼트를 테스트하도록 변경할 수있는 것이 있습니까? 아마도 교차점이 선분 내에 있는지 테스트 할 것입니까? – Brad

+0

교차점이 선분 안에 있는지 테스트하기 위해 코드를 추가했는데 올바르게 작동하는 것처럼 보입니다. (얼마나 효율적인지는 모르겠지만). – Brad

+0

이 코드에 UnitTests를 추가하는 것이 좋습니다. – Aron