2D胶囊或扫掠球体的碰撞检测

时间:2017-04-25 15:54:57

标签: c# raytracing

我正在尝试学习如何在2D胶囊上以数学方式定义和检测“命中”。

我正在定义和检测2D Circle上的命中。这是我的班级:

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#实现。

胶囊定义为4个点和半径:

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;
    }
}

我需要帮助理解和实现胶囊类中HitCapsule函数的数学运算。

据我了解,胶囊就像一个圆圈,除了在一个点周围有一个半径,它有一个围绕线段的半径。

现在我只想尝试围绕其中一些几何定义。我可能会尝试将此变成一个简单的光线跟踪器,但我想直接看到这些数学部分。

感谢。

我不知道这是否有用,但这是我的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();
    }
}

1 个答案:

答案 0 :(得分:1)

指向胶囊交叉点是计算点到定义胶囊的线段的距离的情况。如果那个&lt; = r那么你就相交了。

There's a question here that shows how to find that distance,但它确实熟悉矢量和点积。