WPF图像碰撞检测

时间:2014-05-07 14:06:09

标签: c# wpf

我有一些检测碰撞的代码;

public bool DetectCollision(ContentControl ctrl1, ContentControl ctrl2)
{

    Rect ctrl1Rect = new Rect(
        new Point(Convert.ToDouble(ctrl1.GetValue(Canvas.LeftProperty)),
                  Convert.ToDouble(ctrl1.GetValue(Canvas.TopProperty))),
        new Point((Convert.ToDouble(ctrl1.GetValue(Canvas.LeftProperty)) + ctrl1.ActualWidth),
                  (Convert.ToDouble(ctrl1.GetValue(Canvas.TopProperty)) + ctrl1.ActualHeight)));

    Rect ctrl2Rect = new Rect(
        new Point(Convert.ToDouble(ctrl2.GetValue(Canvas.LeftProperty)),
                  Convert.ToDouble(ctrl2.GetValue(Canvas.TopProperty))),
        new Point((Convert.ToDouble(ctrl2.GetValue(Canvas.LeftProperty)) + ctrl2.ActualWidth),
                  (Convert.ToDouble(ctrl2.GetValue(Canvas.TopProperty)) + ctrl2.ActualHeight)));

    ctrl1Rect.Intersect(ctrl2Rect);
    return !(ctrl1Rect == Rect.Empty);
}

检测2个矩形何时结束。给定参数ContentControls中有图像。我想能够检测这些图像是否与rectangels相交。以下图片显示了我想要的内容;

Not Collution

that's what I want to

2 个答案:

答案 0 :(得分:2)

然后你不是在寻找矩形碰撞检测,而是实际上是像素级碰撞检测,这将是更加处理密集的。

除了已经实现的矩形碰撞检测之外,您还必须检查重叠矩形区域中两个图像的每个像素。

在最简单的情况下,如果两个重叠的像素都具有不透明的颜色,那么就会发生碰撞。

如果您想使事情复杂化,您可能需要添加阈值,例如:需要一定百分比的重叠像素才能触发碰撞;或设置像素的组合alpha级别的阈值,而不是使用任何非零值。

答案 1 :(得分:0)

您可以尝试将图像转换为几何对象,然后检查它们是否正确碰撞。但是这些图像应该是矢量图像。要将图像转换为矢量图像,您可以检查此开源project.

public static Point[] GetIntersectionPoints(Geometry g1, Geometry g2)
{
    Geometry og1 = g1.GetWidenedPathGeometry(new Pen(Brushes.Black, 1.0));
    Geometry og2 = g2.GetWidenedPathGeometry(new Pen(Brushes.Black, 1.0));
    CombinedGeometry cg = new CombinedGeometry(GeometryCombineMode.Intersect, og1, og2);

    PathGeometry pg = cg.GetFlattenedPathGeometry();
    Point[] result = new Point[pg.Figures.Count];

    for (int i = 0; i < pg.Figures.Count; i++)
    {
        Rect fig = new PathGeometry(new PathFigure[] { pg.Figures[i] }).Bounds;
        result[i] = new Point(fig.Left + fig.Width / 2.0, fig.Top + fig.Height / 2.0);
    }
    return result;
}