2016-03-21 23 views
0

Mein Programm ist ein Polar-Grafikfenster. Mein Problem ist, dass wenn ich r=a*sin(b*theta) grafisch darstelle. Mein spezifisches Beispiel, das unten gezeigt wird, benutzt a=12 und b=8. Wenn ich den Punkt eine Verbindung zum nächsten gezogen bekomme ich etwas zeigen unter:Verbinden von Polardiagrammkoordinaten

Polar Graph

Die Linien über die Blütenblätter gezeichnet zu sein scheinen, die wunderbar aussieht, ist aber nicht richtig. Unten ist der Code, um die Punkte und Linien zeichnen:

for(int i=0; i< ptr.size(); i++){ 
     drawPoint(g2d, ptr.get(i), ptt.get(i)); 
     if(connectPoints && i!=ptr.size()-1){ 
      g.drawLine((int)(origin_x+Math.cos(ptt.get(i))*ptr.get(i)*ppp), 
        (int)(origin_y-Math.sin(ptt.get(i))*ptr.get(i)*ppp), 
        (int)(origin_x+Math.cos(ptt.get(i+1))*ptr.get(i+1)*ppp), 
        (int)(origin_y-Math.sin(ptt.get(i+1))*ptr.get(i+1)*ppp)); 
     } 
} 

ptr enthält die r-Werte und ptt enthält die Theta-Werte. Hier ist die Zeile, die die Punkte hinzufügt:

for(double i=0; i<100; i+=0.1){ 
     pg.plot(12*Math.cos(8*i), i); 
} 

Warum passiert das? Wie kann es behoben werden? Danke im Voraus!

Antwort

1

Sie durchlaufen den Kreis mehr als einmal und Ihre Beispielpunkte sind nicht bei jedem Durchgang gleich. Deshalb bekommen Sie Linien, die über die Blütenblätter schneiden. Versuchen Sie:

double numberOfSteps = 1000; 
double stepSize = 2.0 * Math.PI/numberOfSteps; 
for(double i=0; i<numberOfSteps; i++){ 
    double theta = i * stepsize; 
    pg.plot(12*Math.cos(8.0 * theta), theta); 
} 

Experimentieren Sie mit numberOfSteps zu Feinabstimmung.

+0

Danke, dass für dieses Beispiel gearbeitet hat. Das Zeichnen der Punkte erfolgt zwar in einer Testklasse für das Polargraphing-Fenster. Gibt es eine Möglichkeit, dies zu beheben, ohne die Anzahl der Schritte zu kennen und nur eine Liste von Punkten zu haben? – Dando18

+0

@ Dando18 Die schnelle Antwort ist _yes_. Die Implementierung hängt davon ab, welchen Teil des Codes Sie ändern können. Meine ursprüngliche Idee war es, eine Klasse 'PolarCoordinate' zu ​​erstellen, die sowohl' r' als auch 'theta' enthält. Sie sollten wahrscheinlich sicherstellen, dass "0 <= Theta <2 * Math.PI". Legen Sie diese in die Liste und sortieren Sie die Liste nach 'Theta'. Dann können Sie sie plotten. – bradimus

+0

Ich löste es, indem ich 'theta% = 2 * Math.PI' hinzufüge, bevor ich den Punkt zur Liste hinzufüge, Ihre Antwort führte mich dazu aber so danke! – Dando18