PDA

View Full Version : [FRAGE] - Bug in der Vorlage zu Bsp 2


Moby
16-10-2004, 01:49
There is also a bug in the implementation of the book: In closeClip(), the final segment of the polygon should only be clipped against an edge, if we clipped against that edge at least once before. Add an if-statement to check for this. If we do not do this, the algorithm will fail for any polygon that lies completely outside an edge.

Wenn ich das richtig deute, würde es reichen ein boolean-Array mit 4 Einträgen zu definieren, dass auf true gesetzt wird, sobald die Funktion intersect() aufgerufen wird. zB mit edgeused[edge] = true;

In der Funktion closeClip() muss ich dann nur als erstes diesen Spezialfall, bei dem alle booleans in dem Array false wären, abfragen, richtig?

mfg PauL

thebigMuh
16-10-2004, 01:54
Yup.

Oder, falls du first[] am Anfang auf lauter nulls initialisierst, kannst du auch einfach abfragen, ob es immer noch null ist.

Ciao, ¡muh!

ines
17-10-2004, 15:00
ich versteh nit ganz wozu diese function closeClip überhaupt gut ist,....und wo wird sie überhaupt aufgerufen?! kann mir das wer erklären?
lg, ines

Rovo
17-10-2004, 15:08
nun ja, wie closeClip schon sagt, schließt es das polygon. da clipPoint gerade mal die verbindungen von 0-n aber nicht die von n zu 0 überprüft und notfalls clippet ist closeClip für diesen letzten test und eventuell auch für das zurechtstutzen notwendig.

closeClip wird bei mir in der clip-methode nach der schleife aufgerufen und schließt somit das polygon.

was das initialisieren von first[] mit null betrifft. first wird gerade mal mit CG1Point[4] definiert, nicht aber initialisiert. da es ein object-array ist, das noch nicht initialisiert wurde, sind die einzelnen plätze so oder so null und braucht nicht erst extra mit null initialisiert zu werden ;)

hoffe, dass es jetzt klarer wird

lg,
roman

ines
17-10-2004, 19:20
danke!
also könnt das in etwa so ausschauen?

for(edge=LEFT;edge<=TOP;edge++)
{
if(edgeUsed[edge]==true)
{
if(cross (s[edge], first[edge],edge))
{
pt=intersect(s[edge],first[edge], edge);

if(edge<TOP)
{
clipPoint(pt,edge+1);
}
.....
lg,ines

Matthias
17-10-2004, 20:52
ja, nur, dass du egdeUsed gar nicht benötigst, wie oben auch schon geschrieben wurde. man braucht nur first[edge] auf null abfragen und weiß, ob dort geclipped wurde oder nicht.

seHaas
18-10-2004, 00:43
ich hab einfach die cnt variable überprüft, ob die 0 ist oder nicht...
weil wenn die 0 ist hab dann liegen eh alle außerhalb und i ruf closeClip nicht mehr auf

n3x
18-10-2004, 08:03
ich hab einfach die cnt variable überprüft, ob die 0 ist oder nicht...
könnte sein, dass das zufällig funktioniert, müsstest du dir aber genauer überlegen. die idee ist ja eigentlich, dass du diesen test pro edge machst, dabei hilft dir cnt nicht.

seHaas
20-10-2004, 14:23
könnte sein, dass das zufällig funktioniert, müsstest du dir aber genauer überlegen. die idee ist ja eigentlich, dass du diesen test pro edge machst, dabei hilft dir cnt nicht.

stimmt, hab jetzt ewig lange debugged und bin drauf gekommen das es teilweise richtig ist, weil wenn cnt=0 ist dann is mindestens ein first[] element NULL => fange also die nullpointerexception ab.
ich hab zwar noch keinen fall gefunden wo closeclip noch an punkt liefert, wenn min. ein first-punkt null ist.

Joni
20-10-2004, 17:36
poly1 wird z.b. bei der überprüfung mit cnt nicht angezeigt

Thönu
22-10-2004, 18:58
hi zusammen,

ich hab jetzt alle Ansätze in dem Thread hier durchprobiert, aber bei den atoff's KomischesPolygon und Test5 bekomm ich immer noch so eine komische Linie, am rechten äusseren Rand, die eigentlich ja nicht da sein sollte, weil die Polygone voll ausserhalb des Canvas liegen...

mach ich etwas falsch oder stimmt das mit der first[edge] abfrage einfach ned?

ich hab mich auch schon gefragt wie das eingetlich gehen soll? weil als allerallererstes wird ja das first[edge] auf ungleich null abgefragt und wenn das der fall ist, wird ihm der gerade aktuelle punkt zugewiesen....also kann first[edge] gar nicht null sein, ausser wenn die Kante gar nie im spiel ist...d.h also wenn alle punkte ausserhalb des canvas liegen und nie kreuzen. ausserdem kommt hinzu,das first[0] (also LEFT) niemals null wird, also sicher immer einen Wert hat...

wenn ich was nicht verstanden hab, dann wär jetzt ein guter zeitpunkt um mir das zu erklären...

Matthias
22-10-2004, 19:11
hi zusammen,

ich hab jetzt alle Ansätze in dem Thread hier durchprobiert, aber bei den atoff's KomischesPolygon und Test5 bekomm ich immer noch so eine komische Linie, am rechten äusseren Rand, die eigentlich ja nicht da sein sollte, weil die Polygone voll ausserhalb des Canvas liegen...

mach ich etwas falsch oder stimmt das mit der first[edge] abfrage einfach ned?

das sollte schon so passen, keine sorge.

Thönu
22-10-2004, 19:15
super, jetzt hab ichs gesehen