2017-03-08 5 views
0

Ich habe ein reguläres Polygon, das durch die x- und y-Koordinate des Mittelpunkts, die Anzahl der Seiten, die Seitenlänge und die Drehung aus der Horizontalen definiert ist. Es spuckt konsistent Null für jede Koordinate aus. Hier ist der Code:Liste der Scheitelpunkte des regulären Polygons abrufen

public Point[] getPoints() { 
    Point[] points = new Point[n]; 
    double radius = s/(2*Math.sin(Math.PI/n)); 
    double angle = (Math.PI*2)/n; 
    points[0] = new Point((int)Math.round(r),0); 
    for(int i = 1; i < n; i++) { 
     points[i] = multiplyByRotationMatrix(points[i-1],angle); 
     System.out.println(points[i]); 
    } 
    for(int i = 0; i < n; i++) { 
     points[i].x += x; 
     points[i].y += y; 
    } 
    for(int i = 0; i < n; i++) { 
     points[i] = multiplyByRotationMatrix(points[i],r); 
    } 
    return points; 
} 

private Point multiplyByRotationMatrix(Point p, double angle) { 
    if(angle==0) return p; 
    Point2D pNew = new Point2D.Float(); 
    pNew = AffineTransform.getRotateInstance(angle,p.x,p.y).transform(p, pNew); 
    System.out.println(pNew.toString() + " , " + p.x + "," + p.y); 
    return new Point((int)Math.round(pNew.getX()),(int)Math.round(pNew.getY())); 
} 

Die Rotationsmatrix Bit war eigentlich eine Rotationsmatrix an einem gewissen Punkt, aber ich änderte es Affine zu sehen, ob es funktionieren würde (es nicht). Was ist ein besserer Weg?

+0

Es scheint, dass der Wert der Elemente des 'points' aus den Variablen ist 'X' und 'y '. Was sind ihre Werte? Wo sind sie definiert? – RealSkeptic

+0

'x' und' y' werden im Konstruktor instanziiert. –

Antwort

0

Ihre AffineTransform.getRotateInstance(angle,p.x,p.y) erstellt Matrix, die Punkt um selbst dreht, so ändert sich ihre Position nicht.

Sie gehen davon aus, dass die Rotation über den Ursprung erfolgen sollte, daher können Sie die einargumentale Version von getRotateInstance verwenden.

Beachten Sie, dass Sie die Rotationsmatrix einmal erstellen und innerhalb des Zyklus wiederverwenden können.

Meiner Meinung nach, die Erzeugung von Punkten, an Umfang in einem einzigen Zyklus ist einfacher ein bisschen:

p[i].x = center_x + radius * Cos(rotation_shift + i * 2 * Pi/n) 
the same for y with Sin 
Verwandte Themen