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!
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,
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! :-)
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
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.
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!
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...
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.
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
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:
: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();
}
sollte diese clip methode nicht so aussehen ?
for (int i = 0; i<anz; i++)
clipPoint(projected[i],LEFT);
closeClip();
oder irre ich mich ?
mfg
@ 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
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. ?
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...
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?
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
@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?
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?
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++;
}
}
}
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?
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...
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:
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"
dass habe ich in clip() definiert
aber die linien sind falsch gezeichnet :(
wieso dass?
kann da jemand bitte helfen?
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" :-)
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?
@ 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??
ist bei mir auch so.allerdings bekomm ich selbst mit max 500 nur beim vielleck was brauchbares...
Die werte:
xMin=0;
yMin=0;
xMax=500;
yMax=500;
sind in CG1NewCanvas classe definiert
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();
.
.
.
@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 (!!!)
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
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));
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
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?
:eek2: warum bekomme ich dass?
Hilfee
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();
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.
: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....
@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 ;)
@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.
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.
am ende der methode "clip"
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
haste du am ende der clip methode anz=cnt;gesetzt?
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?
nicht das ich wüßte.aber die scheinst xMax,yMax nicht gestzt zu haben...
@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)
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:
Ähm - also müßten die x und y nicht in Großbuchstaben sein, also edge[X] usw... ???
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.
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
@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.
@ MarvinTheRobot
hast recht, habe das glatt übersehen
mfg
blue1
@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
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 :-)
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:
Naja, clipped[][] wird als int benötigt, da das dann die ganzzahlige Darstellung im Koordinatensystem repräsentieren soll...so wies halt aufn Screen kommt.
vBulletin® v3.7.1, Copyright ©2000-2008, Jelsoft Enterprises Ltd.