获取正多边形的坐标

时间:2015-11-05 08:58:51

标签: math bukkit point-in-polygon

我在基于中心的地图上有无限量的积分。它们应排列成多边形,因此它们的角度为360 /点数(http://prntscr.com/8z2w3z)。我有一个中心点,一个长度和方向,所以应该可以找到这些点的坐标。当我正在使用Bukkit创建一个Minecraft插件时,添加位置的唯一方法是添加它们的坐标,所以我不能简单地给它们一个方向。这是我期望工作的代码,但没有:

        float teamAngle = angle * teamNumber;
        Location spawnPoint = mapCenter;
        float relX = (float)Math.cos(Math.toRadians(teamAngle))*radius;
        float relZ = (float)Math.sin(Math.toRadians(teamAngle))*radius;
        spawnPoint.add(new Location(Bukkit.getWorld("world"), relX, 0, relZ, 0, 0));
  • teamAngle对于每个点都是φ,因此对于4个点,它将是0,90,180和270
  • radius只是一个基于地图大小/ 2 * 0.8的浮点数。它可能不是最好的变量名称

有4分,我期待这样的事情(地图宽度100 =>半径40,中心在(0 | 0)):

  • A(40 | 0)
  • B(0 | -40)
  • C(-40 | 040)
  • d(0 | 40)
编辑:事实上,正如评论者所说的那样,coords需要有点不同,我在上面改了

1 个答案:

答案 0 :(得分:1)

据我所知,你计算坐标的想法是正确的。我只能猜测你得到奇怪坐标的原因是因为你一遍又一遍地编辑同一个位置(虽然因为你只提供了部分代码片段,所以我不能保证这样做。)

Location spawnPoint = mapCenter行不会创建新位置,只会创建一个名为spawnPoint的引用,指向mapCenter

位置的add方法也不会返回新的Location实例。由于应通过将x和y组件添加到中心位置来找到多边形的每个顶点,因此必须复制或克隆mapCenter变量,以便不编辑/更改原始的地图中心。我假设您使用循环来创建/查找多边形的每个顶点位置,而不复制mapCenter变量,这将发生:

第一次迭代:角度为0º,将40添加到spawnPoint的x坐标(这会将mapCenter更改为0并将spawnPoint添加到0的z坐标}。假设地图的中心最初为0,0,0,坐标现在为40,0,0(这仍然是正确的)。

第二次迭代:角度为90º,将spawnPoint添加到40的x坐标,将spawnPoint添加到centerMap的z坐标(再次更改mapCenter },我们已经在最后一次迭代中编辑过了。现在mapCenter的坐标是40,0,40,这是不正确的。我们应该将新组件添加到Location spawnPoint = mapCenter.clone()的新副本中。

要解决此问题,请使用public static List<Location> getPolygonVertices(float radius, int edges, Location center) { List<Location> vertices = new ArrayList<Location>(); float angleDelta = 360 / edges; // The change in angle measure we use each iteration for (int i = 0; i < edges; i++) { // For each vertix we want to find float angle = angleDelta * i; // Calculate the angle by multiplying the change (angleDelta) with the number of the edge Location corner = center.clone(); // Clone the center of the map corner.add(Math.cos(Math.toRadians(angle)) * radius, 0, Math.sin(Math.toRadians(angle)) * radius); // Add the x and z components to the copy vertices.add(corner); } return vertices; } 。示例代码:

List<Location> vertices = getPolygonVertices(40, 4, mapCenter);

您可以像这样使用此方法:

$image = "../images/accommodatie/".$row2['acco_id']."/";
$images = glob($image."*.jpg");
sort($images);
if (count($images) > 0) { 
    $img = $images[0];
    $img = str_replace("../","", $img); 
    echo "<a href='acco.php'>
    <div>
        <div>
            <img src='$img'>
        </div>";
}

它将返回正确的位置([40 | 0],[0 | 40],[ - 40 | 0],[0 | -40])。