2009-10-03 2 views
0

회선에서 충돌을 어떻게, 마우스 클릭으로 감지합니까?회선에서의 충돌 감지

저는 XNA를 사용하지 않습니다. 난 그냥 간단한 WinForms를 사용합니다. 그리고 나는 게임을 만들지 않을거야.

편집 : 브론 링크에서 솔루션을 구현하고 정말 이상한 결과가 나타납니다. 작은 조각이 있습니다. 내가 뭘 잘못하고있어? Pastebin link

+5

* 사용하지 않는 것을 알려주지 않고 * 사용하는 * 것을 * 알려주는 것이 도움이 될 수 있습니다. – Noldorin

+0

Pastebin이 나에게 404를 올릴 예정입니다. 질문에 코드를 게시 할 이유가 없습니다. 제대로 포맷하는 것을 잊지 마십시오. –

답변

5

최소 거리를 포인트 인과 라인 사이 :.

http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/

자신의 일반적인 형상 섹션에서

더 referenece 재질 : 내가 기억하지 않기 때문에

http://local.wasp.uwa.edu.au/~pbourke/geometry/

+1

+1 '실제로 게임을 쓰지 않고도 게임을 쓰고 싶다면 지오메트리를 배우십시오'라고 말하면됩니다. –

+0

글쎄, 학교에서 광선에 대한 파라 메트릭 정의를 가르쳐 봤지만 이해할 수는 없었습니다. 이 주제에 관한 지식을 적용하십시오. – mnn

+0

그 페이지에 솔루션을 구현했지만, -64321 정도의 라인과 마우스 사이에 정말 별난 거리가 있습니다. 코드는 다음과 같습니다. http://pastebin.com/m3bf3aeac – mnn

1

선형 대수학을 사용할 수 있으면 테스트 포인트에서 선분의 가장 가까운 점까지의 거리를 감지하고 싶을 것입니다.

  • AB를 사용자의 세그먼트로 설정하십시오.
  • C를 마우스 포인트로 지정하십시오.
  • D를 선분 CD가 최소가되도록 AB 점으로 지정합니다.

CD의 길이를 찾고 싶습니다. AB와 CD는 수직이기 때문에 AB의 기울기는 CD의 기울기의 역수입니다. 당신은 C와 기울기를 알고 있으므로 CD의 일반적인 방정식을 찾을 수 있습니다. 그런 다음 AB와 CD의 교차점을 찾아 점 D를 얻습니다.

일단 점 D가 있으면 CD 길이를 찾는 것이 쉽지 않습니다. 이 거리가 어떤 임계 값보다작 으면, 당신은 당신이 관심있는 선분 근처에 클릭 한 알

0

글쎄, 나는 그것을 설명 귀찮게하지 않습니다 어떻게 작동하는지. 하지만 저는 이것을 C++로 작성했습니다 ... 1995 년입니다. 나는 단지 약 2 년 동안 코드를 작성하고 있었기 때문에 이것을하는 훨씬 더 우아한 방법이 있다는 것을 확신합니다. 어쨌든 여기에 C#으로 변환됩니다 :

static bool PointHitSegment(Point[] line, Point hitPoint, int errorMargin) 
{ 
    if (hitPoint.X >= (Math.Max(line[0].X, line[1].X) + errorMargin) || 
     hitPoint.X <= (Math.Min(line[0].X, line[1].X) - errorMargin) || 
     hitPoint.Y >= (Math.Max(line[0].Y, line[1].Y) + errorMargin) || 
     hitPoint.Y <= (Math.Min(line[0].Y, line[1].Y) - errorMargin)) 
     return false; 

    if (line[0].X == line[1].X || line[0].Y == line[1].Y) 
     return true; 

    double y1, y2, x1, x2; 
    double m, b; 
    int ny; 

    if (Math.Abs(line[0].Y - line[1].Y) <= Math.Abs(line[0].X - line[1].X)) 
    { 
     y1 = line[0].Y; 
     y2 = line[1].Y; 
     x1 = line[0].X; 
     x2 = line[1].X; 
    } 
    else 
    { 
     y1 = line[0].X; 
     y2 = line[1].X; 
     x1 = line[0].Y; 
     x2 = line[1].Y; 

     int tmp = hitPoint.Y; 
     hitPoint.Y = hitPoint.X; 
     hitPoint.X = tmp; 
    } 

    m = (y2 - y1)/(x2 - x1); 
    b = y1 - m * x1; 

    ny = (int)((m * ((double)hitPoint.X) + b) + 0.5); 

    if (Math.Abs(hitPoint.Y - ny) > errorMargin) 
     return false; 

    return true; 
}