2016-04-12 21 views
0

6x6 matrisim var, anahtar noktaları G ve boş noktalar tire olarak. (O en L'ler bu soruya alakasız. Sol üstteki yan ve üst ve tire genelinde sayılar sadece eksenleri etiket unutmayın.)Bir matris temeline dayalı 2B nokta dönüşü

// Original Matrix 
-
0 ----G- 
1 ----L- 
2 ----L- 
3 ----L- 
4 GOOOL- 
5 ------ 

aşağıdaki iki yöntemi kullanarak, ben Yukarıdaki matrisi sola 90 derece döndürmek mümkün.

public static void transpose(int[][] m) { 
    for (int x = 0; x < m.length; x++) { 
     for (int y = x; y < m[0].length; y++) { 
      int temp = m[x][y]; 
      m[x][y] = m[y][x]; 
      m[y][x] = temp; 
     } 
    } 
} 

public static void swapRows(int[][] m) { 
    for (int i = 0, k = m.length - 1; i < k; ++i, --k) { 
     int[] x = m[i]; 
     m[i] = m[k]; 
     m[k] = x; 
    } 
} 

satır aşağıdaki matris içinde sonuçlar aktarılması, ardından satırları Değişim. kodda

// Rotated -90° Matrix // Rotated 180° Matrix 
--
0 ------     0 ------ 
1 GLLLL-     1 -LOOOG 
2 ----O-     2 -L---- 
3 ----O-     3 -O---- 
4 ----O-     4 -O---- 
5 ----G-     5 -G---- 

(180 derecelik bir dönüş Aşağıdaki açıklama için dahil edilmiştir), ayrıca java.awt.Point -G noktalarının konumunu kaydetmek olan bir ArrayList'in sahiptir. Matris döndükten sonra, bu noktalar güncellenmelidir. G noktası için diziyi tarayabilirim, ancak her bir nokta ArrayList'te aynı dizini tutmalı ve taranmadan, orijinal matriste ilk noktanın indeksinde kalmayacağının garantisi yoktur. 90 Derece veya 180 Derece matrisinde ilk nokta ile aynı endeks.

public ArrayList<java.awt.Point> keyPoints = new ArrayList<>(); 
keyPoints.add(new Point(0, 4)); 
keyPoints.add(new Point(4, 0)); 

ait ArrayList için

Şu anda noktaları dönüş için yerinde bu yöntemi var.
Aşağıdaki denklemi temel alır. 90 ° için ben arıyorum çıkış

olmasına rağmen

Point: (4.00, 0.00) 
Point: (0.00, -4.00) 

aşağıdaki gibi 90 derecelik dönüşü için

Matrix Rotation Equation

for (int i = 0; i < keyPoint.size(); i++) { 
    Point p = keyPoint.get(i); 
    double angle = Math.toRadians(-90); 
    double cos = Math.cos(angle); 
    double sin = Math.sin(angle); 
    double x = (p.x * cos) - (p.y * sin); 
    double y = (p.x * sin) + (p.y * cos); 
    keyPoint.set(i, new Point((int) x, (int) y)); 
    System.out.printf("Point: (%.2f, %.2f)\n", x, y); 
} 

, Şu anda alıyorum çıkışı

Point: (0.00, 1.00) 
Point: (4.00, 5.00) 

Uygulama hakkında verebileceğiniz öneriler var mı? for döngüsümden, (eğer daha iyi bir çözüm yoksa)?

+0

90 * n dışındaki açılardan dönmek mi istiyorsunuz? – MBo

+0

Tüm döndürmeler 90 * n'dir. Matris kurulumumdan dolayı, 90 * n dışındaki rotasyonların mümkün olduğuna inanmıyorum. – Hidden14

+0

Böylece, günah/cos hesaplamaları yerine -1/0/1 ile bazı tablolar kurmanız daha iyi olur. – MBo

cevap

0

Koordinat kaynağı (0,0) hakkında dönüş için denklemler kullandınız.

Eğer keyfi merkezine (cx, cy) etrafında dönmek istiyorsanız (sizin durumunuzda matrisin ortasında, bence), sonra denklemler şunlardır:

x' = cx + (x-cx) * Cos(theta) - (y-cy) * Sin(theta) 
y' = cy + (x-cx) * Sin(theta) + (y-cy) * Cos(theta) 

Düzenleme:
için başka bir yöntem yoktur matrisi dönüştürebilirsiniz: Verilen: F koordinatını (x, y) yeni koordinat (x ', y') eşleştiren F fonksiyonu F
Belirli bir hedef için (x ', y'), tersi işlev G=Inverse(F)'u bul kaynak koordinatlar (x, y) Matris koordinatları için yürüyün i, j
Element[i,j]
i i',j' = G(i,j)
kopyalama Element[i',j'], j i dönene kadar 'i'j için
tekrarlayın koordinatları Bul ekstrakte edin, J
kopyalama son bir yerde

için Element[i,j] ekstre edilmiştir (4 ya da 2 devir) meydana gelir Örnek: dikey eksenle ilgili yansıtma

G(x,y) = (n-1-x, y) 
extract R=A[0,0] 
G(0,0) = n-1,0 
copy A[n-1,0] to A[0,0] 
G(n-1,0) = 0,0  //start coordinate reached 
copy R to A[n-1, 0] 
do the same for all x<n/2 
İlgili konular