PDA

View Full Version : Allgemeine Fehlerbehebung


leobasil
01-12-2002, 19:09
so! da ich langsam den überblick verlier, und das forum da schon ziemlich aufgeblasen wird, start ich mal einen thread zur allgemeinen fehlersuche. dann muss ich nicht immer herumsuchen, ob irgendwas shcon wo gepostet wurde. Vielleicht kann ich euch auch dazu überreden, eure diversen meldungen da reinzuschreiben :coolsmile

also fang ich gleich mal an:

im prinzip kompiliert schon mal alles, aber mit meiner nullpointersuche bin ich jetz gerade bei
for (int i=(int)p1.xIntersect; i<(int)p2.xIntersect; i++)
angelangt.... da soll ein nullpointer drin sein, aber ich hab p1 und p2 vorher initialisert. allerdings nur mit "dummywerten" weil ich noch nicht weiss was da letztendlich wirklich reinkommt:
CG1Edge p1 = new CG1Edge(scan,1,1);
CG1Edge p2 = new CG1Edge(scan,1,1);

jetz die frage: liegts daran dass ich das nur mit dummywerten ausgefüllt hab, oder überseh ich da irgendwo irgendwas ?

und 2. mit was werden die edges jetzt initialisiert ? muss ic hda auch wieder was herumrechnen? wenn ja wie? bzw. mit welchen variablen ?

DancingComet
01-12-2002, 19:15
also bei mir schaut das so aus:

CG1Edge p1,p2;
int i;
p1 = active.getHead();

while(p1 != null){
p2 = p1.next;

for(i=(int)(p1.xIntersect+0.5);i<(int)(p2.xIntersect+0.5);i++)
canvas.setPixel(i,scan,this.color);

p1 = p2.next;

}

ich führe das setPixel usw. also nur dann aus, wenn es auch ein p1 gibt

gck
01-12-2002, 19:21
An der Stelle kriegst eine NullPointerException, wennst ungerade viele Kanten in der Active List hast, und das kann aufgrund der schwachen Implementierung von yPrev im Code vom Buch bei **** Polygonen schon passieren...

Lösung -> für yPrev keine Variable verwenden wie im Buch, sondern eine yPrev() Funktion schreiben, ähnlich der yNext()...

leobasil
01-12-2002, 19:27
@DancingComet: ich hab haargenau das gleiche ... trotzdem nullpt.

@gck: und was soll die funktion dann machen?
also was wäre der uinterschied wenn ich

yPrev=(int)pts[cnt-2][Y];

oder eine eigene funktion die das retourniert schreib ?
...und wieso hängt das davon ab ob active gerade oder ungerade viele kanten hat ?

leobasil
01-12-2002, 19:33
aber die theorie scheint richtig zu sein, denn jenachdem was ich reinlad, bekomm ich entwerder an crash (wahrscheinlich endlosschleife) oder nulpointer

asterix
01-12-2002, 19:45
Hi,

ich habe nach dem p2 = p1.next;
folgende Abfrage eingebaut:

p2 = p1.next;
if (p2 != null) {
for (int i=(int)p1.xIntersect;........

leobasil
01-12-2002, 20:01
irgendwie versteh ich den teil nicht so ganz ... entweder es wird sofort null (bei indy z.B.) oder überhaupt net => endlosschleife...
was mich verwirrt, is das ich zuerst p2=p1.next, und 3 zeilen später p1=p2.next schreib... kann das stimmen ?

leobasil
01-12-2002, 20:20
würde so eine funktion ca. so aussehen dass ich einfach alle j=0 durch j=cnt und j++ durch j-- ersetze, und sonst gleich lasse ?

leobasil
01-12-2002, 20:43
hmm... irgendwie krieg ich die fn nicht ganz hin....

protected int yPrev(int k, int cnt, double[][] pts)
{
int j;
if ((k+1)<(cnt-1))
j=k+1;
else j=0;
System.out.println(k);
System.out.println(j);
while(pts[k][Y]==pts[j][Y])
{

if ((j+1)<(cnt-1))
j=cnt;
else j--;
}
return ((int)pts[j][Y]);
}

so schauts bei mir aus, passt aber nicht oder ?

leobasil
01-12-2002, 21:00
im build active werden p1 und p2 ja als pointer initialisiert ... ich hab die aber einfach nur als CG1edge und nichtmal mit einem konstruktor initialisiert macht das was ? wenn ja wie lös ichs ?

wjsus
01-12-2002, 21:37
also, ich hab das problem der NullPointerException in folge ungerader kantenanzahl in der activelist jetzt folgendermaßen gelöst (zusätzlich zur yPrev funktion): das polygon wird ganz normal zwischen den ersten beiden kanten der activelist aufgefüllt, danach wär, bei beispielsweise drei kanten insgesamt, nur mehr eine übrig und eine nullpointer exception die folge. ich nehm dann einfach nochmal die zweite kante her und füll zwischen der und der dritten auf.... bin mir allerdings net sicher ob das wirklich zulässig is, dachte mir das ises vielleicht aufgrund der definitionen von "inside-outside"......
protected void fillScan(CG1NewCanvas canvas)
{
CG1Edge p1, p2;

//alist.print();
p1 = alist.getHead();
while(p1 != null)
{
p2 = p1.next;
if(p2 == null)
{
p2 = p1;
p1 = p1.prev;
}
for(int i = (int) p1.xIntersect; i < (int) p2.xIntersect; i++)
{
canvas.setPixel(i, scan, color);
}
p1 = p2.next;
}
}
mal kucken was die kollegschaft dazu meint.....

leobasil
01-12-2002, 22:11
heul ! langsam verzweifel ich .... nein, bin ich eh shcon längst, aber ... ich zeichne auf ein CG1NewCanvas im fillscan und drawclipped.... aber woher kommt das ? ich bekomm ja nur anzahl, vertex tables und farbe..... wenn ichs neu definier, hab ich eine neue zeichenplatte, und die prozeduren von object aus aufrufen geht ah net, weils protected sind

gck
01-12-2002, 22:51
also, leobasil, deine yPrev() Funktion macht nicht sehr viel Sinn. Ich würde gern den Sourcecode dazu posten, aber das ham die von der Übungsleitung net so gerne, deshalb nur:

1) Wo "wrappst" du in der Liste herum, wenn du durch bist und das VORHERGEHENDE Y anschaust? Wohl an der Stelle 0 zurück nach anz-1, oder? Und nicht so wie in yNext(), da gehst du ja in die ANDERE Richtung durch!

2) Tja, wo kann hier eine Endlosschleife passieren (btw, die kann in der Implementierung von yNext() ausm Buch auch passieren...): schau mal, was passiert, wenn du ein Polygon durch den Code schickst, bei dem alle Vertices denselben Y-Wert haben (kann ja z.b. bei der Projektion und DeviceKoord. Umrechnung durch "Runden" schon passieren...)!

3) Du hast nur ein Canvas, das wird nicht für jedes Polygon neu erzeugt...

leobasil
01-12-2002, 23:22
grr... ich hab jetz meine ganze yPrev gelöscht und neu geschrieben, und sie schaut wieder genauso aus...
gehen wirs mal anders an: die funktion soll die nächstvorhergehende nichthorizontale linie zurückgeben oder ?
und zwar von k aus gesehen.
das heisst .... zuerst kommt mal diese standard überprüfung ob k > der anzahl von punkten ist. (warum das +1 und -1 ist mir zwar nicht ganz klar, aber egal) falls jetzt also k > cnt, dann ist in meinem fall jetzt j=k, weil ich ja jetzt von k nach unten wandere, daher nicht 0 so wie um next. sollte k aber kleiner sein, dann.... WAS????.... mom.... also k is der index..... cnt die anzahl der ... vertexes die das polygon hat. ... was hat das damit zu tun, auf welchem ah... k is der index der vertexes ?....das heisst dann, dass.... ok, k muss kleiner sein, ansonsten J=0 quasi als fehler (?). so. ansonsten ist j=k... ;
whil bleibt ja gleich, da ändert sich ja nix.... weiter... if... wenn also ...j+1>cnt-1 das heisst ... wenn ..das wird jetz umgestellt... wenn jetz j < is als nein... das is jetz sowieso kleiner... das muss aber grösser als 0 bleiben, weil..... sonst....falsch, also if (j<1) dann .... is j ... = 1.... nein 0... oder ? glaub schon... so.... und wenns nicht so is, dann wird j -- also um eines reduziert, und ich check nochmal auf horizontalität. dann noch das return das bleibt auch gleich... so wieder vergleichen mit originalcode von der FN.

ok, das schaut jetz bissl anders aus. ich sollt in zukunft immer komentieren, was mir gerade durch den kopf geht *gg*

also das wird jetz getestet. danke für hilfe, und wenn ich immer noch an denkfehler hab, plz tell me.
ansonsten flame me 4 this stupid post. !



PS: DAS MUSS NICHT GELESEN WERDEN UND DIENTE MEHR MIR SELBST MEINEM GEDANKENGANG ZU FOLGEN :)

sollts trotzdem wer lesen, und sich ärgern selbst schuld :)

leobasil
01-12-2002, 23:27
so endlosschleife, wahrscheinlich weil am schluss nicht j=0 sondern j=k sein muss

leobasil
01-12-2002, 23:39
super, irgendwas herumgemurxt, jetz hab i wieder das array OFB ... aber wahrscheinlich eh besser das, als a endlosschleife :)

leobasil
01-12-2002, 23:52
so, ausis. Game Over ... seit donnerstag mit kurzen pausen durch-CG-n is mir zviel....

ich hisse die weisse Fahne vor der überlegenen CGübung und komm aus meinem cyber-Bunker gekrochen.

......gute nacht....

leobasil
02-12-2002, 11:58
findet jemand da drin einen grund für eine endlosschleife ?

CG1Edge p1,p2;
p1=active.getHead();
while(p1 != null)
{
System.out.println("bla");
p2=p1.next;
System.out.println(p1.xIntersect);
System.out.println(p2.xIntersect);
for (int i=(int)(p1.xIntersect); i<(int)(p2.xIntersect); i++)
{
canvas.setPixel (i, scan, color);
}
p1=p2.next;
}

leobasil
02-12-2002, 11:59
irgendwie scheinen p1 und p2 nicht weiter zu wandern, aber warum ? passt die initialisierung nicht ? oder schaut das eher nach einem fehler im buildactive aus ?

RS250
02-12-2002, 12:36
Hi,

kann mir mal wer sagen wie der Aufruf von dem ScanFilledPolygon in object ausschaut?

wolk
02-12-2002, 12:40
CG1Polygon irgendwas = new CG1ScanFilledPolygon(n,v,col);

irgendwas.draw(c);

und zwar dort wo Todo 4 steht

Filz
02-12-2002, 12:46
Beziehungsweise mit IF-Statement


if (wf==1)
{
CG1ScanFilledPolygon p1 = new CG1ScanFilledPolygon(n, v, col);
p1.draw(c);
}

damit es nur zeichnet, wenn scanned filled ausgewählt ist.

wolk
02-12-2002, 12:52
naja, da hast du allerdings recht,

aber dann zeichnet er bei den anderen füllarten gar nichts hin, nicht einmal das wireframe

was ist jetzt richtig oder falsch ?

RS250
02-12-2002, 13:11
Cool danke!

ich hab da, warum auch immer eine Schleife eingebaut ghabt!

Übrigens steht das eh im else Statemen!

RS250
02-12-2002, 13:38
und was soll dann in drawClipped in ScanFilledPolygon stehn???

gck
02-12-2002, 14:42
1)
@Filz: Die Abfrage, ob wir im scanfilled oder wireframe modus sind, ist eh schon im code, da gibts das if (wf == 0), dann mach wireframe, und im else Zweig steht dann das TODO für Bsp4, denke also nicht, dass man deine IF-Abfrage zusätzlich braucht...
Obwohls mich wundert, dass wird grad bei wf == 0 im Wireframe Modus sind, ich dachte, wf steht für wireframe und sollte true sein, wenn wir nur Linien wollen... Halt nur eine Benennungssache, aber irgendwie deppert....

Original geschrieben von leobasil
grr... ich hab jetz meine ganze yPrev gelöscht und neu geschrieben, und sie schaut wieder genauso aus...
gehen wirs mal anders an: die funktion soll die nächstvorhergehende nichthorizontale linie zurückgeben oder ?


Ja.


und zwar von k aus gesehen.
das heisst .... zuerst kommt mal diese standard überprüfung ob k > der anzahl von punkten ist.


wieso sollte k-1 > der anzahl an Punkten sein (außer du rufst mit einem sinnlosen k auf)?? Wir gehen ja jetzt in die andere Richtung, d.h. k-1 kann kleiner 0 werden, das ist, worauf du aufpassen musst!!!


(warum das +1 und -1 ist mir zwar nicht ganz klar, aber egal)


Naja, +1 heißt nach "vorne" im Array gehen, -1 nach hinten, das ist doch eh klar!

Ok, weiter kann ich deinem Post jetzt nicht wirklich folgen.

Machma einen Kompromiss, da ich ja nicht komplette Code posten darf: Ich geb dir den Teil, der in die While-Schleife kommt, als Gerüst, d.h. nur, was prinzipiell passiert, es kann aber immer noch zu Endlosschleifen kommen...


while(blah blah blah)
if ((j-1) < 0)
j = (anz-1);
else
j--;



Sodala, daran kannst du jetzt leicht erkennen, wie der Teil vor und nach der While-Schleife ausschauen muss, was das Argument der while Schleife ist, ist eh klar, und ich hab keinen kompletten Code gepostet -> alle sind glücklich.

Wegen der Endlosschleife, die in yPrev() und auch yNext() auftreten kann, sag ich nur folgendes Polygon (frei erfunden):

v1: (20, 5)
v2; (12, 5)
v3; (29, 5)

Viel Glück noch beim Lösen...

leobasil
02-12-2002, 15:03
THX 4 help so far everyone....

wie rennt das eigentlich mit dem canvas ?
ich machs jetz so, dass im scannFilled.. ein neues canvas objekt erstellt wird, und das dann an fillScan und drawClipped übergeben wird..... aber irgendwie zeichnet er nix... hängt das damit zusammen, dass ich das objekt selbst erstell, und nicht von irgendwo anders bekomm ?
aber wie und von wo sollt ichs bekommen ?

leobasil
02-12-2002, 15:35
AAAAAAAAAAAAAAAHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!!!!! !!!!!!

MEIN ERSTES VISUELLES ERGEBNIS !!!! EIN GEFILLTER WÜRFEL !!!

ICH ZUCK AUS !!! hat zwar noch a paar macken, ein paar acanlinien an den ecken werden zu lang in bestimmten rotationsstellungen

aber ... das geht irgendwie saulangsam... kann das sstimmen ?
ich mein mit dem würfel hab ich ca. 0.002 FPS wenn ich den indy reinlad krieg ich ein array OFB, und den kampfjet da, da brauchta fast eine minute bis der fertig gefilled is

gck
02-12-2002, 15:35
natürlich kriegst du nix, wenn du immer wieder irgendein Canvas erzeugst und ein Polygon drauf malst... wie bist du bitte auf diese Idee gekommen??

Das Canvas, auf das zu zeichnen sollst, ist das, das der Methode draw() aus CG1Object.java übergeben wird, und das du wiederum an das draw() von CG1ScanFilledPolygon übergeben sollst...

leobasil
02-12-2002, 15:39
hmm... ich hab jetz für scanfilledpoly noch einen zusätzlichen parameter eingebaut, sodass ich c von object (= canvavs von object) übergeben wird und im scanfilledpoly dann die anderen (fillscan und drawclipped) mit diesem canvas aus object aufgerufen wird.... dadurch seh ich jetz was, aber ich denk mal, dass das nicht ganz korrekt ist oder ? es müsste doch ohne diese übergabe von canvas an scanfilledpoly gehen... aber ... die beiden anderen methoden, die ein canvas bekommen müssen das doch irgendwie kriegen oder ?

Filz
02-12-2002, 16:02
Original geschrieben von gck
@Filz: Die Abfrage, ob wir im scanfilled oder wireframe modus sind, ist eh schon im code, da gibts das if (wf == 0), dann mach wireframe, und im else Zweig steht dann das TODO für Bsp4, denke also nicht, dass man deine IF-Abfrage zusätzlich braucht...
Obwohls mich wundert, dass wird grad bei wf == 0 im Wireframe Modus sind, ich dachte, wf steht für wireframe und sollte true sein, wenn wir nur Linien wollen...
Viel Glück noch beim Lösen...

Naja, hab mir gedacht, da vor der geschwungen Klammer so ein schönes

// if (...)

steht, könnte man ruhig was reinschreiben.

und die Variable wf steht nur dafür, welcher von den Radio-Buttons gerade ausgewählt ist, also 0-wireframe, 1-scan filled, 2-flat shaded, 3-Goa'uld, 4-Phong

Nachdem wir 2-4 noch nicht implementiert haben, sollte das eher schwarz bleiben.

Wie gesagt, ist das kleinste Problem bei dem Beispiel :)

Shade
02-12-2002, 16:12
weiss jemand was heirmit falsch ist:
protected void makedgeRec(int lower[],int upper[],int yComp,CG1Edge edge,CG1EdgeList edges[])

{edge.dxPerScan=
(double)((upper[x]-lower[x]))/(upper[y]-lower[y]));
......
ich krieg da ne meldung das ein";" fehlt...

tschurlo
02-12-2002, 16:17
Ich denk, da sind einfach nur ein paar Klammern zuviel.
Probiers mal so:
(double)(upper[x]-lower[x])/(upper[y]-lower[y]);

lg

RS250
02-12-2002, 16:28
kann mir vielleicht trotzdem wer sagen was in drawClipped in ScanFilledPoly reinghört?

Ich steh da irgendwie schwerstens an!

oder zumindest das was ich hab funkt nicht wirklich :-))

Biddee

Filz
02-12-2002, 16:35
drawClipped ist die Methode, die im C-Algorithmus mit scanFill beschrieben ist:


also

EdgeList initialisieren;
buildCG1EdgeList;

für alle Zeilen von 0 bis 512
{ActiveList bauen, Füllen, ActiveList updaten und neuordnen}

RS250
02-12-2002, 16:44
Danke, das hilft :-)

gck
02-12-2002, 16:45
ganz zu Beginn sollte man die Polygone auch noch mit clip() (aus der 2ten Runde) clippen, oder man baut das Clipping Linie für Linie in scanFill ein, also nur zeichnen, wenn x,y größer 0 und kleiner 512 (oder was auch immer) sind...

Nur irgendein Clipping muss auf jeden Fall rein.

leobasil
02-12-2002, 16:53
filz bist du sicher ??
is das nicht CG1ScanFilledPolygon ??

und wenn du sicher bist, was IST dann in CG1ScanFilledPoly ?

Filz
02-12-2002, 16:56
Also meiner Meinung nach werden die Polygone automatisch geclippt, und zwar mit der Funktion Draw in CG1Polygon

public void draw(CG1NewCanvas canvas)
{
clip(canvas);
if (anz > 0)
drawClipped(canvas);
}

Wenn man danach nur mit den Werten clipped[][] arbeitet, funktioniert es.

leobasil
02-12-2002, 17:09
momentaner status : er zeichnet alles halbwegs schön, aber ich bekomm seltsame scanlines (siehe anhang)

das im anhang is a extrembspl. normal gehen die ca. 5-20 pixel über die polygonkanten hinaus.

und indy und das uBoot erzeugen ein array OFB aber interessanterweise im polygon.clip .... wofür ich ja garnet zuständig sein sollt ...

irgendwer irgendeine idee ?

gck
02-12-2002, 17:12
Ups, hab übersehen, dass draw() schon in der VaterKlasse implementiert ist!
Ja ok, dann braucht man sich nimmer explizit um das clipping kümmern...

leobasil
02-12-2002, 17:26
CG1ScanFilledPolygon hugo = new CG1ScanFilledPolygon(n, v, col,c);
hugo.draw(c);

ist alles was bei mir in object steht, wobei ich net glaub, dass das richtig is, weil ich da das c (=canvas) bei scanFilled selbst dazugeschrieben hab, und das ja eigentlich nicht nötig sein sollte... aber wie ruf ich sonst meine funktionen ab, und übergeb ihnen gleichzeitig das canvas ?

leobasil
02-12-2002, 17:29
hat sich (glaub ich) erledigt ... ich ruf einfach hugo.drawclipped auf,... hab dacht das würd net gehen, weils protected is, aber probieren geht übers studieren

gck
02-12-2002, 17:39
na geh, jetzt hamma doch grad festgestellt, dass in draw() das Clipping gemacht wird, wieso rufst jetzt drawClipped() direkt auf??

leobasil
02-12-2002, 17:44
hmmm... wo/wie findet das clipping genau statt ? kommt das in die object vorm initialisieren, oder danach ? oder überhaupt in die fillscanbla... ? ...und wie wirds aufgerufen? cann ich einfach.... äm... *heul*

...Desperens sum !

leobasil
02-12-2002, 17:47
HÄ ? ... ich mein... wie bitte ?
also ... ich initialisier zuerst einmal meine scanfillusw. zB. hugo und dann .. ruf ich nur noch hugo.draw() auf ???

gck
02-12-2002, 17:48
hmm...

schau doch einfach ein paar Posts weiter oben nach, da hat der Filz die draw-Methode aus CG1Polygon hingeschrieben...

Falls dus erklärt haben willst:
draw() clippt das Polygon mittels des Line Clipping Algorithmus, den ma in Runde 2 geschrieben haben. Dann wird geschaut, ob vom Polygon noch was da ist, dann wird drawClipped aufgerufen, was du in CG1ScanFilledPolygon definieren sollst (i.e. drawClipped ist abstrakt in CG1Polygon definiert, das bedeutet, dass erbende Klassen die Methode noch beinhalten müssen...)

leobasil
02-12-2002, 17:50
wenn ich das so mach, wird aber (bei mir) nicht geclipped

RS250
02-12-2002, 17:53
Ok, das mit dem draw(C) is klar, das ruft dann eh drawClipped auf, aber:

wenn ich die Pixel für jede Scanline setzt, dann muss ich das ja auch irgendwie clippen, bzw muss ich die activList für das geclippte Polygon machen???

leobasil
02-12-2002, 17:55
aha... es clipped zwar, aber nur die flächen, die VOLLSTÄNDIG ausserhalb liegen... das heisst ein polygon das zur hälfte draussen liegt wird nicht geclipped, sondern in der "nächsten Zeile" weitergezeichnet... das führt dann logischerweise zu einem arrayOFB wenns unten oder oben überlappt
aber wie kann denn das sein dass polys nur geclipped werden, wenn sie ganz draussen liegen ?

gck
02-12-2002, 17:55
schau: du schreibst in CG1ScanFilledPolygon.java einfach eine Methode drawClipped() rein, die sich darum kümmert, dass aus den Punkten in clipped[][] ein schönes, ausgemaltes Polygon gezeichnet wird.

Dann rufst du aus CG1Object.java von deinerv ScanFilled Klasse das draw() auf, das clippt jetzt und ruft seinerseits wieder das drawClipped() aus, das das geclippte Polygon zeichnet...

leobasil
02-12-2002, 18:01
ach verdammt, ich glaub langsam komm ich hin ... ich ruf also draw auf. das clipped, und ruft dann drawclipped auf ... ok. aber die vertexlite v[][] wird ja schon beim initialisieren übernommen, also besteht die aus ungeclippten vertexes.....und ... meine drawClipped will da immer noch reinzeichnen, solange das polygon nicht komplett ausserhalb liegt, und daher nichtmal mehr aufgerufen wird... aber wie bekommt jetzt meine drawClipped die gelippten vertexes ?

leobasil
02-12-2002, 18:03
clipped !!

AAHHH!!! ok... jetz muss ich also pts umstellen von double auf int ... dann könnts passen THX !

gck
02-12-2002, 18:04
bitte lies die posts ein bisserl genauer, ich hab doch eh grad geschrieben, dass das clipped[][] array die geclippten Punkte enthält...

leobasil
02-12-2002, 18:32
ja ich habs eh gelesen, sonst wär ich ja nicht draufgekommen, thx nochmal ! aber da das forum net in echtzeit funst, seh ich die meisten posts immer erst nach 10 minuten, wenn ich wieder mal aktualisier *g*

aber JETZ PASST ALLES !!!! *AUSZUCK* KEINE SCANLINES MEHR KEINE CLIPPINGFEHLER KEINE ABSTÜRZE !!!!

THX an alle !!
noch ein paar letzte tests dann geb ich ab !

Shade
02-12-2002, 18:38
hät acuh 2 fehler:
1)bei der classe public CG1EdgeList
beschwert sich der compiler über zeile 6:
"public CG1EdgeList()"
2)wie initia. ich in buildActiveList die 2 edge objekte p,q?
ich versuchs mit "Cg1Edge p=new Cg1Edge" aber das scheint falsch zu sein
danke

leobasil
02-12-2002, 18:39
hmm... ich hab beim teapot bei der draufsicht einen leeren ring um den deckel, und der würfel schaut ... seltsam aus, kann aber daran liegen, dass wir noch keinen zBuffer implementiert haben.
aber schaut das bei euch auch so aus ?

gck
02-12-2002, 18:55
passt schon! Der Teapot hat den Schlitz auch im Wireframe Modus, und die mehrfarbigen Objekte hauen wegen der fehlenden Sichtbarkeitskontrolle noch nicht hin, worum wir uns in Runde 5 kümmern dürfen...

für Runde 4 schaut also alles richtig bei dir aus!

ps: wenn du noch was seltsames sehen willst, dann rotier mal die Kugel im scanfilled mode einige Zeit lang um die Y-Achse, hehe

@shade: das klingt nicht nach algorithmischen, sondern programmiertechnischen Problemen, lies dir halt nochmals genau die Syntax von deinem Code durch...
z.b. CG1Edge p = new CG1Edge();
braucht hinten auf jeden Fall einmal die Klammern, da auch ein Konstruktor eine Methode ist...

Shade
02-12-2002, 19:02
ja ich hat ja klammern am anfang aber als es dann immer noch nicht funkt hat hab ich die wieder weggemacht...
hab aber grad gesehen das es an klein/gross schreibung lag :hewa:
naja und sieht so aus als ob ich was aus versehen in edgeList reingeschrieben hät *DOHH*

aber was anderes:
bei "buildactivelist" soll ja active um die kanten aus
edges[scan] erweitert werden.wie mache ich das?

leobasil
02-12-2002, 19:29
@ Shade: das active kannst fast 1:1 ausm buch übernehmen nur dass das -> next durch ein .getHead() ersetzt wird

tschurlo
02-12-2002, 19:44
Du kannst den Konstruktor nicht einfach nur mit buildEdgeList() aufrufen, da du die Konstruktoren in dieser Klasse ueberschrieben hast (die Angabe). Du hast da einen Konstruktor mit drei, bzw. fuenf Uebergabeparametern, die du auch angeben musst.
Falls du es aus irgendeinem Grund nicht so wie im C-Code hinbekommst, kannst die Sachen, die du berechnest zwischendurch in drei Variablen speichern und erst dann dem Konstruktor uebergeben.

Shade
02-12-2002, 20:05
was halt bei mir ein problem ist ,ist das in buildactivelist ja eine kante p zu active dazugefügt werden soll.das kann ich aber nur bei einer edgelist machen...wie habt ihr das gelöst?

tschurlo
02-12-2002, 21:02
Du deklarierst einfach mal die beiden Edges ohne sie zu initialisieren.
Die eine Kante initialisierst du einfach mal mit der ersten Kante deiner aktuellen Scanline.
Dann kommt auch schon die While-Schleife

CG1Edge edgeP;
CG1Edge edgeQ;

edgeP = edges[scan].getHead();

Shade
02-12-2002, 21:29
nein das meinte ich nicht.
mein problem is ja die zeile
insertEdge(active,p);
und active ist ja im als edge deklariert.nun kann ich aber bei einer edge nicht die methode insert anwenden sondern nur bei einer edgelist

wrzsef
02-12-2002, 21:44
keine Panik!

es ist ganz einfach:

im CG1Object wird das Polygon erstellt
(zwei TODO Punkte: 1) erstellen des CG1ScanFilledPolygon
2) aufrufen der draw-methode

was passiert jetzt? die draw-methode wird aufgerufen!
aber nicht die aus CG1ScanFilledPolygon - logisch: denn da ist je keine implementiert (und da müssen wir auch keine implementieren!). deswegen schaut java in der oberklasse (CG1Polygon) nach, findet sie und führt sie durch:

public void draw(CG1NewCanvas canvas)
{
clip(canvas);
if (anz > 0) // wenn nach dem clippen noch was uebrig ist, zeichnen
drawClipped(canvas);
}

also: er clippt das polygon (wir müssen da also nix machen!) und dann
ruft er (falls noch was da ist drawClipped auf). diese Methode ist hier in CG1Polygon als abstract definiert, dass bedeutet: sie muss in jeder unterklasse implementiert werden --> deswegen implementieren wir unseren fill - also das effektive zeichnen - genau in dieser drawClipped-methode in CG1ScanFilledPolygon, wobei das fertig geclippte polygon in clipped[][] bereit steht!

tschurlo
02-12-2002, 23:48
Na ist ja klar, du kannst ja nicht einer Kante eine weitere hinzufuegen.
Deshalb sagst du irgendwo
CG1EdgeList active = new CG1EdgeList();
....

active.insert(edge p);

lg