我有 2 个整数数组用于创建多边形(看起来像一条鱼)。我需要对数组做什么才能水平翻转多边形?
x = new int[]
{ 0, 18, 24, 30, 48, 60, 60, 54, 60, 48, 30, 24, 0 };
y = new int[]
{ 0, 18, 6, 0, 0, 12, 18, 24, 24, 36, 36, 30, 36 };
x
您需要找到数组的最大值。在这种情况下,它是60
。然后将每个 x 坐标设置为60 - x
使用循环,如下所示:
for (i = 0; i < NUMBER_OF_POINTS; i++) {
x[i] = MAX_X - x[i];
}
使用此公式修改 x 坐标 x = 60 - x
我认为“翻转”的意思是让一条从左到右的鱼变成从右到左的鱼。这意味着您有效地反映了线 x=a 周围的鱼,其中 a 是鱼中点的水平坐标。在这种情况下 a=(max(x[])-min(x[]))/2。
对于每个点,我们检查它是在 x=a 的左侧还是右侧。如果它在左边,我们简单地改变它,使它现在与右边的距离相同,否则我们改变它,使它与左边的距离相同。
我认为以下(未经测试的)代码将起作用。我将所有值保留为整数,因此可能会发生轻微失真。但是调整代码应该很容易,直到失真消失。
int max_x=-1;
int min_x=Integer.MAX_VALUE;
for (int v:x){
max_x=Math.max(max_x,v);
min_x=Math.miN(min_x,v);
}
int mid=(max_x-min_x)/2;
int[] reflected_x=new int[x.length];
for(int i=0;i<x.length;i++){
int diff=Math.abs(x[i]-mid);
if (x[i]<mid) reflected_x[i]=mid+diff;
else reflected_x[i]=mid-diff;
}
您可能会发现使用图形类的 translate 和 scale 方法比操作数组内容更容易。
如果您使用的是 Point2D 抽象而不是两个整数数组,您可能会发现这要容易得多。这些不是单独的实体,它们是相关的。那么你为什么要编写代码,就好像它们根本没有关系一样呢?您的 Point 和 Polygon 类在哪里?抽象在哪里?
如果我理解您所说的水平“翻转”是什么意思,我认为您需要关于 y 轴的反射。如果这是真的,你所要做的就是改变所有 x 坐标的符号,你就完成了。
因此,具有端点 A (xa, ya) 和 B (xb, yb) 的向量变为 (-xa, ya) 和 (-xb, yb)。