如何通过翻转阵列来翻转多边形?

时间:2009-10-04 05:02:15

标签: java math graphics polygon flip

我有2个int数组用于创建一个多边形(看起来像一条鱼)。我需要对阵列水平翻转多边形做什么?

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 };

6 个答案:

答案 0 :(得分:10)

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

for (i = 0; i < NUMBER_OF_POINTS; i++) {
    x[i] = MAX_X - x[i];
}

答案 1 :(得分:4)

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

答案 2 :(得分:1)

答案 3 :(得分: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;
}

答案 4 :(得分:0)

您可能会发现使用图形类'平移和缩放方法而不是操纵数组内容更容易。

答案 5 :(得分:0)

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

如果我通过水平“翻转”了解你的意思,我想你想要反思y轴。如果这是真的,你所要做的就是改变所有x坐标的符号,你就完成了。

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

相关问题