View Full Version : [PROBLEM] - Bsp 4. fillScan()
Hier bekomme ich die aktive Liste der Kanten für diese Scanlinie und verarbeite alle Kanten in einer do-while-schleife.
CG1Edge hat ein Attribut dxPerScan. Das ist also nur dx. In den Kantentabellen sollen wir aber die Kanten mit folgenden Elementen speichern oder:
(ymax, xmin, dx/dy)
Hier entspricht ymax:yUpper, xmin:xIntersect, aber was ist mit dx/dy?
Oder speichere ich in den Tabellen nicht dx/dy (also 1/m) sondern nur dx?
Aber ich brauch ja in den Berechnungen dy auch. :confused:
Was versteh ich wieder nicht richtig?
Matthias
30-10-2004, 14:31
Hier bekomme ich die aktive Liste der Kanten für diese Scanlinie und verarbeite alle Kanten in einer do-while-schleife.
CG1Edge hat ein Attribut dxPerScan. Das ist also nur dx. In den Kantentabellen sollen wir aber die Kanten mit folgenden Elementen speichern oder:
(ymax, xmin, dx/dy)
Hier entspricht ymax:yUpper, xmin:xIntersect, aber was ist mit dx/dy?
Oder speichere ich in den Tabellen nicht dx/dy (also 1/m) sondern nur dx?
Aber ich brauch ja in den Berechnungen dy auch. :confused:
Was versteh ich wieder nicht richtig?
dxPerScan ist dx/dy, das musst du also beim buildEdgelist speichern.
dxPerScan ist dx/dy (...) Okay, aber im Algorithmus muss ich bei jeder Inkrementierung von scan line den counter um den Wert dx erhöhen oder, und dann muss ich schauen, ob dieser Wert größer gleich dy geworden ist. D.h. ich muss auch auf dx und dy einzeln zugreifen können. Wie mach ich das aber, wenn ich nur "dx/dy" in der Tabelle gespeichert hab?
Das ist genau das, was ich noch nicht durchblickt hab...
Matthias
30-10-2004, 16:11
Okay, aber im Algorithmus muss ich bei jeder Inkrementierung von scan line den counter um den Wert dx erhöhen oder, und dann muss ich schauen, ob dieser Wert größer gleich dy geworden ist. D.h. ich muss auch auf dx und dy einzeln zugreifen können. Wie mach ich das aber, wenn ich nur "dx/dy" in der Tabelle gespeichert hab?
hm, nein, das musst du eigentlich nicht machen. Schau dir in der Klasse CG1EdgeList die Methode "update" an, dort ist genau das bereits implementiert, d.h. um das Rauslöschen von Edges musst du dich selbst gar nicht kümmern.
Was du machen musst, ist, in drawClipped die scanlines durchgehen, jedes Mal eine neue activeEdgelist aufbauen, falls diese nicht leer ist, fillScan aufrufen und dann am Ende noch diese Liste updaten und ein resort machen.
Im Update werden alle Edges, bei denen yUpper < scanline ist gelöscht.
Alles klar?
Ich glaub ich versteh's jetzt.
edgelist [] bauen: kein Problem
Alle scan lines bis zum ersten Index, wo edgelist nicht mehr null ist skippen, dort anfangen die scan lines durchzugehen: kein Problem.
Für jeden Durchgang activelist bilden, je nach innen/außen, diese scan line füllen: kein Problem.
Dann update() aufrufen (zum Eliminieren aus der activelist falls notwendig und zur Berechnung der nächsten xIntersect).
Dann resort() aufrufen, für den Spezialfall, dass sich Kanten schneiden.
... bis activelist leer ist ...
Danke. Hab ich jetzt eh alles richtig verstanden?
Matthias
30-10-2004, 16:34
ja, sieht gut aus :)
was meinst du mit "bis activelist leer ist"?
ich skizziere noch einmal grob den aufbau von drawClipped:
edgelist bauen
schleife über alle scanlines
- activelist für diese scanline bauen
- falls activelist nicht leer ist
- fillScan
- activelist updaten, resort
- falls activelist leer ist -> nichts machen, in der schleife zur nächsten scanline gehen
bis activelist leer hab ich mir gedacht, denn sobald activelist einmal leer wird, kommt sicher nichts mehr oder? Können wir nicht schon aufhören?
Wird diese ganze Prozedur nicht für jedes Polygon einzeln aufgerufen?
Matthias
30-10-2004, 16:49
bis activelist leer hab ich mir gedacht, denn sobald activelist einmal leer wird, kommt sicher nichts mehr oder? Können wir nicht schon aufhören?
Wird diese ganze Prozedur nicht für jedes Polygon einzeln aufgerufen?
stimmt, gute Optimierung! Ja, die Prozedur wird für jedes Polygon aufgerufen.
Super, dann müsste alles passen bei mir (ich hoff mal)
Eine weitere Optimierung ist auch die, dass wir am Anfang die scan lines einfach überspringen, bis edgelist [] anfängt.
Danke für Hilfe
es reicht wenn du die scanlines von ymin bis ymax des polygons laufen lässt ... scanfilled und flatshadet sind somit fast so schnell wie wireframe ...
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.