Discussion:
verständnisfragen zu buildEdgelist(), buildActivelist()
(zu alt für eine Antwort)
Sebastian300
2003-11-29 23:07:14 UTC
Permalink
hab folgende verständnisfragen:

1. in builEdgeList(): es heißt edgelist[v2[Y]-1].insert(...) bzw.
edgelist[v1[Y]].insert(...) und nicht edgelist[i].insert(...) wie ich
schon mehrmals im forum gelesen hab, oder?

2. an den betreffenden stellen im edglist[]- array müssen ja zumindest
zwei edges dranhängen, ansonsten kann die for-schleife in fillScan ja
nicht funktionieren. wenn ja: wo wird das gemacht? wenn nicht wie
funkt das sonst?

3. die activelist sollte doch die zwei (oder mehr) edges mit den
jeweiligen xIntersect Werten in der jeweiligen scan-linie enthalten,
oder? Ich seh bei dem algo aus dem buch 2.auflage aber nicht, wo das
gemacht wird. für mich sieht das so aus, als würden da einfach die
edgelist[scan] edges auf die activelist umkopiert werden.

bin dankbar für jede hilfe
Chris Chiu
2003-11-30 01:06:54 UTC
Permalink
Post by Sebastian300
1. in builEdgeList(): es heißt edgelist[v2[Y]-1].insert(...) bzw.
edgelist[v1[Y]].insert(...) und nicht edgelist[i].insert(...) wie ich
schon mehrmals im forum gelesen hab, oder?
Das kommt darauf an, was du mit i meinst. Ich nehme an du meinst die
Laufvariable i, die von 0 bis numVertex durchläuft. Der Index von edgelist[]
bedeutet aber die Scanline, und nicht den Vertex. Jede Scanline speichert
eine Liste von Edges, und es gibt genauso viele Scanlines wie es vertikale
Pixel im Canvas gibt.
Post by Sebastian300
2. an den betreffenden stellen im edglist[]- array müssen ja zumindest
zwei edges dranhängen, ansonsten kann die for-schleife in fillScan ja
nicht funktionieren. wenn ja: wo wird das gemacht? wenn nicht wie
funkt das sonst?
Die Objekte sind alle geschlossene Objekte (letztes Vertex wird mit erstem
verbunden). Dadurch gibt es nur "innen" und "außen", wobei "innen" gefüllt
wird. Der Scanline-Fill-Algorithmus bewerkstelligt eben genau das.
Post by Sebastian300
3. die activelist sollte doch die zwei (oder mehr) edges mit den
jeweiligen xIntersect Werten in der jeweiligen scan-linie enthalten,
oder? Ich seh bei dem algo aus dem buch 2.auflage aber nicht, wo das
gemacht wird. für mich sieht das so aus, als würden da einfach die
edgelist[scan] edges auf die activelist umkopiert werden.
Jede edgelist[scan] enthält eine Liste der Edges, die in genau dieser
Scanline mit dem Index "scan" beginnen.
activelist enthält die gegenwärtig aktiven Scanlines.
Beim Durchlauf durch die Scanlines werden die Edges der aktuellen Scanline
in die gegenwärtige activelist hinzugefügt (eventuell schon vorhandene, noch
aktive Edges bleiben ja drin, also wird die EdgeList nicht wirklich einfach
nur kopiert (mal abgesehen davon, dass insert() die Edges in einer
bestimmten Sortierung einfügt).
Danach werden in activelist.update() jene Edges, die bei dieser Scanline
aufhören (also deren yUpper kleiner oder gleich der aktuellen scanline
sind), wieder entfernt.
Dadurch wird activelist ständig upgedatet und enthält immer jene Edges, die
sich mit der aktuellen Scanline überschneiden.

mfg,
Christoph
***@cg.tuwien.ac.at
Philip Kügler
2003-11-30 01:10:51 UTC
Permalink
Post by Sebastian300
1. in builEdgeList(): es heißt edgelist[v2[Y]-1].insert(...) bzw.
edgelist[v1[Y]].insert(...) und nicht edgelist[i].insert(...) wie ich
schon mehrmals im forum gelesen hab, oder?
Also ich habe nicht den Index (also den Beginn) der Scanline geändert,
sondern das Ende (Also das yUpper). Prinzipiell geht es aber in die
umgekehrten Richtung genauso. Aber zu deiner Frage: Ja
Post by Sebastian300
2. an den betreffenden stellen im edglist[]- array müssen ja zumindest
zwei edges dranhängen, ansonsten kann die for-schleife in fillScan ja
nicht funktionieren. wenn ja: wo wird das gemacht? wenn nicht wie
funkt das sonst?
Das wurde in einem anderen Post bereits angesprochen ("Umrisse der
2D-Atoffs"). Also Linien (die ja nur einen Eintrag in EdgeList ergeben)
werden gar nicht gezeichnt. Das ist auch richtig so.
Post by Sebastian300
3. die activelist sollte doch die zwei (oder mehr) edges mit den
jeweiligen xIntersect Werten in der jeweiligen scan-linie enthalten,
oder? Ich seh bei dem algo aus dem buch 2.auflage aber nicht, wo das
gemacht wird. für mich sieht das so aus, als würden da einfach die
edgelist[scan] edges auf die activelist umkopiert werden.
Die eingetragenen Edges bleiben ja auch in activelist drinnen, bis sie
entfernt werden. Das macht in diesem Framework CG1Edgelist.update() und
CG1Edgelist.resort() für dich. Update inkrementiert auch den aktuellen
intersect Wert um slope. Also fleißig update nach jeder Iteration
aufrufen ;-)
Post by Sebastian300
bin dankbar für jede hilfe
Hoffe geholfen zu haben,
Philip

Loading...