2011-08-11 36 views
4

我在查找两个PolyLines是否相交时遇到问题。如何找出两个PolyLines是否相交

那么主要目标是比较上一个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

你可以告诉你的代码正在使用从他们两个抓住x,y? – StephenT

+0

目前我没有任何代码,我只是添加了X和Y坐标的代码。我的想法是每次我想将X和Y坐标添加到集合时检查相交。问题是我错过了一些像这样的X和Y坐标:“85,113 89,116”,而我在这个集合中找不到86,114相交。 – Rumplin

+0

你的评论有点混淆......你是如何遗漏数字的?你把它们放进去。它们必须存放在某个地方。 – StephenT

回答

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; 
    } 
2

任何碰撞测试都必须在数据上完成,因为我知道Silverlight中没有魔术硬件/软件碰撞测试。

在2多义线的情况下,您需要针对其他线的每个线段(或初始者的一个或两个的简化版本)检查线的每个线段。

你可以先检查边界矩形碰撞(最小和最大的x,每个多边形的y位置做一个边框),如果他们在任何重叠,那么你需要检查的碰撞每个单独的线段。

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

This link显示了一个高层次的例子,但也有更多面向游戏的解决方案。

+0

更多面向游戏的解决方案?哪一种?我目前处于开发的初级阶段,所以我可能会切换到别的东西没有问题 – Rumplin

+0

我不得不在过去解决这个问题,所以会看看我能否找到代码,但是我在2分钟内找到了这个代码,搜索Google对于“C#快速线路交叉口”:http://thirdpartyninjas.com/blog/2008/10/07/line-segment-intersection/ –

+0

也发现这在e上与C#代码:http://stackoverflow.com/问题/ 2255842 /检出重合-子集的二个重合的线段 –

相关问题