PDA

View Full Version : mit Bsp 2


tschurlo
22-10-2002, 14:36
Hi!

Eigentlich dachte ich mir, den Code von C in Java uebertragen ist ganz easy. Aber da gibt es im einen Code Variablennamen, die es im anderen nicht gibt, manche Methoden uebernehmen drei Werte mehr, es gibt Pointer, die es ja in Java nicht gibt.

Kann mir da jemand helfen? z.B. sagen, welche Variablennamen welchen entsprechen?

Beim switch (im Buch ueber die Variable b), wie loest man hier das fuer die Faelle links, rechts,... auf?

Wo kommen dann die Variablen projected und clipped vor?

Da ich den Code nicht ganz durchschaue (den Algorithmus schon) wuerde ich ich ueber eure Hilfe freuen.

Danke!

buschti
22-10-2002, 22:44
es ist eh vorgegeben, welche parameter zu jeder methode übergeben werden. die anderen variablen werden nicht übergeben, weil sie sowieso global für das ganze Polygon gültig sind( z.B. xMin...).

zu den variablennamen:

pIn entspricht projected
pOut entspricht clipped

edge ist in unserer klasse ein integerwert, 0 bedeutet LEFT, 1 bedeutet RIGHT usw.


ich hoffe, ich konnt dir helfen.

ciao,
sebastian

tschurlo
22-10-2002, 23:16
Ja, danke. Das mit Left, right, ... habe ich mittlerweile auch schon alleine rausgefunden. Ich wusste nur nicht, dass man bei des cases des Switch auch wieder Variablen angeben darf, ich dachte, dass man nur Werte der switch-Variable nehmen darf.

Dass mit pIn, pOut hat mir schon geholfen, obwohl ich mir da auch schon aehnliche Gedanken gemacht habe, da es ja unterschiedliche Typen sind (int, double).

!!! Mich wuerde aber noch interessieren, in der letzten Methode, closeClip gibt es einen Teil wo {0, 0, 0, 0} steht. Was soll ich damit anfangen? Einfach weglassen?

Ach ja, irgendwo steht noch
if (!(blabla[edge]))
Soll das heiszen
if (blabla[edge] == null) ??

Danke jedenfalls, lg,

Jokeman
22-10-2002, 23:54
Original geschrieben von tschurlo

[...]
Ach ja, irgendwo steht noch
if (!(blabla[edge]))
Soll das heiszen
if (blabla[edge] == null) ??
[...]

in C gibt es keine boolean variablen... hier werden integer werte als boolean aufgefasst... 0 ist false und (soweit ich mich erinnern kann) alle andren werte sind true

was bedeutet:
if (!blabla)
entspricht
if (blabla == false)
b.z.w.
if (blabla == 0)

Kuschelmaus
22-10-2002, 23:59
ich seh mich da auch nicht ganz aus. wieso sind im buch nur 1-
dimensionale arrays aber in der cg-angabe 2-dimensionale?

und was soll ich von wcPt2 * pOut halten? wird da pOut mit was multipliziert?

kenn mich nimma aus *seufz*

dankbar für jede hilfe! :-)

Jokeman
23-10-2002, 01:05
bei dem beispiel im buch sprichst Du die x b.z.w. y koordinaten beispielsweise mit iPt.x und iPt.y an...
der typ (oder die klasse) wcPt2 ist so deffiniert
wenn ich jetzt wie bei der methode clipPolygon ein wcPt2 array hab (in dem mehrere ecken des polygons gespeichert sind), könnte ich die koordinaten mit pIn[i].x und pIn[i].y ansprechen.

wir haben aber in unsrer angabe keinen eigenen typen für koordinaten deffiniert und verwenden einfach ein array...
zum Beispiel:
double[][] vTable
in der ersten dimension is jetzt die nummer der ecke gespeichert und in der 2ten dimension, ob es sich um eine x oder y (oder z) koordinate handelt... mit vTable[2][Y] frage ich bespielsweise die y-koordinate der 3ten ecke des polygons ab


das mit den sternen is wieder so a C gschichtl....
das is in dem fall kein 'mal' sondern deffiniert eine pointervariable

z.B.: wcPt2 * pOut
bedeutet:
die variable pOut ist eine pointervariable vom typ wcPt2

bei java is das nicht notwendig

Kuschelmaus
23-10-2002, 01:36
danke, das hilft ma schon amal weiter! :p

Shade
23-10-2002, 18:13
3 fragen:
-int Edge:
wie ist das steht 1001 zb. für links oben,und 0010 für rechts mitte oder wie?

-double point []
heisst das,dass am ersten index die x-koordinate ist und am zweiten die y?

-wcPt2 iPt (bei methode intersect im buch)
ist das ein 2dim. array das den schnittpunkt mit der kante speichert?

Deep Thought
23-10-2002, 18:53
1) int Edge: nein!
0 steht für LEFT, 1 für RIGHT, 2 für BOTTOM und 3 für TOP genauso wie die Konstanten im vorprogrammierten Teil es angeben und gibt an mit welcher Kante gerade geclippt wird.
Es gibt keine Kanten, die gleichzeitig links und oben verlaufen, was du meinst wurde bei Line clipping verwendet, wird aber für Polygon Clipping nicht gebraucht.

2) double point [];
heißt wie du richtig erkannt hast, dass x in feld 0 und y in feld 1 gespeichert werden.

3) wcPt2 iPt;
ja richtig, im Buch ist es eine Struktur mit den Komponenten x und y. In unserem Fall sollen wir ein 2 dim array analog zu Punkt 2 verwenden.

Shade
23-10-2002, 19:02
aha danke,
aber wo ist dieser vorprogrammierte teil wo top left usw angegeben werden?

Deep Thought
23-10-2002, 20:56
In der Datei CG1Polygon.java steht gleich am Anfang die Zeile:
static final int LEFT=0, RIGHT=1, BOTTOM=2, TOP=3;
und andere Konstantendefinitionen, aber das müsstest du doch schon gesehen haben?

Das größte Problem, dem ich begegnet bin, war das richtige Abschreiben... ich habe 3 Fehler gemacht, deren Suche recht lange dauerte!

asterix
23-10-2002, 22:15
Hallo!

Hätte da eine Frage: funkt bei euch das Programm jetzt schon?!
Ich habe den Code von C in Java übertragen, aber irgendwo habe ich mich wahrscheinlich vertan.

Hat vielleicht jemand Screenshots, wie das ganze dann aussieht?

lg

Deep Thought
23-10-2002, 23:33
Ja bei mir geht jetzt alles. Wie gesagt, das größte Problem war sich nicht zu vertippen, x statt y, * statt /, ...
Die vier Polygone schauen dann so aus...

Cha
23-10-2002, 23:53
Also, ich hab den Code von C in Java "abgeschrieben", aber ich hatte da ein Problem, denn das Programm wurde zwar compeliert, aber es hat dann nur einen schwarzen Hintergrund angezeigt, erst als ich dann in der letzten Methode clip() Werte für xMin, xMax, yMin und yMax eingegeben habe, hats was angezeigt, aber das kann es doch nicht sein, oder? Was kann ich da falsch gemacht haben?

Außerdem bin ich mir mit den Array nicht sicher, wo jetzt 1-dim und wo 2-dim gehören, z.B bei der Variablen iPt, da hab ich:


double[] intersect(double[] p1, double[] p2, int edge)
{
// vielleicht [][]
double[] iPt = new double[3]; //für X, Y, Z
double m=0;
.......


stimmt das so, oder was muss ich da machen!
welche Arrays sind bei euch 2-dim?


Das waren jetzt viele Fragen auf einmal, ich weiß, wäre trotzdem voll nett, wenn ihr mir helfen könntet, danke.

Jokeman
24-10-2002, 00:40
hab zur abwechslung auch mal ne frage...

gibts irgend einen bestimmten grund dafür, dass clipped[] integer und net double is? das macht das ganze ja nur umständlicher, oder nicht?

ghost dog
24-10-2002, 17:34
habe ebenfalls folgende fragen:

methode intesect:
wenn ich m als float definiere, bekomme ich errormeldung, da ja im ausdruck mit arrays gerechnet wird.
wie kann man das umwandeln bzw gibt es eine andere möglichkeit???

methode closeClip:
statt der deklaration wcPT2 i;
verwende ich double [] i;
stimmt das so??

bin über jede idee dankbar!
thx

Shade
24-10-2002, 22:36
methode intesect:
wenn ich m als float definiere, bekomme ich errormeldung, da ja im ausdruck mit arrays gerechnet wird.
wie kann man das umwandeln bzw gibt es eine andere möglichkeit???
ich glaub das liegt eher daran das die einngangsvariablen p1 und p2 double sind.versuchs mal indem du m als double deklarierst...

tschurlo
24-10-2002, 22:39
Ich habe double verwendet und das hat problemlos funktioniert.

Lg,

:bounce:

Shade
25-10-2002, 03:21
:hewa: toll,nach langer arbeit krieg ich lauter NULL POINTER exceptions...:hewa:
ich glaub es liegt an "clip" da von hier aus die methode "clip point" aufgerufen wird,wo der fehler vorkommt...
ich glaub auch das es an der übergabe der eingabewerte liegt...weiss aber nicht genau wo der fehelr ist...wär nett wenn mir jemand helfen könnt...
protected void clip(CG1NewCanvas canvas)
{double [] in = new double [2];
in[0]=projected[0][X];
in[1]=projected[1][Y];
for (int i=0;i<anz;i++)
{clipPoint(in,LEFT);
closeClip();
}

wolk
25-10-2002, 12:40
sollte diese clip methode nicht so aussehen ?

for (int i = 0; i<anz; i++)
clipPoint(projected[i],LEFT);
closeClip();

oder irre ich mich ?
mfg

Jokeman
25-10-2002, 13:03
@ wolk...

Du irrst Dich nicht...
bei shades version wird immer nur der erste eckpunkt behandelt... so kann das nicht funktionieren

@ shade...

machs so, wie es wolk geschrieben hat :D

Shade
25-10-2002, 14:58
danke aber dieser :cuss: Null pointer fehler kommt weiterhin.java gibt mir diese zeile in der methode clipPoint an:
if (first[edge]==null)
{first [edge] [X] = point [0];
...
das versteh ich aber nicht.die X koordinate des eingangspunktes wird auf dem leeren array first gespeichert...woher kommt jetzt die null point excep. ?

gck
25-10-2002, 15:28
ja, aber first[][] ist ja ein zweidimensionales Array: first[edge] existiert zwar, aber ist nur ein null Zeiger. Du musst zuerst in first[edge] ein neues Array erzeugen, bevor du ihm Werte zuweisen kannst, also

first[edge] = new double[2];

bevor du first[edge][0|1] was zuweisen kannst!

Alternativ kopierst du das bereits existente Array direkt nach first[edge], also

first[edge] = point;

Ist vielleicht eleganter...

nexus
25-10-2002, 15:49
wegen clip() methode:
@wolk wo hast du die vorprogrammierte werte in clip() verloren?
ICh mein clipped[i][X]......
Bei mir enthelt clip() folgende Zeilen:

for (int i=0; i<anz; i++)
{
clipped[i][X] = (int)projected[i][X];
clipped[i][Y] = (int)projected[i][Y];

clipPoint( projected[i], LEFT);
closeClip();
}

Aber es ist falsch, aber wo stekt den Fehler?

Cha
25-10-2002, 16:03
Die closeClip() Methode muss doch außerhalb der for-Schleife stehen, oder nicht?


Weiß irgendjemand, ob iPt nun ein 1- oder 2- dim Array ist?

Ich hab nämlich:

double[] intersect(double[] p1, double[] p2, int edge)
{
// vielleicht [][]
double[] iPt = new double[3]; //für X, Y, Z
double m=0;
.......
Analag dazu in der Methode clipPoint

Danke

nexus
25-10-2002, 16:36
@Cha, stimmt closeClip() ist nach der schleife, hab dass uebersehen, danke

iPt muss glaub ich ein 1Dim array sein, denn es nur ein punkt ist(intersection Point) und intersect() muss gibt 1Dim Arrays.

Cih denke man muss sich nicht beschrenken auf irgend welche anzahl der werte fuer
double[] iPt = new double[z.B 2]
man kann ja ein null wer setzen:
double iPt = null;
speter werden die richtige werte sowieso gespeichert,
oder ist dass nicht so?

Cha
25-10-2002, 17:01
was kann da falsch bei meinem Algo sein, wenn mir nur ein schwarzes Fenster angezeigt wird, anstatt den Polygonen.

Ich hab bis jetzt nur den Alg vom Buch in Java umgeschrieben, doch es müsste doch trotzdem was anzeigen, oder nicht?

Habt ihr da eine Idee, was ich falsch gemacht haben könnte?

Lucutus
25-10-2002, 17:09
Ich hab dasselbe Problem. Außerdem bekomme ich bei einer Beispieldatei eine NullPointer-Exception. Stimmt die Methode unten soweit?

protected void clipPoint(double[] point, int edge)
{
double[] i_point = new double[2];

if (first[edge] == null)
first[edge] = point;
else
{
if (cross(point, s[edge], edge))
{
i_point = intersect(point, s[edge], edge);

if (edge < TOP) clipPoint(i_point, edge + 1);
else
{
clipped[cnt][X] = (int)i_point[X];
clipped[cnt][Y] = (int)i_point[Y];

cnt++;
}
}
}

s[edge] = point;
if (inside(point, edge))
{
if (edge < TOP) clipPoint(point, edge + 1);
else
{
clipped[cnt][X] = (int)point[X];
clipped[cnt][Y] = (int)point[Y];
cnt++;
}
}
}

Cha
25-10-2002, 17:53
Hab ich auch so!

Ich hab auch keine Ahnung wo unser Fehler liegen könnte, dass nix angezeigt wird.

Bei der Methode clip hab ich:
cnt=0;

for int(i=0;i<anz;i++) {
clipPoint(projected[i], LEFT);
}
closeClip();

da gehört doch sicher kein return (cnt) (wie im Buch am Schluss, oder? Ist ja eine void Methode).

Was ist mit der einen Zeile: wcPt3*first[N_EDge} = {0,0,0,0}, s[N_Edge] ... brauch ich die?

Shade
25-10-2002, 18:15
habs gleiche problem...
vielleicht liegts am cnt?das soll ja beibehalten werden.aber wenn mans am anfang der methode auf 0setzt wirds ja immer 0 sein...

nexus
25-10-2002, 18:17
Meine clipPoint() methode ist identisch, und da ligt der fehler nicht,
mir ist clip() verdechtig:

>Was ist mit der einen Zeile: wcPt3*first[N_EDge} = {0,0,0,0}, s
[N_Edge] ... brauch ich die?

glaube nicht, weil die zeile ist in unserem Fall globall definiert in der classe, auch fuer cnt
also die Zeile kann man vergessen

ghost dog
25-10-2002, 19:02
newbi frage:
muss ich eigentlich das array iPt sowohl in der methode intersect sowie in der methode clipPoint deklarieren und initialisieren???

und noch was:
bekomme folgende errors abwechselnd aus der methode intersect:

variable m might not been initialized
variable iPt might not been initialized

habe die variable wie folgt deklariert:
double m;
double [] iPt;

vielen dank für eure tipps und ideen!!
ghost dog

Kuschelmaus
25-10-2002, 20:05
@ ghost dog:
du mußt gleich am anfang hinschreiben
double m = 0;
double[] iPt = double[2]; dann funktionierts

aber das problem, das mir nichts am bildschirm angezeit wird, hab ich auch. vielleicht gibts da einen java-guru der sich für uns erbarmt und uns das erklärt??? :verycool:

Filz
25-10-2002, 20:13
Hast du irgendwo
xMin=0;
yMin=0;
xMax=512;
yMax=512;

definiert? Sonst clippt er dir das Polygon im Fenster (0,0)-(0,0) und ist somit "unsichtbar"

nexus
25-10-2002, 20:26
dass habe ich in clip() definiert
aber die linien sind falsch gezeichnet :(
wieso dass?
kann da jemand bitte helfen?

nexus
25-10-2002, 20:35
vielleich ist da was mit dem lineDraw algo loss?

ghost dog
25-10-2002, 20:43
@kuschlmaus:
danke. das war mein fehler...
bin jetzt auch im club der "dunklen fenster" :-)

Lukas
25-10-2002, 20:52
bei mir wird das polygon gezeichnet zwar, aber nicht geclippt.
hab den algorithmus genau so wie im buch implementiert, es werden auch alle funktionen aufgerufen. hat irgendwer eine ahnung woran das liegen könnte?

Cha
26-10-2002, 00:16
@ Filz

WEnn ich die Werte
xMin=0;
yMin=0;
xMax=500;
yMax=500;
eingebe, dann schaut das alles ja nach was aus, wenn ich aber 512 eingebe, dann sind da auf einmal blaue und orange Linien zu sehen. Von woher hast du das mit 0,0,512,512??? Steht das in der Aufgabenstellung??

Shade
26-10-2002, 01:07
ist bei mir auch so.allerdings bekomm ich selbst mit max 500 nur beim vielleck was brauchbares...

nexus
26-10-2002, 01:31
Die werte:
xMin=0;
yMin=0;
xMax=500;
yMax=500;
sind in CG1NewCanvas classe definiert

Filz
26-10-2002, 03:44
x/y-Min/Max sind einfach die Grenzen vom schwarzen Zeichenfenster, alles außerhalb davon soll geclippt werden.

Nachdem sie sich für das Beispiel extra die Mühe gemacht haben, in CG1NewCanvas.java eigene Methoden für die Ausgabe der Ausmaße zu machen, denk ich, sollt man diese schon verwenden...


public void draw(CG1NewCanvas canvas)
{
xMin=0;
xMax=canvas.getWidth();
yMin=0;
yMax=canvas.getHeight();
.
.
.

Cha
26-10-2002, 11:11
@Filz

Bei mir funkt das nicht, weil mein Fenster (wo ich die Polygone loade) nur 511x511 ist und darum werden da so komische Linien gezeichnet, wenn ich für xMax und yMax 512 eingeben --- bei 511 geht alles noch problemlos.

WEiß vielleicht irgendjemand, wie man dieses Fenster auf eine andere Größe umstellt, im JBUILDER7 (!!!)

Jokeman
26-10-2002, 12:16
Original geschrieben von nexus_at
wegen clip() methode:
@wolk wo hast du die vorprogrammierte werte in clip() verloren?
ICh mein clipped[i][X]......
Bei mir enthelt clip() folgende Zeilen:

for (int i=0; i<anz; i++)
{
clipped[i][X] = (int)projected[i][X];
clipped[i][Y] = (int)projected[i][Y];

clipPoint( projected[i], LEFT);
closeClip();
}

Aber es ist falsch, aber wo stekt den Fehler?

wozu hast Du:
clipped[i][X] = (int)projected[i][X];
clipped[i][Y] = (int)projected[i][Y];
drinnen gelassen? das brauchst ja nimmer... damit wurden ja die werte nur durchgereicht (steht eh in der angabe)... in clipped schreibst Du ja sowieso Deine neuen werte in der methode clipPoint

Filz
26-10-2002, 12:25
Weiß vielleicht irgendjemand, wie man dieses Fenster auf eine andere Größe umstellt, im JBUILDER7 (!!!)

Wenn das Fenster umstellen willst (warum auch immer :idea: )
Das Fenster muss allerdings quadratisch bleiben, aus irgendeinem Grund (zumindest bei mir).

CG1NewCanvas.java, ab Zeile 18


public CG1NewCanvas()
{
width = 512;
height = 512;


und in CG1mainFrame.java, Zeile 127


myCanvas.setSize(new Dimension(512, 512));

asterix
26-10-2002, 13:23
Hallo!

Ich hätte da eine Frage:
und zwar heißt es bei der Aufgabestellung, dass vor dem Auruf CloseClip in der Methode clipPolygon() eine Abfrage fehlt?
Was ist da gemeint?

lg

Cha
26-10-2002, 13:44
Die Screenshots die gepostet wurden, sind das die Originalen oder schon die geclippten?
Bei mir wird der Stern nämlich schon geclippt - ist also nicht ganz zu sehen (hab nur den Code vom Buch!)

Hat irgendjemand schon eine Ahnung wie man das mit den komplett außerhalb liegenden Polygonen löst?

nexus
26-10-2002, 17:11
:eek2:&nbsp; warum bekomme ich dass?

Hilfee

Filz
26-10-2002, 17:52
Original geschrieben von asterix

Es heißt bei der Aufgabestellung, dass vor dem Auruf CloseClip in der Methode clipPolygon() eine Abfrage fehlt?
Was ist da gemeint?


Wenn das Polygon komplett aus dem Bereich liegt, zB. ein Dreieck ganz weit links (-> ausserhalb3.atoff), gibt es keinen letzten Punkt, den man dann mit dem ersten Punkt verbinden könnte. Und es entsteht eine nette NullPointerOutOfBoundsArrayWasWeissIchException.

----------------------------------------------
RICHTIGE LÖSUNG SIEHE hier (http://rs6k.feig.at/informatik-forum/showthread.php?s=&threadid=3540)
----------------------------------------------

FALSCH:

if (cnt>0) closeClip();

Filz
26-10-2002, 18:01
Original geschrieben von nexus_at
:eek2:warum bekomme ich dass?

Ist nicht so schwer der Fehler: Schreib einfach nach dem Aufruf von closeClip
anz=cnt;

Du hast die Variablen anz, cnt und die Punkte-Listen: projected und clipped.

Vor dem Clippen hast du in der Liste projected anz Stück Punkte gespeichert. Nach dem Clippen sind in der Liste clipped cnt Punkte (also meistens mehr als anz)

Beim Zeichnen fragt das Programm aber nur anz Punkte aus der Liste clipped ab und zeichnet diese.

Shade
26-10-2002, 18:59
:applaus:
danke,hat das gleiche problem,aber jetzt läufts...
*freu* :p *freu*

MarvinTheRobot
26-10-2002, 19:55
protected void closeClip()
{
anz=cnt;


so soll das aussehen? hm, da seh ich noch weniger als vorher....

die rechte ecke des sterns ist z.b. geclippt dann haut die graphik nach oben links ab und bleibt in der ecke picken.... ich mach screenshots wenns irgendwen interessiert....

mfg, Phil.

//BEGIN CG-Code

human MarvinTheRobot;
int kruegl;

if (CG == :hewa: )
{
for(kruegl=0; kruegl<5_Promille; kruegl++)
{
MarvinTheRobot.kruegl.insert[kruegl];
}

}

//END CG-Code

ghost dog
26-10-2002, 20:48
hat schon jemand eine lösung für die nullpointerexeptions gefunden....

Megabit
26-10-2002, 21:10
@ghost dog: ganz einfach :)

bei clipPoint einfach eine kleine Anfrage einbauen (um die Nullpointer Exeptions abzufangen) :

.....
else
{
if (s[edge]!=null)
{ if (cross (point, s[edge], edge))
{.....
}
}

statt :


.....
else
{
if (cross (point, s[edge], edge))
{.....
}

ghost dog
26-10-2002, 21:38
@megabit:
hmmm. geht noch immer nicht. werd mir jetzt den zweiten "white russian" mixen. vielleicht hilft der gegen eine exeption.......

Kuschelmaus
26-10-2002, 21:56
@ ghost dog
wenn der white russian nix gholfen hat, hab ich noch an andern vorschlag:
ich hab dort, wie die arrays first und s definiert sind, noch zusätzliche zahlen hingeschrieben:
first = new double[4][4];
s = new double[4][4]

ich weiß nicht ob das erlaubt is, aber dann is gangen ;)

Megabit
26-10-2002, 22:03
@ghost dog : kopier die erste und zweite zeile der fehlermeldung, normalerweise steht dort dann eine Zeilenangabe, poste die fehlermeldung und die Zeile auf die verwiesen wird hier, dann können wir dir vielleicht helfen und du brauchst nicht so viele "white russians" ;)

MarvinTheRobot
26-10-2002, 22:28
Bwzüglich NullPointerExceptions.... reicht das nicht?


if (cnt>0) closeClip();


Also ich hab das in meine "public void clip()" eingebaut und bekomm keine Exceptions mehr... funkt bei euch net? oder hab ich noch nicht alles ausprobiert?

btw: des proggi zeigt noch immer nur schund an... *grml*

mfg, Phil.

gck
26-10-2002, 22:55
Am Ende muss man auch noch anz (Anzahl der Vertices) auf "cnt" setzen, also anz = cnt, damit der draw Algorithmus dann auch alle Punkte zeichnet, weil es ja unter Umständen mehr gerworden sind, als es vorher waren....

Schauts mal in diesen Thread, da geht es darum, was passieren soll, wenn das Polygon das Fenster einschließt, und wir ham noch keine Lösung dafür! Was denkts ihr dazu? (bitte in den anderen Thread replien!)

http://www.informatik-forum.at/informatik-forum/showthread.php?s=&threadid=3540

MarvinTheRobot
26-10-2002, 23:09
Am Ende muss man auch noch anz (Anzahl der Vertices) auf "cnt" setzen, also anz = cnt,


Sorry heut ko**t es mich schon richtig an..... welches ende (wovon?) meinst du gck?

mfg, Phil.

Shade
26-10-2002, 23:22
am ende der methode "clip"

MacLoud
27-10-2002, 20:15
Also, hab ebenfalls ein schwarzes Fenster & im DOS-Fenster steht noch dazu : ArrayIndexOutOfBoundsException at...(überall und) in CG1Polygon in der draw-routine, in der Zeile. wo steht :

drawClipped(canvas);

keine Ahnung, was das soll, hab ich vielleicht nen Flüchtigkeitsfehler gemacht?
Weiss jemand, woran das liegt?

Genauer sieht die Fehlermeldung so aus:
java.lang.ArrayIndexOutOfBoundsException
at CG1NewCanvas.setPixel(CG1NewCanvas.java:57)
at CG1Line.draw(CG1Line.java:68)
at CG1WireFramePolygon.drawClipped(CG1WireFramePolygo n.java:25)
at CG1Polygon.draw(CG1Polygon.java:58)
at CG1Object.draw(CG1Object.java:266)
at CG1mainFrame.loadButtonActionPerformed(CG1mainFram e.java:522)
at CG1mainFrame$6.actionPerformed(CG1mainFrame.java:4 29)
at java.awt.Button.processActionEvent(Button.java:381 )
at java.awt.Button.processEvent(Button.java:350)
at java.awt.Component.dispatchEventImpl

Shade
27-10-2002, 20:26
haste du am ende der clip methode anz=cnt;gesetzt?

MacLoud
27-10-2002, 20:34
juppel.

die sieht so aus:
protected void clip(CG1NewCanvas canvas)
{
for (int i=0; i<anz; i++){
clipPoint(projected[i],LEFT);
}
closeClip();
anz=cnt;
}

Was ist mit der drawClipped-methode? die muss ich nicht ändern, oder?

Shade
27-10-2002, 21:04
nicht das ich wüßte.aber die scheinst xMax,yMax nicht gestzt zu haben...

Usher
27-10-2002, 21:21
@Jokeman...ich habe vor ein paar Seiten Dein Posting gesehen.

Dein Fehler ist, dass Du closeClip() in der for-Schleife aufrufst. Es gehört ausserhalb. Wahrscheinlich hast Du ihn schon längst bemerkt...aber nur für alle Fälle wollte ich das loswerden ;o)

Rince
27-10-2002, 22:23
BUHUUUU!!!!!

Ich hab alles probiert... wirklich alles, aber der bildschirm bleibt weiterhin schwarz und ich bin über das stadium der verzweiflung schon längst hinaus. :cuss:
Er gibt mir ständig NullPointerException aus und zwar in zeile 111

Deswegen poste ich hier jetzt meinen java-code den ich in clippoint geschrieben habe:

protected void clipPoint(double[] point, int edge)
{
double[] ipt = new double [2];

if (first[edge] == null) {
first[edge][x] = point[x]; //(zeile111)
first[edge][y] = point[y];
}
else {
if (cross (point, s[edge], edge)) {
ipt = intersect(point, s[edge], edge);
if (edge < 3)
clipPoint(ipt, edge+1);
else {
clipped[cnt][x] = (int) ipt[x];
clipped[cnt][y] = (int) ipt[y];
cnt++;
}
}

}
s[edge] = point;
if (inside (point, edge))
if (edge < 3)
clipPoint(point, edge+1);
else {
clipped[cnt][x] = (int) point[x];
clipped[cnt][y] = (int) point[y];
cnt++;
}
}



Bitte bitte helft mir ich weiß einfach nicht mehr was ich machen soll! Wenn er wenigstens linien zeichnen würde... dann wäre ich ja schon glücklich. Aber es geht garnix... absolut garnix!

Und um die frage gleich vorwegzunehmen... ja ich hab die grenzen von xMin... usw gesetzt:

double xMin = 0.0, xMax = 511.0, yMin = 0.0, yMax = 511.0;

So ich geh jetzt in eine ecke weinen und warte eine antwort ab.:hewa:

Westley
27-10-2002, 22:33
Ähm - also müßten die x und y nicht in Großbuchstaben sein, also edge[X] usw... ???

Filz
27-10-2002, 22:35
probiers mal in public CG1Polygon(...) mit

first = new double[4][];
s = new double[4][3];

gleich nach den anderen Variablendefinitionen....

MarvinTheRobot
27-10-2002, 23:09
Try this ->

if (first[edge] == null)
{
first[edge] = point; //(zeile111)
}

so funzt es bei mir zumindest nach hilfe von 2 leutz.... ;-) den rest hab ich auch so.

mfg, Phil.

Rince
27-10-2002, 23:16
Danke für den tipp aber das hilft leider auch nicht.

Was die variablen betrifft... die hab ich auf x und y umgeändert. Das ständige großschreiben ging mir auf den nerv.

Ich hab die arrays so definiert wie du mir gesagt hast aber es macht keinen unterschied.

Es würde mir aber schon helfen wenn mir jemand sagt das er ClipPoint genauso geschrieben hat und es bei ihm funktioniert.
Langsam aber sicher wirds knapp... ich muß auch noch den sonderfall behandeln (hab ich auch schon eine fixe idee wie ich das mache), aber das hat ja sowieso keinen sinn wenn schon der vom buch implementierte code nicht funktioniert.

Also wenn jemand noch vorschläge hat was es sonst noch sein könnte... ich weiß echt nicht mehr weiter.

Hat jemand einen funktionierenden code und will ihn mir schicken? Ich will nicht abschreiben... aber es würd mir helfen ihn mit meinem zu vergleichen.

Hier ist meine emailadresse: tatjana19@gmx.at

blue1
27-10-2002, 23:41
@rice

also zeile 111 & 112 kannst du eigentlich zusammenfassen zu: first[edge} = point;

zeile 117 & 129 muss eigentlich so lauten: if (edge < TOP)

bei mir funktionierts auf jedenfall so

MarvinTheRobot
27-10-2002, 23:44
@ blue1:

das mit dem TOP hab ich mir auch gedacht, aber wenn edge sowohl mit zahlen als auch mit LEFT,RIGHT etc definiert wird, dürfte das eigentlich nicht das problem sein....

ganz oben steht ja-> static final int LEFT=0, RIGHT=1, BOTTOM=2, TOP=3

also müsste 3 auch gehn.


was die zeile 111 und 112 betrifft geb ich dir recht, das kann man zusammenfassen....

mfg, Phil.

blue1
27-10-2002, 23:50
@ MarvinTheRobot

hast recht, habe das glatt übersehen

mfg
blue1

Bruno
28-10-2002, 00:28
@Rince: Hab das ClipPoint eigentlich genauso geschrieben wie du (halt hab ich

first[edge][x] = point[x]; //(zeile111)
first[edge][y] = point[y];

zu

first[edge] = point;

zusammengelegt und statt

edge < 3

hab ich edge < Top

Aber ich hab am anfang auch die X/Y Variablen auf klein geändert, weil ich mich immer verschrieben hab, und mein Rechenknecht hat spöntan einen Aufstand gemacht (kompilieren hat er sich aber lassen, nur zeichnen wollte er halt nicht! Ich sags ja immer, "Sch... Technik!!!" :cuss: ). Als ich sie wieder allesamt auf groß geändert hab, gings wieder und jetzt rennts (so halbwegs)

MfG, Bruno

dose
28-10-2002, 01:46
Original geschrieben von Filz
[B]

Ist nicht so schwer der Fehler: Schreib einfach nach dem Aufruf von closeClip
anz=cnt;

AAAAAAAAAAAAAH DANKE ! Das hat mir jetzt sicher ne Stunde oder mehr debuggen erspart, darauf wär ich so schnell wohl nicht mehr gekommen...

ghost dog
28-10-2002, 15:47
@kuschlmaus & megabit:

thx für eure tipps!
white russian hat eber eh geholfen! wirkt manchmal wunder :-)

Rince
28-10-2002, 17:12
Okay bei mir funzt es jetzt.

Ich wollte nochmal allen danken die mir geholfen haben meine fehler zu finden. Und damit auch noch andere davon profitieren können zähl ich jetzt noch schnell die fehler auf die ich gemacht habe.

Meiner fehler waren folgende:

Ich hab statt

int[][] clipped ---> double[][] clipped geschrieben. Warum es deswegen nicht funktioniert hat weiß ich nicht weil das meiner meinung nach keinen unterschied machen sollte... aber scheinbar doch. Falls einer weiß warum wäre ich für eine erklärung dankbar.(auf den fehler wäre ich wahrscheinlich in hundert jahren nicht draufgekommen.)

der Zweite fehler war eher banaler natur... ich hatte bei intersect ein else vergessen. (dummer fehler ich weiß!)

und der 3 war das ich unten bei der methode clip die variable cnt nochmal als int definiert habe... also

int cnt = 0; statt
cnt = 0;

Also fals es jemand noch nicht hat hilft ihm das ja vielleicht weiter.

JIPIII es funktioniert endlich!!!!:thumb:

dose
28-10-2002, 18:29
Naja, clipped[][] wird als int benötigt, da das dann die ganzzahlige Darstellung im Koordinatensystem repräsentieren soll...so wies halt aufn Screen kommt.