找到敌人和友军基地之间前线的算法?

时间:2014-08-21 18:33:57

标签: algorithm

请先看一下这张照片:Picture of battlefield

如您所见,蓝色和红色都有一条线显示前线基础。

让我们假设有两名球员开始互相对战。

一个在最左边放置一个底座,另一个放在最右边。

球员继续扩张并获得领土。

过了一会儿,双方将会面并开始战斗。

问题是,在一个随机排序的基本位置列表中,如何找到图片中绘制的两条线?

2 个答案:

答案 0 :(得分:0)

你可以得到敌人基地之间的距离,距离较短的地方是前线。

示例:

 0 1 2 3 4 5 6
0 aa A   B bbb
1 aA      B bb
2 A        B b
3 aA       B b
4 aaaA      Bb
5 aaaA       B
6 aaaA       B

如果你在同一行中减去敌人基地的X位置,它们之间距离较小的那些是前线,B.x - A.x会给你一个较小的数字b.x - a.x.然后你可以检查哪一行是给你每行的距离较小的那些。

除非我的问题出错了。

答案 1 :(得分:0)

<强>区域

  • 很多游戏都没有通过折线绘制领土边界
  • 相反,他们在每个基准位置绘制一个半径恒定(或取决于基础强度)的圆盘
  • 如果半径设置得足够大,那么这些圆盘/圆圈将重叠
  • 并创建代表受控领域的单色无缝区域
  • 很容易但不准确

周边折线

  1. 首先聚集所有碱基并创建靠近的碱基列表

    • 这可以通过使用distance <= treshold
    • 对基础进行分组来完成
  2. 处理每个小组

  3. 找到群组的最外层基地

    • 类似于周边点
    • this可能会有所帮助
    • 它还包含你的反问题,它可以解决整个问题more here
  4. 现在找到区域的周边闭环

    • 该算法也在上面的链接中
    • 完成后,将此列表用作BEZIER cubics多曲线控制点
    • 如果边界太靠近基地,那么放大点
    • 首先计算群组的平均点ap
    • 然后计算任何点p p=((p-ap)*scale)+ap
    • 这不完全,但为了您的目的,这已经足够了
    • 如果你想要更好的东西那么
    • p=p-ap
    • l=|p|
    • p=ap+(p*(l+dl)/l)
    • 其中dl是边框放大的步骤
    • 如果你想要准确的东西那么你必须计算多边形放大
    • 这不是一件容易的事。
  5. 处理边缘情况

    • 用于奇异的基组绘制圆圈
    • 这种方法在基地附近有问题
    • 一个解决方案是不要将基地计算得太靠近任何敌人基地
  6. 每像素边框

    • 您可以按像素处理地图图片
    • 这样的事情:(要注意这是未经测试的)

        每个像素
      1. 计算任何玩家基础的最小距离

        • 记住不同球员的两个最近距离
        • distance0最接近
        • distance1排名第二(但基地拥有另一名球员)
      2. 选择所有权

        • 拥有最近基地的玩家拥有此
        • 如果distance0 > treshold则此区域不受控制
        • 在这种情况下停止处理此像素
        • if ((distance0 >= d-w)&&(distance0 <= d+w)&&(distance1>d+w+s))然后将像素颜色设置为边框折线颜色
        • d是与基地的边界线距离
        • w是边线粗细的一半大小
        • s是近前线之间的最小距离
      3. 边缘案例

        • 上一步忽略更接近基地的边界点(靠近敌人基地)
        • 添加它们只需添加
        • if ((distance0<d)&&(|distance0-distance1|<=s+w)&&(|distance0-distance1|>=s-w))然后将像素颜色设置为玩家所有权
        • 如果任何两个相对的基数接近s-w
        • ,这也会失败

    [注释]

    • 我认为最好的方法是每像素
    • 它最接近您想要的解决方案
    • 渲染可能会慢一些,但只有在征服任何基础时才需要更改