Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定两条多段线是否相交_C#_Wpf_Silverlight_Polyline_Intersect - Fatal编程技术网

C# 如何确定两条多段线是否相交

C# 如何确定两条多段线是否相交,c#,wpf,silverlight,polyline,intersect,C#,Wpf,Silverlight,Polyline,Intersect,我无法确定两条多段线是否相交 主要的目的是比较最后一条X和Y与另一条多段线,看看它是否与之相交 由于移动X和Y,数据中存在间隙,因此大多数情况下,我无法在另一条多段线中找到X和Y 我想我应该比较visualtree或其他东西,而不是数据本身,但我不知道如何做到这一点 <Canvas x:Name="LayoutRoot" Background="Black" Margin="2"> <Polyline x:Name="player3line" Stroke="Green

我无法确定两条多段线是否相交

主要的目的是比较最后一条X和Y与另一条多段线,看看它是否与之相交

由于移动X和Y,数据中存在间隙,因此大多数情况下,我无法在另一条多段线中找到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>


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

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

如果是两条多段线,则需要对照另一条线的每条线段(或一条或两条多段线的简化版本)检查该线的每条线段

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

对于这种碰撞测试,我知道没有捷径可走。只是一些加快检查速度的技巧


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

我想我应该搜索点周围的所有坐标,因为笔划厚度为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;
    }
private bool CheckCollision(点中心点)
{
bool functionReturnValue=false;
//撞墙
如果(中心点X-1<0
||centerPoint.X+1>(内部)LayoutRoot.ActualWidth
||中心点Y-1<0
||centerPoint.Y+1>(内部)LayoutRoot.Actual高度)
{
functionReturnValue=true;
}
//球员碰撞
if(!functionReturnValue)
{
foreach(playerList中的var player)//所有玩家都在此列表中
{
对于(inti=Convert.ToInt32(centerPoint.X-2);i
你能展示一下你用来从两者中获取x,y的代码吗?目前我没有任何代码,我只有添加x和y坐标的代码。我的想法是,每次我想向集合添加X和Y坐标时,都要检查是否存在相交。问题是我缺少了一些X和Y坐标,比如这里的:“85113 89116”,我在这个集合中找不到86114相交点。你的评论有点让人困惑。。。你怎么会漏掉号码?你把它们放进去。它们必须存储在某个地方。我缺少数字,因为我画了一条一定长度的线。如果我为每个像素画一条线,运动会非常缓慢。更多面向游戏的解决方案?什么样的?我目前正处于开发阶段,因此我可能会毫无问题地切换到其他方面,我过去必须解决这个问题,所以我会看看是否能找到代码,但我在谷歌搜索“C#fast line Crossion”时在2分钟内找到了这条代码:在e上也找到了这条代码,所以使用C#code: