2009-10-04 68 views
1

我有两个数组,我用来创建一个多边形(看起来像一条鱼)。我需要做些什么来使数组水平翻转多边形?如何通过翻转数组来翻转多边形?

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

您是否尝试过进行任何更改?如果是,他们是什么,发生了什么?如果不是,为什么不呢? – 2009-10-04 05:06:56

+0

是的,我有。我尝试翻转扭曲鱼的X轴。我尝试翻转两个什么都不做。 – 2009-10-04 05:11:12

+0

我也试过从所有x值中减去60,只是将它们反弹到60 pxs。我曾尝试从60中减去x,这似乎什么都不做。 – 2009-10-04 05:13:25

回答

10

你需要找到x阵列的最大值。在这种情况下,它是60。然后设置每一个X使用一个循环,这样的协调60 - x

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

它将鱼发送回sceen – 2009-10-04 05:17:06

+0

的其他人可能发布您的代码。 – 2009-10-04 05:17:49

+0

在玩了一些其他的东西后,这似乎是工作,代码中有另一个错误,让它跳转到屏幕的另一边。 – 2009-10-04 05:26:32

4

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

+3

这是正确的,但向OP解释他是如何得出这个答案的可能很好 – Falaina 2009-10-04 05:12:05

+1

如果OP缺乏对坐标系统的基本理解,他根本不应该做任何gfx编码。 – Bombe 2009-10-04 10:25:19

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

为什么选择投票? – MAK 2009-10-04 10:37:30

0

您可能会发现使用图形类的翻译和缩放方法而不是操作数组内容更为容易。

0

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

如果我通过水平翻转来理解你的意思,我认为你需要关于y轴的反思。如果这是真的,你所要做的就是改变所有x坐标的符号,你就完成了。因此,具有端点A(xa,ya)和B(xb,yb)的向量变成(-xa,ya)和(-xb,yb)。