Java,在所需位置生成随机多边形
Java, generate random polygons in desired locations
我需要生成随机多边形以在我的游戏中用作小行星。我一直在试验,试图弄清楚如何做到这一点,但我一直无法找到 x 和 y 位置。
首先,我为多边形的每个点创建一个角度和一个长度。长度取决于小行星随机生成的大小。
asteroidData = new double[10][2];
for (int i = 0; i < asteroidData.length; i++) {
//angle
asteroidData[i][0] = Math.random()*2*Math.PI;
//length
asteroidData[i][1] = sze + Math.random()*sze/2;
}
然后因为 g.fillPolygon 需要根据角度对点进行排序,所以我这样做了..
Arrays.sort(asteroidData, new Comparator<double[]>() {
@Override
public int compare(final double[] entry1, final double[] entry2) {
if (entry1[0] == entry2[0])
return 0;
if (entry1[0] > entry2[0])
return 1;
return -1;
}
});
我在创建最终点 itself/figuring 的坐标之外的数学上有点失落。任何帮助将不胜感激。
编辑:好的,我想得更多了,使用三角函数我可以使用比率找到点的长度和宽度。但是有人知道我应该使用哪个比率吗?还有,如何区分点在哪个象限?
假设您谈论的是简单的多边形,您需要确保满足以下不变量:d = 180(n-2),其中 d 是度数,n 是边数。例如,三角形有 180 度,因为 d = 180(3-2) = 180(1) = 180.
或者,您可以只计算具有随机 x,y 坐标的 k 个点,然后将它们连接起来得到一个 k 边的多边形。尝试计算边长和角度似乎有点过分。
假设您生成的长度是与小行星原点的距离而不是边的长度,那么下面应该给出条目的 (x,y) 坐标。
// ...
double angle = entry[0];
double length = entry[1];
double x = Math.cos(angle) * length;
double y = Math.sin(angle) * length;
// ...
我需要生成随机多边形以在我的游戏中用作小行星。我一直在试验,试图弄清楚如何做到这一点,但我一直无法找到 x 和 y 位置。
首先,我为多边形的每个点创建一个角度和一个长度。长度取决于小行星随机生成的大小。
asteroidData = new double[10][2];
for (int i = 0; i < asteroidData.length; i++) {
//angle
asteroidData[i][0] = Math.random()*2*Math.PI;
//length
asteroidData[i][1] = sze + Math.random()*sze/2;
}
然后因为 g.fillPolygon 需要根据角度对点进行排序,所以我这样做了..
Arrays.sort(asteroidData, new Comparator<double[]>() {
@Override
public int compare(final double[] entry1, final double[] entry2) {
if (entry1[0] == entry2[0])
return 0;
if (entry1[0] > entry2[0])
return 1;
return -1;
}
});
我在创建最终点 itself/figuring 的坐标之外的数学上有点失落。任何帮助将不胜感激。
编辑:好的,我想得更多了,使用三角函数我可以使用比率找到点的长度和宽度。但是有人知道我应该使用哪个比率吗?还有,如何区分点在哪个象限?
假设您谈论的是简单的多边形,您需要确保满足以下不变量:d = 180(n-2),其中 d 是度数,n 是边数。例如,三角形有 180 度,因为 d = 180(3-2) = 180(1) = 180.
或者,您可以只计算具有随机 x,y 坐标的 k 个点,然后将它们连接起来得到一个 k 边的多边形。尝试计算边长和角度似乎有点过分。
假设您生成的长度是与小行星原点的距离而不是边的长度,那么下面应该给出条目的 (x,y) 坐标。
// ...
double angle = entry[0];
double length = entry[1];
double x = Math.cos(angle) * length;
double y = Math.sin(angle) * length;
// ...