加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 计算周长值

发布时间:2020-12-13 22:32:28 所属栏目:PHP教程 来源:网络整理
导读:我有一个矩形地图,存储为多维数组(即$map [row] [col]),我必须追踪玩家看到哪些方块,放在这张地图上的任何位置. 玩家可见性是圆形的,半径未知(但在运行时给出)我只需要整数解. 我知道周长公式是 x^2 + y^2 = r^2 但我怎么能存储一切? 我需要这些值,因为那时
我有一个矩形地图,存储为多维数组(即$map [row] [col]),我必须追踪玩家看到哪些方块,放在这张地图上的任何位置.

玩家可见性是圆形的,半径未知(但在运行时给出)我只需要整数解.

我知道周长公式是

x^2 + y^2 <= r^2

但我怎么能存储一切?
我需要这些值,因为那时我可以“揭示”地图方块.

最好的是多维数组(即__ $sol [x] [y] __).
这是我正在使用的一段代码.它没有得到纠正,因为它假设视觉是正方形而不是圆形.

计算平方

$this->vision_offsets_2 = array();
//visibility given as r^2
$mx = (int)(sqrt($this->viewradius2));

$mxArr = range($mx * -1,$mx + 1);
foreach ($mxArr as $d_row)
{
    foreach ($mxArr as $d_col)
    {
         $this->vision_offsets_2[] = array($d_row,$d_col);
    }
}

这是我如何应用它

foreach($player as $bot)
    {
        foreach($visibility as $offset)
        {
            $vision_row = $offset[0] + $bot[0];
            $vision_col = $offset[1] + $bot[1];

            if(isset($map[$vision_row][$vision_col]))
            {
                if( $map[$vision_row][$vision_col] == UNSEEN) {
                    $map[$vision_row][$vision_col] =  LAND; }
            }
        }
    }

在这里你可以找到机器人视图:你可以看到一个非完美的圆圈.
我该如何追踪?顺便说一下,在这个例子中,半径^ 2是55,橙色圆圈是玩家,棕色方块是可见的.

解决方法

结构体

您已经在网格中引用了地形.将地形对象存储在这些网格值中.将属性应用于这些对象.检查类似的东西

$map[$x][$y]->isVisible($player);

你需要一些方法来设置视觉和测试,以检查通过可以看到它的用户列表传递的用户.当你在它时,在这些对象中设置其他相关方法(我看到对land … isLand()和isWater()的引用可能?).

您甚至可以在对象内部进行视觉级联,这样您只需要移动用户的位置,并且该对象负责触发所有代码以将附近的地块设置为可见.

数学

我们给予周长.

double diameter = circumference / 3.14159
double radius = diameter / 2 //Normally done in one step / variable

现在我们必须知道两点之间的距离来比较它.让我们使用map [4] [7]和map [3] [9].

int x0 = 4;
int y0 = 7;
int x1 = 3;
int y1 = 9;

double distance = Math.sqrt(
        Math.pow(x0 - x1,2) + 
        Math.pow(y0 - y1,2)
        );

System.out.println(distance); //2.23606797749979

测试距离>半径.

测试每个方块

>将上述方法放在一个方法中:visibleFrom(Square target)

> radius在比较时应该是一个全局可访问的静态变量.
>您的Square对象应该能够移交其坐标.

> target.getX()
> target.getY()

>可以进行一些优化

>只有当它们在广场上时才检查圆形距离.
>纯粹沿x轴或y轴时,不检查任何圆形距离.
>找出适合圆圈内部的最大正方形,而不是检查该范围内的圆形距离.

>请记住,过早优化和过度优化是陷阱.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读