4

我很难确定两条折线是否相交。

那么主要目标是将最后一个 X 和 Y 与另一个折线进行比较,并找出它是否与它发生碰撞,也就是相交。

由于移动 X 和 Y,数据中存在间隙,所以大多数时候我在其他折线中找不到 X 和 Y。

我想我应该比较视觉树或其他东西而不是数据本身,但我不知道如何做到这一点。

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

必须有一种简单的方法来检查这两者是否相交?

4

2 回答 2

2

必须对数据进行任何碰撞测试,因为我知道 Silverlight 中没有神奇的硬件/软件碰撞测试。

在 2 条折线的情况下,您需要检查线的每一段与另一条线的每一段(或一个或两个的简化版本作为初学者)。

您可以首先检查边界矩形碰撞(每个多边形的最小和最大 x,y 位置构成一个边界矩形),如果它们完全重叠,则需要检查每个单独的线段是否存在碰撞。

我知道这种碰撞测试没有捷径可走。只需几个技巧即可加快检查速度。

此链接显示了一个高级示例,但也有更多面向游戏的解决方案。

于 2011-08-11T21:33:02.937 回答
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;
    }
于 2011-08-13T15:18:00.847 回答