代码之家  ›  专栏  ›  技术社区  ›  Hamza Yerlikaya

计算精灵之间的面积

  •  0
  • Hamza Yerlikaya  · 技术社区  · 15 年前

    我正在做一个简单的二维足球游戏,当我在我的球员之间传球时,我想检查是否有任何敌人球员可以拦截球,我想做的是计算我的球员之间的坐标列表一个走廊,这样可以说,然后检查是否有敌人球员在这个地区,

    --------------------------
    S                        S
    --------------------------
    

    当它们这样躺着时,很容易计算ss之间的面积,但是当它们不对齐时,如何计算区域,

           /S /
          /  /
         /  /
        /  /
       /  /
      /  /
     / S/
    

    编辑:当我指的是区域时,我想要那个区域的坐标列表,这样我就可以根据玩家的坐标来检查这些坐标,而不是区域的大小。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    (image) http://img441.imageshack.us/img441/9051/soccer.png

    显示敌人在红线之间 : Calculate the distance 两名队员组成的阵线的敌人 (虚线) . 如果是 <= w/2 ( w 是您的“区域”的宽度) 然后敌人要么在区域内,要么在其中一个玩家的后面。

    显示敌人在橙色线之间 :要检查他是否在其中一名球员后面,只需检查他是否在后面。 between the two lines 通过其中一个球员 normal ( perpendicular )到第一行(穿过两个玩家的虚线)。

    这将告诉您敌人是否在黄色区域内:

        2
  •  1
  •   Protostome    15 年前

    为什么不旋转你的坐标系,这样两个玩家都会对齐呢? 假设你有一个固定数量的玩家(22个例子),你将他们的(x,y)坐标乘以旋转+平移矩阵,使得s1(或s2,并不重要)与其同伴对齐。

    你可以用这个简单的公式计算旋转矩阵: http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_given_an_axis_and_an_angle 进一步解释和一个好例子: http://www.quantunet.com/flash8/knowledgebase/actionscript/advanced/matrix/matrix_rotation.html

        3
  •  0
  •   eruciform    15 年前

    如果只需要近似值,并且需要快速计算,那么就可以估计出物体的“直径”(即使它是平方的),然后乘以它们中心之间的距离(每端减去1个半径,总共1个直径)。这将是非常快和非常接近。

    更新:误读了这个问题,我以为你真的想要“这个地区”。

    您仍然可以像上面那样近似它,但是确定边点作为虚圆上的点,与连接两个圆的线成90度。同样,它是近似的,但是它可以防止你计算“物体的最近边”和“与直线最接近的点”。

    更新2:

    实际上,更好的方法是:按照S1点离S2中心的距离排序。选择第二个和第三个最近的。将s2的点按它们距s1中心的距离排序。选择第二个和第三个最近的。这是4个顶点。最接近的“1”是指直接指向另一个物体的那个,所以第2和第3个是面向另一个物体的“侧面”的那个。