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
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)?
90 * n dışındaki açılardan dönmek mi istiyorsunuz? – MBo
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
Böylece, günah/cos hesaplamaları yerine -1/0/1 ile bazı tablolar kurmanız daha iyi olur. – MBo