2Dカプセルで「ヒット」を数学的に定義して検出する方法を学習しようとしています。2Dカプセルまたはスウィープ球の衝突検出
私は2Dサークルのヒットを定義して検出しています。ここに私のクラスがあります:
class Circle
{
private double xpos;
private double ypos;
private double radius;
public Circle(double x, double y, double r)
{
xpos = x;
ypos = y;
radius = r;
}
public bool HitCircle(double x, double y)
{
bool hit = false;
double distance = Math.Pow(x - xpos, 2) + Math.Pow(y - ypos, 2);
if (distance <= radius * radius) hit = true;
return hit;
}
}
円は、xとyの位置と半径です。 HitCircle
関数は、距離式のC#実装です。私は理解を助け、カプセルクラスのHitCapsule
関数の計算を実施する必要
class Capsule
{
double x1pos;
double y1pos;
double x2pos;
double y2pos;
double radius;
public Capsule(double x1, double y1, double x2, double y2, double r)
{
x1pos = x1;
y1pos = y1;
x2pos = x2;
y2pos = y2;
radius = r;
}
public bool HitCapsule(double x, double y)
{
bool hit = false;
//?? This is where I need help
return hit;
}
}
:
カプセルは4点と半径として定義されます。
私が理解しているように、カプセルは円のようなものですが、1点の周りに半径を持つ代わりに、線分の周りに半径を持っています。
今のところ、私はちょうどこれらの幾何学的定義のいくつかの周りに私の脳をラップしようとしています。私はこれを単純なraytracerにすることに手を差し伸べるかもしれませんが、私はこれらの数学の部分にまっすぐに行きたいと思っていました。
ありがとうございました。
これは役に立ちますが、私の2d「レイトレーサー」です。 asciiを使用して円をコンソールに描画します。私が正しく数学を実装したことを示すことは役に立ちます。
static void Main(string[] args)
{
double aimx = 30;
double aimy = 8;
Circle circle = new Circle(45, 13, 12);
bool hit = circle.HitCircle(aimx, aimy);
Console.WriteLine("Did we hit? {0}", hit);
for(int y = 26; y >= 0; y--)
{
for(int x = 0; x < 90; x++)
{
if(x == aimx && y == aimy) //Draw target
{
Console.Write("X");
}
else if(circle.HitCircle(x, y)) //Draw all circle hits
{
Console.Write("#");
}
else
{
Console.Write("-");
}
}
Console.Write('\n');
}
Console.Read();
}
}
リンクをありがとう、私はそれを今読んでいる。数学はかなりエキサイティングなように見えます。 – ekcell
あなたはまだ何も見ていません。これは衝突のより簡単な問題の1つです –
あなたが提供したリンクを使用して作業するカプセルを手に入れることができました。私はまだ数学を理解して働いていますが、確かに正しい方向です。 – ekcell