Archivlink: javarea.de Forum > JavaScript > fremde Java Klasse nutzen
Vollständigen Link anzeigen: javarea.de Forum > JavaScript > fremde Java Klasse nutzen
Pages: [1]
| geschrieben von Micha am 29.01.2006 - 13:45 |
Hi
ich möchte eine fremde JavaClass nutzen. Ich habe die *.java (logischerweise auch den Bytecode *.class) sowie die Doku.
Es geht um die hier beschriebene Klasse. Die Sourcen sind ebenfalls verfügbar.
Diese Klasse soll Delaunay Dreiecke bilden. Dazu soll - wenn ich es richtig verstanden habe - ein Objekt Delaunay erzeugt werden mit einem Feld (vom Typ double):
| HTML-Quelltext | 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
| double p[][] = new double[4][2];
p[0][0] = 1;
p[0][1] = 1;
p[1][0] = 1;
p[1][1] = 100;
p[2][0] = 100;
p[2][1] = 100;
p[3][0] = 100;
p[3][1] = 1;
Delaunay DL = new Delaunay(p); |
Soweit so gut; die vier Punkte bilden in dem Beispiel ein Rechteck; es existieren als zwei Dreiecke (bzw. vier, wenn beide Diagonalen betrachtet werden). Problem ist nun, wie bekomme ich die Dreiecke?
Mir reicht da eine Ausgabe wie:
0-1-2
2-3-0
Also die Indizes des Punktfeldes, die ein Dreieck bilden.
Kann sich das einer mal ansehen und mir sagen, wie man auf die Dreiecke kommen soll?
Danke
Micha |
| geschrieben von Matneu am 29.01.2006 - 14:20 |
Was ich dabei nicht verstehe ist der Konstruktor. Wie kann man mit einem eindimensionalen Array (double[] p) mehrere Punkte definieren bzw. in einem zweidim. Array mehrere Verbindungen?
Grummel, steht ja drunter:
| Zitat | | | p - the points given as x1,y1, x2,y2,... |
Die Dreiecke bekommst Du logischerweise über die Funktion DL.triangulate() heraus, steht doch alles unten.
| Zitat | | | Returns:
the index set: p1 .... p3n. Triangle i consists of points number p3i, p3i+1, p3i+2 |
Also immer 3 Punkte hintereinander liefert ein Dreieck. Musste nur ein i mitlaufenlassen und schon haste Deine Dreiecke.
So far...
Matthias |
| geschrieben von Micha am 29.01.2006 - 14:36 |
|
| geschrieben von Matneu am 29.01.2006 - 17:28 |
|
| geschrieben von Micha am 29.01.2006 - 18:37 |
|
| geschrieben von Matneu am 29.01.2006 - 20:22 |
| Zitat | | | Original geschrieben von derletztekick am 29.01.2006 - 18:37
Ich weiss nicht warum aber Du hast mich veranlasst, es noch mal zu probieren. |
Warum gibst Du eigentlich immer eine äussere Grenze an? Probier' es dochmal mit Delaunay DL = new Delaunay();. Denn laut der JavaDoc sollte es auch ohne klappen ("If no boundary ist subscribed, the algorithm will add one and remove it in the end."). Die Grenzen sollten ja normalerweise auch nicht allzu wichtig zu sein. Dann kannst Du per addPoint() die einzelnen Punkte hinzufügen
| Zitat | | | Warum er nicht bei 0 oder 1 anfängt zu zählen, sondern bei 3?!? |
Die Frage habe ich mir auch schon gestellt. Ich vermute, dass das entweder mit dem mathematischen Verfahren oder mit der einfacheren Berechnung zusammenhängt.
| Zitat | | | Nun gehe ich ja davon aus - Du hast es nicht dementiert - das ich bei der Objektbildung die Grenzen festlege new Delaunay(GrenzPunkte). |
Davon bin ich eigentlich die ganze Zeit ausgegangen 
| Zitat | | | Vll noch eine Idee dazu? |
Leider nicht. Ich finde die ganze Klasse reichlich merkwürdig. Das fängt schon da an, dass man beim Konstruktor entweder Punkte ODER die äussere Grenze angeben kann, was IMO nicht allzu sinnig ist. Mag aber auch sein, dass mir da das Hintergrundwissen zu fehlt.
| Zitat | | | Achja, es ist keine Hausaufgabe aber vll der Anfang eines neuen Programms ohne ernsthafteren Hintergrund... |
Dann weiterhin viel Erfolg damit.
So far...
Matthias |
| geschrieben von Micha am 29.01.2006 - 20:50 |
..na na nicht weg laufen 
Die Klasse erwartet - auch wenn es dort anders steht - immer Punkte.
Ein:
| HTML-Quelltext | 1:
2:
3:
| public Delaunay(){
} |
existiert nicht (kann ich aber hinzufügen); jedoch ist die Angabe von Grenzen schon wichtig. Ich versuchs mal so zu verdeutlichen; du hast eine Kurve (ich zeige mal nur die Grenzpunkte - dazwischen sind also auch noch Punkte):
| HTML-Quelltext | 1:
2:
3:
4:
5:
6:
7:
8:
9:
| .
1
* *
* *
* *
* *
* *
2 * *
* * |
Dir ist klar, das eine direkte Verbindung zwischen Punkt 1 und 2 keinen Sinn macht; dem Programm wäre es nicht "aufgefallen" und er hätte jede Kombination vermascht.
addPoint(x,y); hat seine "Tücken" und wirft recht viele Exceptions.
| Zitat | | | The point must lie inside the given triangulation. |
Heißt leider nicht, das der Punkt in dem Grenzen, die man anfangs festlegt, liegen muss.
| HTML-Quelltext | 1:
2:
3:
4:
| double points[] = {1,1, 15,1, 15,16, 1,16} ;
Delaunay DL = new Delaunay(points);
//int[] triangle = DL.triangulate(points);
DL.addPoint(3.0, 1.4); |
Bringt dann sowas in der Art:
| Zitat | | | Exception in thread "main" java.lang.IllegalArgumentException: 2 is not a neighb
or of 6
at Delaunay.getNeighborPtr(Delaunay.java:398)
at Delaunay.edgeIllegal(Delaunay.java:432)
at Delaunay.legalizeEdge(Delaunay.java:474)
at Delaunay.legalizeNewFaces(Delaunay.java:246)
at Delaunay.addPoint(Delaunay.java:232)
at Delaunay.addPoint(Delaunay.java:215)
at test.main(test.java:33)
|
Leider habe ich bisher keinen Weg gefunden, fehlerfrei Punkte hinzuzufügen 
Micha |
| geschrieben von Matneu am 29.01.2006 - 21:39 |
| Zitat | | | Original geschrieben von derletztekick am 29.01.2006 - 20:50
..na na nicht weg laufen  |
Ich doch nicht *g*
| Zitat | | | jedoch ist die Angabe von Grenzen schon wichtig. |
Sehe ich ein, macht Sinn. Wie gesagt, stecke nicht wirklich tief in der Materie
| Zitat | | | Dir ist klar, das eine direkte Verbindung zwischen Punkt 1 und 2 keinen Sinn macht; dem Programm wäre es nicht "aufgefallen" und er hätte jede Kombination vermascht. |
Das ist das Problem, sobald man mehr als 3 Punkte als Begrenzung angibt, man kann nicht automatisch sagen, wo innen und wo aussen ist.
| Zitat | | | addPoint(x,y); hat seine "Tücken" und wirft recht viele Exceptions. |
Scheint also keine allzu bugfreie Version zu sein. Da hilft dann vielleicht nur selber schreiben, dann weisst Du auch, was Du wo angeben kannst 
So far...
Matthias |
| geschrieben von Micha am 29.01.2006 - 22:51 |
|
| geschrieben von Matneu am 01.02.2006 - 08:37 |
Wollte nur kurz schreiben, dass ich Deinen Beitrag nicht vergessen habe, allerdings im Moment viel zu tun habe. Aber solange das genau das ist, was Du suchst ist's ja nicht schlimm ;)
So far...
Matthias |
| geschrieben von Micha am 01.02.2006 - 08:52 |
Hi
noch probiere ich rum zwischen der Applet-Class und dem Paket von der UNI-Berlin. Im Moment bin ich wieder bei dem UNI-Berlin Teil, da es scheinbar die bessere Lösung ist (und sie GNU/GPL Lizensiert ist). Wenn ich am Anfang alle Punkte hinzufüge, dann trianguliert er fehlerfrei. Ein nachträgliches Hinzufügen ist bei mir nicht unbedingt der Fall.
Beim Applet komme ich nicht so einfach an die einzelnen Dreiecke ran; was auch an meinem Wissen liegen kann. Die Stelle in der Klasse, die mir die Punkte liefert ist eine Methode, die nur super.toString() enthält. Was in Gottes Namen ist "super" (ein schlüsselwort in Java; okay, aber was ist es, wenn man mehrere Klassen hat und wie greift es auf eine andere Klassenvariable zu?)
Das Grenzproblem habe ich bei beiden Klassen (obwohl es die Delaunay.java mit einem 2-D Array ja nicht haben sollte); somit muss ich hier so oder so mal in den sauren Apfel beißen. Gedacht hatte ich, das der User seine Grenzpunkte (nachdem) Triangulieren selbst festlegt. Dabei muss er auf die Reihenfolge achten. Zwei Punkte bilden immer eine Grenzlinie und der letzte Punkt schließt das Umringspolygon mit dem ersten Punkt. Nun sind alle Flächen (Dreiecke) zu suchen, die außerhalb des Gebietes liegen und zu löschen... Soweit die Theorie 
Da ich selbst noch Prüfungsstreß habe, arbeite ich auch noch nicht mit Hochdruck an der Sache, sondern versuche gerade meine eigenen Klassen dort in der Delanuay.java zu verbauen.
So wie ich - und das wird sich wohl nciht so recht vermeiden lassen - wieder Probleme habe, bin ich erneut hier zum Fragen ;)
Schöne Grüße aus Mecklenburg
Micha |
|