Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.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
Php 计算周长值_Php_Geometry - Fatal编程技术网

Php 计算周长值

Php 计算周长值,php,geometry,Php,Geometry,我有一个矩形地图,存储为多维数组(即$map[row][col]),我必须跟踪玩家看到的方块,放在地图的任何位置 播放器可见性是圆形的,半径未知(但在运行时给定),我只需要整数解 我知道周长公式是 x^2 + y^2 <= r^2 我就是这样应用的 在这里您可以找到机器人视图:正如您所看到的,这是一个非完美圆。 我如何追踪它?顺便说一下,在这个例子中,半径^2是55,橙色的圆圈是玩家,棕色的正方形是可见的 我不知道你到底想要什么,但这里有一些东西可以帮助你。作为警告,这些都未经测试,但

我有一个矩形地图,存储为多维数组(即
$map[row][col]
),我必须跟踪玩家看到的方块,放在地图的任何位置

播放器可见性是圆形的,半径未知(但在运行时给定),我只需要整数解

我知道周长公式是

x^2 + y^2 <= r^2
我就是这样应用的


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


我不知道你到底想要什么,但这里有一些东西可以帮助你。作为警告,这些都未经测试,但逻辑是合理的

 //You mentioned circumference, this will find out the circumference but I don't 
 //think you actually need it.
 $circumference_length = 2 * $visibility_range * 3.1415;

 //Plug in the player and target coordinates and how far you can see, this will
 //tell you if the player can see it.  This can be optimized using your object 
 //and player Objects.
 function canSee($player_x, $player_y, $vision_length, $target_x, $target_y){
      $difference_x = $target_x - $player_x;
      $difference_y = $target_y - $player_y;
      $distance = sqrt((pow($difference_x,2) + pow($difference_y, 2));

      if($vision < $distance){
          return false;
      } else {
          return true;
      } 

 }

这样的函数会告诉您地图正方形是否可见(使用正方形中心的距离作为度量;如果您想以另一种方式定义可见性,可能会让事情变得更复杂):

函数是可见的($mapX,$mapX,$playerX,$playerY,$r){

return sqrt(pow($mapX-$playerX,2)+pow($mapY-$playerY,2))我认为您正在寻找Bresenham的圆绘制算法。

结构 您已经在网格中引用地形。将地形对象存储在这些网格值中。将属性应用于这些对象。请使用类似的方法进行检查

$map[$x][$y]->isVisible($player);
您需要一些方法来设置vision和测试,以检查通过的用户是否与可以看到它的用户列表相对应。在设置过程中,请在这些对象中设置其他相关方法(我看到对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(方形目标)
    • 比较时,
      radius
      应为全局可访问的静态变量
    • 您的
      Square
      对象应该能够移交其坐标。
      • target.getX()
      • target.getY()
  • 可以进行一些优化
    • 只有在正方形中时才检查圆距离
    • 仅沿
      x
      y
      轴时,不检查任何圆周距离
    • 计算出适合圆内的最大正方形,而不选中该范围内的圆形距离复选框
  • 记住,过早优化和过度优化是陷阱

解释当你说“我如何存储所有东西”时你所问的问题有很多方法来存储这个问题的信息,它们都有不同的目标。两个例子:a)每个对象都有一个它可以看到的瓷砖数组。b)一个主列表维护所有可见的瓷砖。我的例子是第二个。我有一个大数组,其中存储了所有的东西。如果我可以看到一个正方形,我就有地形值,否则它就不存在看,你可以根据给出的答案更新你的问题,或者接受一个对未来谷歌有帮助的问题吗?@Whetstone我刚刚添加了一个例子看看你的例子,问题似乎在于你的解决方案。如果你想让问题看起来更像一个圆圈,你可以增加它的表观密度直到看不出东西是基于像素的,或者你可以放弃平铺的想法,通过遮罩结果图像来显示你的结果。谢谢你的提示。我想我会使用它,但我仍然有一个相同的问题:我如何才能决定一个正方形是否可见?我必须计算玩家周围的可见区域,以一个简单的方式我不知道为什么我误读了标签,但我确实为你的PHP问题编写了Java代码。哎呀:(
function is_visible($mapX, $mapX, $playerX, $playerY, $r) {
    return sqrt(pow($mapX - $playerX, 2) + pow($mapY - $playerY, 2)) <= $r;
}
$map[$x][$y]->isVisible($player);
double diameter = circumference / 3.14159
double radius = diameter / 2 //Normally done in one step / variable
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