Ich versuche, zufällige gleichseitige Dreiecke auf dem Bildschirm der Konsole zu produzieren.Dreiecke, die manchmal gleichseitig sind und manchmal nicht?
Die von mir verwendete Methode erstellt einen Mittelpunkt für das Dreieck (zufällig positioniert), verschiebt den Mittelpunkt zum Ursprung (0,0) und erstellt dann 3 Punkte vom Mittelpunkt (addiert den Radius (Zufallszahl) des Dreiecks zur Y-Achse jedes Punktes). Dann rotiere ich 2 der Punkte, einen bei 120 Grad und den anderen bei 240, mache ein gleichseitiges Dreieck und zeichne dann Linien zwischen den Punkten. Dann bringen Sie die Punkte zurück auf die ursprüngliche Handlung in Bezug auf den Schwerpunkt.
Dies für die Vergangenheit der Zeit funktioniert und ich bekomme ein gleichseitiges Dreieck, aber manchmal bekomme ich nicht ganz ein gleichseitiges Dreieck und ich bin völlig verloren, warum.
Ich benutze Brenshams Linienalgorithmus, um die Linie zwischen Punkten zu zeichnen.
Bild Arbeits Dreieck: http://imgur.com/GpF406O
Bild von gebrochenen Dreieck: http://imgur.com/Oa2BYun
Hier ist der Code, der die Koordinaten für das Dreieck Plots:
void Triangle::createVertex(Vertex cent)
{
// angle of 120 in radians
double s120 = sin(2.0943951024);
double c120 = cos(2.0943951024);
// angle of 240 in radians
double s240 = sin(4.1887902048);
double c240 = cos(4.1887902048);
// bringing centroid to the origin and saving old pos to move later on
int x = cent.getX();
int y = cent.getY();
cent.setX(0);
cent.setY(0);
// creating the points all equal distance from the centroid
Vertex v1(cent.getX(), cent.getY() + radius);
Vertex v2(cent.getX(), cent.getY() + radius);
Vertex v3(cent.getX(), cent.getY() + radius);
// rotate points
double newx = v1.getX() * c120 - v1.getY() * s120;
double newy = v1.getY() * c120 + v1.getX() * s120;
double xnew = v2.getX() * c240 - v2.getY() * s240;
double ynew = v2.getY() * c240 + v2.getX() * s240;
// giving the points the actual location in relation the the old pos of the centroid
v1.setX(newx + x);
v1.setY(newy + y);
v2.setX(xnew + x);
v2.setY(ynew + y);
v3.setX(x);
v3.setY(y + radius);
// adding the to a list (list is used in a function to draw the lines)
vertices.push_back(v1);
vertices.push_back(v2);
vertices.push_back(v3);
}
Wenn Sie sich die Bilder Ihrer zwei Dreiecke ansehen, sieht es so aus, als würden Sie die Dreiecke mit Pixeln zeichnen (dargestellt durch Textzeichen), um diskrete zulässige Positionen für jeden Eckpunkt zu zeichnen (entweder diese oder die nächste).) Meine Vermutung ist, dass Ihr Algorithmus zum Zeichnen der Linien irgendeine Art von Aufruf machen muss (zeichnen Sie dieses Pixel in Zeile a oder Zeile b) und die gleiche Zeile wird nicht für beide Knoten ausgewählt. Ohne weitere Details zur Implementierung sind Sie Für den Linienzeichnungsalgorithmus wäre es jedoch schwierig, das eine oder das andere zu sagen. – Tuffwer
Die Diskrepanz bei der Auswahl der Zeile, in die der Scheitelpunkt gedruckt werden soll, liegt vor, wenn der zu bewertende Höhenwert auf der Höhe der Grenze zwischen den beiden Zeilen liegt oder sehr nahe beieinander liegt und der Gleitkommafehler genau darüber liegt knapp unter. Meistens in Software, wenn das passiert, wird ein Stockwerk aufgerufen, so dass das nächste gerade unten in der nächsten Reihe endet. – Tuffwer