3

c# 中是否有任何允许碰撞检测的预定义方法?

我是 c# 的新手,正在尝试对两个椭圆进行碰撞检测 是否有任何预定义的方式可以实现碰撞检测?

我已经有绘制椭圆的代码,什么是开始碰撞检测的好方法?

private void timer1_Tick(object sender, EventArgs e)
    {
        //Remove the previous ellipse from the paint canvas.
        canvas1.Children.Remove(ellipse);

        if (--loopCounter == 0)
            timer.Stop();

        //Add the ellipse to the canvas
        ellipse = CreateAnEllipse(20, 20);
        canvas1.Children.Add(ellipse);

        Canvas.SetLeft(ellipse, rand.Next(0, 500));
        Canvas.SetTop(ellipse, rand.Next(0, 310));
    }

    // Customize your ellipse in this method
    public Ellipse CreateAnEllipse(int height, int width)
    {
        SolidColorBrush fillBrush = new SolidColorBrush() { Color = Colors.Yellow};
        SolidColorBrush borderBrush = new SolidColorBrush() { Color = Colors.Black };

        return new Ellipse()
        {
            Height = height,
            Width = width,
            StrokeThickness = 1,
            Stroke = borderBrush,
            Fill = fillBrush
        }; 
    }

这是绘制椭圆的代码,然后将其移除并出现在另一个位置。

4

4 回答 4

5

我已经测试过了,它有效,至少对我来说

在此处输入图像描述

var x1 = Canvas.GetLeft(e1);
var y1 = Canvas.GetTop(e1);
Rect r1 = new Rect(x1, y1, e1.ActualWidth, e1.ActualHeight);


var x2 = Canvas.GetLeft(e2);
var y2 = Canvas.GetTop(e2);
Rect r2 = new Rect(x2, y2, e2.ActualWidth, e2.ActualHeight);

if (r1.IntersectsWith(r2))
    MessageBox.Show("Intersected!");
else
    MessageBox.Show("Non-Intersected!");
于 2013-04-21T15:45:58.107 回答
3

会像以下工作吗?

var ellipse1Geom = ellipse1.RenderedGeometry;
var ellipse2Geom = ellipse2.RenderedGeometry;
var detail = ellipse1Geom.FillContainsWithDetail(ellipse2Geom);
if(detail != IntersectionDetail.Empty)
{
    // We have an intersection or one contained inside the other
}

Geometry.FillContainsWithDetail(Geometry)方法定义为

返回一个值,该值描述当前几何与指定几何之间的交集。

于 2013-04-21T17:01:07.793 回答
1

假设您的 Ellipses 始终是圆形(即它们的WidthHeight属性设置为相同的值)并且它们始终设置了Canvas.LeftCanvas.Top属性,则以下辅助方法会检查碰撞:

public static bool CheckCollision(Ellipse e1, Ellipse e2)
{
    var r1 = e1.ActualWidth / 2;
    var x1 = Canvas.GetLeft(e1) + r1;
    var y1 = Canvas.GetTop(e1) + r1;
    var r2 = e2.ActualWidth / 2;
    var x2 = Canvas.GetLeft(e2) + r2;
    var y2 = Canvas.GetTop(e2) + r2;
    var d = new Vector(x2 - x1, y2 - y1);
    return d.Length <= r1 + r2;
}
于 2013-04-21T16:52:42.220 回答
1

我认为你绝对应该看看XNA 框架,它有很多方法可以进行碰撞检测。

查看有关如何在 c# 中手动实现它的其他链接,它可能会有所帮助。

于 2013-04-21T16:16:44.120 回答