c++ Bresenham ' s line algorithm draw arc und drehen
Ich bin auf der Suche Weg, um arc mit Bresenham ' s line algorithm. Diese algoritm zeichnen perfekter Kreis, aber was ist, wenn ich brauche, draw arc (von 0 bis Pi), und drehen Sie ihn um 30 Grad (zum Beispiel)?
void DrawCircle(HDC hdc,int x0, int y0, int radius)
{
int x = 0;
int y = radius;
int delta = 2 - 2 * radius;
int error = 0;
while(y >= 0) {
//SetPixel(hdc,x0 + x, y0 + y,pencol);
SetPixel(hdc,x0 + x, y0 - y,pencol);
//SetPixel(hdc,x0 - x, y0 + y,pencol);
SetPixel(hdc,x0 - x, y0 - y,pencol);
error = 2 * (delta + y) - 1;
if(delta < 0 && error <= 0) {
++x;
delta += 2 * x + 1;
continue;
}
error = 2 * (delta - x) - 1;
if(delta > 0 && error > 0) {
--y;
delta += 1 - 2 * y;
continue;
}
++x;
delta += 2 * (x - y);
--y;
}
}
InformationsquelleAutor PePe | 2011-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um 1/2 eines Kreises (pi), nur rufen Sie Ihre SetPixel-Routinen. Ihre Bogen drehbar 30 Grad erfordert einige trig. Sie könnte lassen Sie die obigen Schleife laufen, bis Ihr die x/y-Verhältnis ist gleich tan(30°), dann beginnen Sie tatsächlich zu zeichnen, bis Sie Ihr Verhältnis trifft der Wert, bei dem Sie anhalten möchten. Nicht die effizienteste Methode, aber es funktioniert. Zu bekommen ist es besser, man würde Sie brauchen, um pre-berechnen Sie Ihre Start-4 var-Werte. Sie könnte nehmen Sie die Werte aus der obigen Ausführung und schließen Sie Sie an wie die Ausgangswerte und das wäre sehr effizient.
Haben Sie den obigen Algorithmus von Michael Abrash ' s Black Book Zeug? Wenn nicht, würde ich google für das als zweiten Bezugspunkt auf die schnelle-Kreis/Bogen zeichnen.
Gut, ach, die Ellipsen, die rip-Kapitel nicht enthalten. Hier ist etwas, was ich im Internet gefunden habe, das behauptet, von Abrash:
Die Idee, Sie ziehe eine 8. der Kreis, in einer Zeit, x4 und dann drehen, um die anderen 8ths gezogen. Noch nicht direkt auf Ihre Frage zu beantworten obwohl. Arbeiten daran...
Wieder, dein code oben funktionieren sollte, brauchen Sie nur auf die Kontrolle der Start-und End-Bedingungen sorgfältig durch. Die y >= 0 werden muss, was auch immer das y wäre nach Abschluss Ihrer 'arc' in der Länge und die Start-Werte müssen berechnet werden, um den start der arc.
Ist das nicht ein geradlinig Aufgabe, mit den Dingen, wie Sie sind. Könnte nur sein, einfacher zu benutzen, eine floating-point-routine statt. Die Mathematik ist wesentlich mehr straight forward und Prozessoren neigen dazu, Sie zu behandeln, besser jetzt, als wenn diese integer-Routinen wurden gefertigt.
Ach, es war von der Grafik-Programmierung Buch in einem Kapitel nicht enthalten in dem schwarzen Buch. Ich erinnerte mich an und nahm an, es würde in der Zusammenstellung-version. Graben um auf dem Netz für Sie jetzt...
Danke, aber ich bevorzugte zu verwenden, Bresenham ' s Algorithmus.
InformationsquelleAutor Michael Dorgan
Wenn Sie nicht brauchen, sicher Bresenham, es ist eine schnelle - Schritt-Methode eingeführt in diesem post SO, wo Sie festlegen können, Mittelpunkt, Startpunkt und-Bogen-Winkel. Es braucht nicht, ein Abbruchkriterium, denn es ist bereits im Preis enthalten-Algorithmus (von Bogen-Winkel). Was macht es schnell ist, die Vorberechnung von tangentialen und radialen Bewegung, die Faktoren und die eigentliche Schleife hat keine trig-Funktion Aufrufe, nur multiplizieren, addieren und subtrahieren.
AFAIK gibt es drei Arten von Methoden:
A) Inkrementelle wie Bresenham
B) Unterteilen Sie die Methode wie diese
C) Schritt (oder segment) - Methode
Nehme ich eine langsame Beispiel für-Schritt-Methode (benutze dies nicht, wenn die Geschwindigkeit ist wichtig):
Die Langsamkeit kommt von cos und sin, die wiederholt werden (unnötigerweise) in der Schleife. Dieses Problem kann gelöst werden durch Vorberechnung von cos und sin, wie beschrieben in der oben erwähnten, SO post. Dies bedeutet einen enormen speedup (Durchschnitt 12x im top5 javascript-engines).
Machte ich einen non-full-vergleichbar speedtest von verschiedenen Kreis und Kreisbogen zeichnen-algorithmen. Der Bresenham ist schnell, aber das starten und stoppen Kriterium Logik Hinzugefügt werden müssen, verlangsamt sich der algo ein wenig. Wenn Sie wirklich brauchen, Bresenham und Bogen, ich habe keine fertige Lösung für diese und nicht gefunden wie noch. Es ist sicherlich möglich. Durch die Art und Weise, Schritt-Methode mit Hilfe von vorberechneten trigs ist nicht so schlecht in der Leistung im Vergleich zum Bresenham (in javascript zumindest). Bitte test in c++ und Bericht.
InformationsquelleAutor Timo Kähkönen