회선에서 충돌을 어떻게, 마우스 클릭으로 감지합니까?회선에서의 충돌 감지
저는 XNA를 사용하지 않습니다. 난 그냥 간단한 WinForms를 사용합니다. 그리고 나는 게임을 만들지 않을거야.
편집 : 브론 링크에서 솔루션을 구현하고 정말 이상한 결과가 나타납니다. 작은 조각이 있습니다. 내가 뭘 잘못하고있어? Pastebin link
회선에서 충돌을 어떻게, 마우스 클릭으로 감지합니까?회선에서의 충돌 감지
저는 XNA를 사용하지 않습니다. 난 그냥 간단한 WinForms를 사용합니다. 그리고 나는 게임을 만들지 않을거야.
편집 : 브론 링크에서 솔루션을 구현하고 정말 이상한 결과가 나타납니다. 작은 조각이 있습니다. 내가 뭘 잘못하고있어? Pastebin link
최소 거리를 포인트 인과 라인 사이 :.
http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/
자신의 일반적인 형상 섹션에서더 referenece 재질 : 내가 기억하지 않기 때문에
선형 대수학을 사용할 수 있으면 테스트 포인트에서 선분의 가장 가까운 점까지의 거리를 감지하고 싶을 것입니다.
CD의 길이를 찾고 싶습니다. AB와 CD는 수직이기 때문에 AB의 기울기는 CD의 기울기의 역수입니다. 당신은 C와 기울기를 알고 있으므로 CD의 일반적인 방정식을 찾을 수 있습니다. 그런 다음 AB와 CD의 교차점을 찾아 점 D를 얻습니다.
일단 점 D가 있으면 CD 길이를 찾는 것이 쉽지 않습니다. 이 거리가 어떤 임계 값보다작 으면, 당신은 당신이 관심있는 선분 근처에 클릭 한 알
글쎄, 나는 그것을 설명 귀찮게하지 않습니다 어떻게 작동하는지. 하지만 저는 이것을 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;
}
* 사용하지 않는 것을 알려주지 않고 * 사용하는 * 것을 * 알려주는 것이 도움이 될 수 있습니다. – Noldorin
Pastebin이 나에게 404를 올릴 예정입니다. 질문에 코드를 게시 할 이유가 없습니다. 제대로 포맷하는 것을 잊지 마십시오. –