wie eine Line zeichnen ?
-
Hallo.
Seit ungefahr 2 Wochen versuche ich ein Problem zu lösen.
Wie kann man eine Linie von Punkt A(x1,y1) zum Punkt B(x2,y2)
Dabei habe ich versucht die koordinaten für jeden einzelnen Punkt der, die Linie bildet einfach mit hilfe der Funktion y=a*x+b zu berechnen.
Ich berechne a und b wie folgt:a=(y1-y2)/(x1-x2) b=y/(a*x)
Dann benutze ich eine for(..){..} Schleife um punkt für punkt die Linie zuzeichnen.
Es funktioniert leider nicht für alle möglichen koordinate.
Leider komme ich nicht darauf wie wird dieses Problem in allen Grafikprogramen, in den man eineLinie zeichnen kann, gelöst. Internetsuche hat leider auch keine Ergibnise gebracht.Meine Frage ist also:
Weiss jeman wie soll man hier vorgehen um ein Linie von A nach B zu zeichnen ?
Hat jemand vielleicht so was schon mal gemacht ?
Oder kann mir jemand eine hilfreiche Internetadresse nennen ?Danke im Vor-aus.
-
Am Einfachsten ist es, wenn du einfach die Länge der Linie definierst.
Beispielsweise die Breite des Bildschrims.Anschließend berechnest du jeden einzelnen Pixel zwischen den beiden Endpunkten.
x = x1 + (x2-x1) * (Schritt/Pixelanzahl)
y = y1 + (y2-y1) * (Schritt/Pixelanzahl)das ganze dann in einer for - schleife die Schritt von 0 bis Pixelanzahl zählt.
das ist definitiv die programmtechnisch kürzeste Möglichkeit, allerdings auch die mit Abstand langsamste..
-
jemand hat mal ords honeurs abgestaubt, indem er ohne gleitkommarechnung (also nur diskret) linien zeichnen konnte: google mal nach bresenham line algorithm. der ist echt klasse
-
jo. aaaber den hab ich immer nur so halb verstanden *gg* hab mich auch nie wirklich mit befasst..
-
lies nochmal rein. für linien ist er wirklich nicht schwer. und superschnell
das problem bei der diskreten version (also pc-version mit pixeln) ist ja, wann muss ich eins rauf, oder wann bleib ich in der gleichen zeile. genau da setzt bresenham an, und überprüft jedes mal anhand einer prüfgröße, ob er in der gleichen zeile bleibt, oder nach oben/unten muss
-
Danke für die antworten.
Ich vielleicht komme ich mit euren Tips weiter.
-
Ok ich habe jetzt eine Funktion gefunden die mit dem bresenham-algorithmus zuverlässig linien von A nach B zeichnet. Ich weiss nicht ob das ins Mathematik-Forum passt aber ich poste hier mal den Code. Vielleicht hilft das jemandem.
Der orginal Code war für VB, ich kenne zwar VB nicht, aber der Code war auf Anhieb verständlich und ich habe es in für C/C++ umgeschrieben und es funktioniert.int drawline(int x1,int y1,int x2,int y2) { int laenge,hoech,d,ix,iy,dd,id; laenge = x2 - x1; hoech = y2 - y1; d = 0; if( laenge < 0) { laenge = laenge*(-1); ix = -1; } else { ix = 1; } if (hoech < 0) { hoech = hoech*(-1); iy = -1; } else { iy = 1; } if( laenge > hoech) { dd = laenge + laenge; id = hoech + hoech; do { /*Hier mit einer entsprechenden Grafikfunktion die einzelnen Pixel zeichnen*/ /*Variablen x1,y1 sind die Koordinaten der Pixel*/ if (x1 == x2) {break;} x1 = x1 + ix; d = d + id; if (d > laenge) { y1 = y1 + iy; d = d - dd; } }while(1); } else { dd = hoech + hoech; id = laenge + laenge; do { /*Hier mit einer entsprechenden Grafikfunktion die einzelnen Pixel zeichnen*/ /*Variablen x1,y1 sind die Koordinaten der Pixel*/ if (y1 == y2) {break;} y1 = y1 + iy; d = d + id; if (d > hoech) { x1 = x1 + ix; d = d - dd; } }while(1); } return 0; }
Die Grafik-funktion die die, die Pixel zeichnen soll ist von System und Libraris die werwendet werden abhängig. Deshalb habe ich im Code keine konkrete Funktion angegeben.