できればマウスクリックで、オンラインで衝突を検出するにはどうすればよいですか?
私はXNAを使用していません。私は単純な WinForms を使用しています。そして、私はゲームを作成していません。
編集:私はブローネ リンクからソリューションを実装し、本当に奇妙な結果を得ました。ここに小さなスニペットがあります。私が間違っていることは何ですか?Pastebin リンク
できればマウスクリックで、オンラインで衝突を検出するにはどうすればよいですか?
私はXNAを使用していません。私は単純な WinForms を使用しています。そして、私はゲームを作成していません。
編集:私はブローネ リンクからソリューションを実装し、本当に奇妙な結果を得ました。ここに小さなスニペットがあります。私が間違っていることは何ですか?Pastebin リンク
線形代数を使用できる場合は、テスト ポイントから線分上の最も近いポイントまでの距離を検出する必要があります。
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;
}