1

我有 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 };
4

6 回答 6

11

x您需要找到数组的最大值。在这种情况下,它是60。然后将每个 x 坐标设置为60 - x使用循环,如下所示:

for (i = 0; i < NUMBER_OF_POINTS; i++) {
    x[i] = MAX_X - x[i];
}
于 2009-10-04T05:12:59.240 回答
4

使用此公式修改 x 坐标 x = 60 - x

于 2009-10-04T05:05:20.813 回答
1

http://en.wikipedia.org/wiki/Rotation_matrix

于 2009-10-04T05:06:04.747 回答
0

我认为“翻转”的意思是让一条从左到右的鱼变成从右到左的鱼。这意味着您有效地反映了线 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;
}
于 2009-10-04T09:24:17.457 回答
0

您可能会发现使用图形类的 translate 和 scale 方法比操作数组内容更容易。

于 2009-10-04T09:32:02.853 回答
0

如果您使用的是 Point2D 抽象而不是两个整数数组,您可能会发现这要容易得多。这些不是单独的实体,它们是相关的。那么你为什么要编写代码,就好像它们根本没有关系一样呢?您的 Point 和 Polygon 类在哪里?抽象在哪里?

如果我理解您所说的水平“翻转”是什么意思,我认为您需要关于 y 轴的反射。如果这是真的,你所要做的就是改变所有 x 坐标的符号,你就完成了。

因此,具有端点 A (xa, ya) 和 B (xb, yb) 的向量变为 (-xa, ya) 和 (-xb, yb)。

于 2009-10-04T13:02:22.947 回答