 |
12.03.2006, 20:11
| Nach oben
#1 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
| Probleme mit intersect() bei Ellipse2D.Double und Polygon
Hallo,
ich habe da mal eine Frage zur Klasse Polygon und insbesondere zur
Ich habe folgende Codepassagen: Java Code: private void createBorders() { this. barricades. add(new BorderBarricade (new Point(30, 30), new Point(400, 30))); this. barricades. add(new BorderBarricade (new Point(30, 30), new Point(30, 400))); this. barricades. add(new BorderBarricade (new Point(30, 400), new Point(400, 400))); this. barricades. add(new BorderBarricade (new Point(400, 30), new Point(400, 400))); }
Dort werden also vier Objekte vom Typ BorderBarricade einer Liste hinzugefügt.
Im Konstruktor der Klasse, die von Polygon erbt und das Interface Barricade implementiert, werden die Punkte nun dem Superklassenkonstruktor zugewiesen.
Das sieht bei mir so aus Java Code: super(new int[]{(int)start.getX(), (int)end.getX()}, new int[]{(int)start.getY(), (int)end.getY()}, 2); }
Jut. Das klappt ja auch. Die Ränder werden wunderbar dargestellt, also alles bestens.
Nun habe ich ein Objekt der Klasse Ball, die von Ellipse2D.Double erbt.
Dieses Objekt bewegt sich über ein Panel und ich möchte nun, dass es die Richtung verändert, wenn es an der "Wand", also einem der oben eingefügten Objekte, anschlägt.
Als erste Version soll das Applet bei einer Berührung einfach mal abbrechen.
Ich habe das so versucht Java Code: private void checkCollapse() { Iterator iter = this. barricades. iterator(); while(iter.hasNext()) { ballArea. intersect(new Area(barricade )); if(!ballArea.isEmpty()) { this.collapsed = true; System. out. println("ball touched wall"); } } }
In der Membervariablen barricades sind die Hindernisse enthalten. Eine Ausgabe von barricades.size() ergibt das richtige Resultat.
Ich verstehe das nicht so wirklich, weil z.B. dieses Applet hier genau das macht, was ich haben möchte. Nur ist es dort statisch, aber das sollte ja eigentlich egal sein. PHP-Code: /* * Ueberschneidung.java */ import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; public class Ueberschneidung extends JApplet { public void init() { try { EventQueue.invokeAndWait(new Runnable() { public void run() { initComponents(); } }); } catch (Exception ex) { ex.printStackTrace(); } } private void initComponents() { //JComponents erzeugen: toolbar = new JToolBar(); runterB = new JButton("Kugel tiefer"); hochB = new JButton("Kugel höher"); //Layout: toolbar.setFloatable(false); runterB.setEnabled(false); toolbar.add(runterB); toolbar.add(hochB); getContentPane().add(toolbar, BorderLayout.NORTH); panel = new MyPanel(60d,42,30d); add(panel); //Listeners: runterB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { remove(panel); panel = new MyPanel(60d,42d,30d); add(panel); validate(); runterB.setEnabled(false); hochB.setEnabled(true); } }); hochB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { remove(panel); panel = new MyPanel(60d,35d,30d); add(panel); validate(); runterB.setEnabled(true); hochB.setEnabled(false); } }); } private MyPanel panel; private JButton hochB, runterB; private JToolBar toolbar; }
class MyPanel extends JPanel{ public MyPanel(double x, double y, double w){ this.x=x; this.y=y; this.w=w; this.h=w; } public void paintComponent(Graphics g){ System.out.println("paintComponent"); super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; Polygon balken = new Polygon(new int[]{ 0, 3, 103, 100 //x Koordinaten }, new int[]{ 0, 0, 100, 100 //y Koordinaten }, 4); //Anzahl Eckpunkte Ellipse2D.Double kugel = new Ellipse2D.Double(x,y,w,h); g2d.draw(balken); g2d.draw(kugel); Area kugelBereich = new Area(kugel); kugelBereich.intersect(new Area(balken)); if(kugelBereich.isEmpty()){ g2d.drawString("Kugel überschneidet Balken nicht.",20,110); }else{ g2d.drawString("Kugel überschneidet Balken.",20,110); } } private double x, y, w, h; }
Quelle: http://java-forum.org/de/viewtopic.php?p=143211#143211
Kann mir da jemand weiterhelfen?
Ich verzweifle und meine Zeit rennt weg  .
[EDIT]
Ups, ich hab die Frage vergessen. lol .. auch net schlecht.
Ähm .. also es ist so, dass meine Kugel sich in Richtung Wand bewegt. Alles klar. Und dann bewegt sie sich über diese "Wand" drüber hinweg. Aber genau dort müsste das Skript doch hier reinspringen, oder? Java Code: if(!ballArea.isEmpty()) { this.collapsed = true; System. out. println("ball touched wall"); }
Danke im Voraus.
Grüße, Ben.
Geändert von Ben (12.03.2006 um 20:34 Uhr).
|
| |
12.03.2006, 21:33
| Nach oben
#2 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Aaaalso,
irgendwas läuft da aber mal so richtig falsch. Ich habe nun mal den Code für mein Applet angehängt.
Ist nicht wirklich gut kommentiert, aber es ist auch noch nicht soweit ausgeliefert zu werden.
Ich habe eine Dokumentation auf meinem Schmierblock  .
Mit folgendem Testcode in der Methode checkCollapse() erhalte ich die nachstehende Ausgabe Java Code: System. out. println("Area " + rect. getHeight() + "," + rect. getWidth() + "," + rect. getX() + "," + rect. getY()); System. out. println("Barricade " + rect2. getHeight() + "," + rect2. getWidth() + "," + rect2. getX() + "," + rect2. getY());
Code: Area 10.0,10.0,215.0,410.0
Barricade 0.0,0.0,0.0,0.0
Area 10.0,10.0,216.0,412.0
Barricade 0.0,0.0,0.0,0.0
Area 10.0,10.0,216.0,412.0
Barricade 0.0,0.0,0.0,0.0
Wenn ich mir die Punkte des jeweiligen Polygons anschaue (xpoints, ypoints) dann stehen dort eben Koordinaten wie (30,30) etc. drin. Also die, die ich oben angegeben habe ... :-/
Ich versuche ja wirklich alles, damit ich das alleine lösen kann, aber das interessiert meinen Professor herzlich wenig *g*.
*help*
[EDIT]
Hach ja. Wir haben soooo "viele" Java-Programmierer in dem Forum. Menno. Wir brauchen mehr. *schnief*
Ich habe jetzt Folgendes herausgefunden.
Wenn ich ein normales Hindernis folgendermaßen in die Liste einfüge: Java Code: Polygon p = new RectangleBarricade (); p.addPoint(40 , 300); p.addPoint(120, 300); p.addPoint(120, 340); p.addPoint(40 , 340); this.data.add(p); p = new TriangleBarricade(); p.addPoint(400, 30); p.addPoint(400, 70); p.addPoint(320, 30); this.data.add(p);
dann bricht das Applet ab. Wenn ich dann aber auch das hier schreibe .. Java Code: private void createBorders() { Polygon border = new BorderBarricade (); border.addPoint(30 , 30); border.addPoint(400, 30); this.barricades.add(border); border = new BorderBarricade(); border.addPoint(30 , 30); border.addPoint(30 , 400); this.barricades.add(border); border = new BorderBarricade(); border.addPoint(30 , 400); border.addPoint(400, 400); this.barricades.add(border); border = new BorderBarricade(); border.addPoint(400, 30); border.addPoint(400, 400); this.barricades.add(border); }
bricht es nicht ab. Irgendetwas muss ich also bei den Objekten von BorderBarricade falsch machen .. ist nur die Frage: Was?
[EDIT]
Ich habe das Archiv mal aktualisiert. [EDIT]
Ich höre mir immer gerne an, was ich noch besser machen könnte etc. (jetzt wo ich hier meinen Code offenlege). Aber nur solange, wie mir auch Respekt entgegen gebracht wird.
Immer im Hinterkopf haben, dass ich noch nie ein Applet bzw. so etwas in der Art gemacht habe.
Geändert von Ben (13.03.2006 um 13:05 Uhr).
|
| |
13.03.2006, 12:15
| Nach oben
#3 | | Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 525
|
So, hab jetzt tatsächlich auf Arbeit nochmal Zeit gefunden, nur hab ich dein Source noch daheim und hier kein WinRAR. Könntest du es evtl. nochmal als zip reinstellen?
|
| |
13.03.2006, 12:59
| Nach oben
#4 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Öhm. Nö. Sorry. Vielleicht kann das wer anders machen? :-/
[EDIT]
Habe es über Umwege doch hinbekommen  .
Ich habe eine Theorie. Vielleicht liegt es daran, dass bei den Balken / den Wänden nur zwei Punkte für das Polygon festgelegt wurden?
Vielleicht ist dann einfach die Area leer?
Ich werde das austesten, behalte aber natürlich diesen Thread im Auge.
Grüße, Ben.
Geändert von Ben (13.03.2006 um 13:05 Uhr).
|
| |
13.03.2006, 14:09
| Nach oben
#5 | | Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 525
|
und zwischenzeitlich hab ich es über umwegen hinbekommen doch WinRAR zu ergattern  .
Hab jetzt aber net mehr so viel Zeit, werd trotzdem mal drüberschauen.
|
| | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | | | Themen-Optionen | Thema durchsuchen | | | |
Forumregeln
| Es ist dir nicht erlaubt, neue Themen zu verfassen. Es ist dir nicht erlaubt, auf Beiträge zu antworten. Es ist dir nicht erlaubt, Anhänge hochzuladen. Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten. HTML-Code ist aus. | | | Alle Zeitangaben in WEZ +2. Es ist jetzt 03:55 Uhr.
|