获取正多边形的坐标
Getting coordinates for regular 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
只是一个基于地图 size/2 * 0.8 的浮点数。它可能不是最好的变量名
对于 4 个点,我希望是这样的(地图宽度 100 => 半径 40,中心位于 (0|0) ):
- A(40|0)
- B(0|-40)
- C(-40|040)
- D(0|40)
编辑:事实上正如评论者所说,坐标需要有点不同,我在上面进行了更改
据我所知,你计算坐标的想法是正确的。我只能猜测你得到奇怪坐标的原因是因为你一遍又一遍地编辑同一个位置(尽管因为你只提供了部分代码片段我不能保证是这样)。
行 Location spawnPoint = mapCenter
不会创建新位置,它只会创建一个名为 spawnPoint
的引用,指向 mapCenter
.
位置的 add
方法也不会 return 一个新的 Location
实例。由于应该通过将 x 和 y 分量添加到中心位置来找到多边形的每个顶点,因此您必须 copy 或克隆 mapCenter
变量,这样您就不会 edit/change原地图中心。我假设您使用循环 create/find 多边形的每个顶点位置,并且在不复制 mapCenter
变量的情况下,会发生这种情况:
第 1 次迭代:角度为 0º,将 40
添加到 spawnPoint
的 x 坐标(这将更改 mapCenter
)并将 0
添加到 [= 的 z 坐标13=]。假设地图的中心原来在0,0,0,坐标现在是40,0,0(这还是正确的)。
第 2 次迭代:角度为 90º,将 0
添加到 spawnPoint
的 x 坐标并将 40
添加到 spawnPoint
的 z 坐标(再次更改 centerMap
,我们已经在上一次迭代中对其进行了编辑)。现在mapCenter
的坐标是40,0,40,这是不正确的。我们应该将新组件添加到 mapCenter
.
的新副本中
要解决此问题,请使用 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);
它会 return 正确的位置([40|0]、[0|40]、[-40|0]、[0|-40])。
我在基于中心的地图上有不确定数量的点。它们应该排列成多边形,所以它们的角度是 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 和 270radius
只是一个基于地图 size/2 * 0.8 的浮点数。它可能不是最好的变量名
对于 4 个点,我希望是这样的(地图宽度 100 => 半径 40,中心位于 (0|0) ):
- A(40|0)
- B(0|-40)
- C(-40|040)
- D(0|40)
编辑:事实上正如评论者所说,坐标需要有点不同,我在上面进行了更改
据我所知,你计算坐标的想法是正确的。我只能猜测你得到奇怪坐标的原因是因为你一遍又一遍地编辑同一个位置(尽管因为你只提供了部分代码片段我不能保证是这样)。
行 Location spawnPoint = mapCenter
不会创建新位置,它只会创建一个名为 spawnPoint
的引用,指向 mapCenter
.
位置的 add
方法也不会 return 一个新的 Location
实例。由于应该通过将 x 和 y 分量添加到中心位置来找到多边形的每个顶点,因此您必须 copy 或克隆 mapCenter
变量,这样您就不会 edit/change原地图中心。我假设您使用循环 create/find 多边形的每个顶点位置,并且在不复制 mapCenter
变量的情况下,会发生这种情况:
第 1 次迭代:角度为 0º,将 40
添加到 spawnPoint
的 x 坐标(这将更改 mapCenter
)并将 0
添加到 [= 的 z 坐标13=]。假设地图的中心原来在0,0,0,坐标现在是40,0,0(这还是正确的)。
第 2 次迭代:角度为 90º,将 0
添加到 spawnPoint
的 x 坐标并将 40
添加到 spawnPoint
的 z 坐标(再次更改 centerMap
,我们已经在上一次迭代中对其进行了编辑)。现在mapCenter
的坐标是40,0,40,这是不正确的。我们应该将新组件添加到 mapCenter
.
要解决此问题,请使用 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);
它会 return 正确的位置([40|0]、[0|40]、[-40|0]、[0|-40])。