samedi 9 mai 2015

Konstruieren eines 31-Eck

Hey Leute, wie die Überschrift schon sagt, habe ich das Problem ein 31-Eck zu konstruieren, das am Ende des Durchlaufens wieder am Ursprung rauskommt. Mein 31-Eck bildet keinen "gesamten Kreis", dh. kurz bevor es das Ende erreicht hat, stoppt die Turtle. Dies kommt ja vor, da ein Aufrundungsfehler beim Winkel vorliegt bzw. da der Winkel keine ganzzahlige Zahl ist. Der Winkel für ein 31-Eck beträgt ja ca. 11,163 Grad. Beim 30-Eck gibt es schließlich keine Probleme, da der Winkel eine ganzzahlige Zahl ist, nämlich 12 Grad.
Jetzt ist meine Frage, wie man ein 31-Eck programmieren kann, damit man am Ende wieder am Ursprung erscheint.
Ich habe nur 2 Lösungswege erklärt bekommen. Beide funktionieren bei mir nicht. Ich weiß leider nicht, woran das liegen kann. ???:L
Der erste Lösungsweg soll heißen: "Std.out.println("epsilon1 = " + epsilon1);" Da die von uns bereitgestellte turtle-Klasse intern mit dem Datentyp double arbeitet,kann man natürlich auch eine Methode für das Umlaufen eines Vielecks mit den Datentypen "double" für alle Winkel ( dh. auch ε1 ) schreiben und damit beider bisher nicht genau aufgehenden Division zu exakten Ergebnissen kommen.
Der zweite Lösungsweg: Zuweisungen von Gleitpunktzahlen an Variablen vomTyp Ganzzahl k¨onnen nur durch explizites Notieren der Anpassung imQuelltext vorgenommen werden (z.B.: float a = 12.567; int x = (int)a;).Ein solches type-casting wird erzielt durch Voranstellen des umklammertenTyps vor den Variablennamen des anzupassenden Wertes.
Beide habe ich ausprobiert, siehe unten. Vielleicht kann mir ja einer sagen, wo der Fehler ist.
Danke im Voraus :)

1.Lösungsweg:

import eip.*;


public class TA2_5
{


static TurtleScreen ts;
static Turtle t;


public static void cpolygon(int n, double r)
{
int k = 31;
t.pd();
t.fd(120);
t.rt(180 - 90 * (k - 2)/k);
for (int i = 0; i < k; i++)
{
double e = 2 * 120 * Math.sin((180/k)*(Math.PI/180));
double epsilon1 = 360/k;
t.fd(e);
t.rt(epsilon1);
}
t.pu();
// ("state transparent")
}


public static void main(String[] args)
{
ts = new TurtleScreen(0,0,1000,1000);
t = new Turtle( ts );
t.setX(400); // startposition at x=400, y=300
t.setY(300);
cpolygon(10,10);
}
}



2. Lösungsweg:

import eip.*;


public class TA2_6
{


static TurtleScreen ts;
static Turtle t;


public static void cpolygon(int n, double r)
{
int k = 31;
t.pd();
t.fd(120);
t.rt(180 - 90 * (k - 2)/k);
for (int i = 0; i < k; i++)
{
double e = 2 * 120 * Math.sin((180/k)*(Math.PI/180));
t.fd(e);
float a = 360/k;
int x = (int)a;
t.rt(x);
}
t.pu();
// ("state transparent")
}


public static void main(String[] args)
{
ts = new TurtleScreen(0,0,600,600);
t = new Turtle( ts );
cpolygon(10,10);
}
}


Konstruieren eines 31-Eck

0 commentaires:

Enregistrer un commentaire