如何在线检测碰撞,最好是点击鼠标?
我不使用XNA。我只使用简单的WinForms。我不会创造一个游戏。
编辑:我从brone链接实现了解决方案并得到了非常奇怪的结果。这是一个小片段。我做错了什么? Pastebin link答案 0 :(得分:5)
答案 1 :(得分:1)
如果您能够使用线性代数,那么您将需要检测从测试点到线段上最近点的距离。
您想要找到CD的长度。由于AB和CD是垂直的,你知道AB的斜率是CD斜率的倒数倒数。你知道C和斜率,所以你可以找到CD的一般方程。然后,找到AB和CD的交点,给你点D。
一旦你得到D点,找到CD的长度是微不足道的。如果此距离 小于某个阈值,则表示您已经点击了您感兴趣的线段附近。
答案 2 :(得分:0)
好吧,我不打扰解释它,因为我不记得它是如何工作的。但是我用C ++写了这个......呃... 1995-ish。我确信有更优雅的方法可以做到这一点,因为我当时只编写了大约两年的代码。无论如何它在这里转换为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;
}