我有一些检测碰撞的代码;
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相交。以下图片显示了我想要的内容;
答案 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;
}