我在查找两条PolyLine是否相交时遇到问题。
那么主要目标是将最后的X和Y与另一个PolyLine进行比较,并找出它是否正在碰撞与它相交。
由于移动X和Y,数据中存在间隙,因此大多数时候我无法在其他PolyLine中找到X和Y.
我认为我应该比较visualtree或者其他东西,而不是数据本身,但我不知道如何做到这一点。
<Canvas x:Name="LayoutRoot" Background="Black" Margin="2">
<Polyline x:Name="player3line" Stroke="GreenYellow" StrokeThickness="4" Points="146,106 141,106 136,105 131,105 126,105 121,106 116,108 112,110 108,113 104,115 100,118 96,120 92,123 88,126 84,129 80,132 77,136 74,140 72,144 69,148 67,152 64,156 " />
<Polyline x:Name="player4line" Stroke="Cyan" StrokeThickness="4" Points="85,113 89,116 93,119 97,121 102,123 107,124" />
</Canvas>
必须有一种简单的方法来检查这两者是否相交?
答案 0 :(得分:2)
必须对数据进行任何碰撞测试,因为我知道Silverlight中没有神奇的硬件/软件冲突测试。
如果是2条折线,您需要检查该线的每个线段与另一条线的每个线段(或者一个或两个的简化版本)。
您可以先检查 bounds-rectangle 碰撞(每个多边形的最小和最大x,y位置构成一个边界矩形),如果它们重叠,则需要检查每个单独的线段碰撞。
对于这种碰撞测试,没有我知道的捷径。加快检查速度只是一些技巧。
This link显示了一个高级示例,但也有更多面向游戏的解决方案。
答案 1 :(得分:1)
我想我应该搜索我点周围的所有坐标,因为笔划粗细为4。
所以我想我需要从X-2到X + 2以及从Y-2到Y + 2进行检查。
所以我这样做了,令人惊讶的是它现在有效,我承认它并不完美,但它很简单,而且现在我看不到这种方法有任何CPU峰值:
private bool CheckCollision(Point centerPoint)
{
bool functionReturnValue = false;
//wall collision
if (centerPoint.X - 1 < 0
|| centerPoint.X + 1 > (int)LayoutRoot.ActualWidth
|| centerPoint.Y - 1 < 0
|| centerPoint.Y + 1 > (int)LayoutRoot.ActualHeight)
{
functionReturnValue = true;
}
//player collision
if (!functionReturnValue)
{
foreach (var player in playerList) //all players are in this list
{
for (int i = Convert.ToInt32(centerPoint.X - 2); i < centerPoint.X + 2; i++)
{
for (int j = Convert.ToInt32(centerPoint.Y - 2); j < centerPoint.Y + 2; j++)
{
var point = new Point() { X = i, Y = j };
if (player.CoordinatePoints.Contains(point))
{
functionReturnValue = true;
goto END;
}
}
}
}
}
goto END;
END:
return functionReturnValue;
}