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
- 计算出适合圆内的最大正方形,而不选中该范围内的圆形距离复选框
- 记住,过早优化和过度优化是陷阱
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