2009-10-04 33 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)。