【问题标题】:How do I flip a polygon by flipping the array?如何通过翻转数组来翻转多边形?
【发布时间】:2010-12-03 16:36:17
【问题描述】:

我有 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 轴。我试过翻转两者,但什么都不做。
  • 我还尝试从所有 x 值中减去 60,这只会使它们反弹 60 像素。我试过从 60 中减去 x,这似乎什么也没做。
  • x[i] = 60 - x[i] 应该可以工作。你是什​​么意思它“什么也没做”?它到底做了什么?
  • 鱼从左向右移动,它们只是继续向右移动,没有明显变化

标签: java math graphics polygon flip


【解决方案1】:

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

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

【讨论】:

  • 它正在将鱼送回场景的另一边
  • 在尝试了其他一些似乎可以正常工作的东西之后,代码中还有另一个错误导致它跳到屏幕的另一边。
  • 啊,太好了。我喜欢虫子让鱼跳起来。
【解决方案2】:

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

【讨论】:

  • 这是正确的,但最好向 OP 解释他如何得出这个答案
  • 如果 OP 缺乏对坐标系的基本了解,他根本不应该进行任何 gfx 编码。
【解决方案3】:

【讨论】:

  • 反射和旋转是根本不同的操作。但是查找线性代数对于 OP 来说并不是一个坏主意。
  • 它不应该是旋转,它应该是 X 坐标缩放 -1 倍。
【解决方案4】:

我认为“翻转”的意思是让一条从左到右的鱼变成从右到左的鱼。这意味着您有效地反映了线 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;
}

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      如果我理解您所说的“水平翻转”是什么意思,我认为您需要关于 y 轴的反射。如果这是真的,那么您只需更改所有 x 坐标的符号即可。

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

      【讨论】:

        猜你喜欢
        • 2016-11-16
        • 2012-11-11
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 2013-09-07
        • 1970-01-01
        相关资源
        最近更新 更多