Portal > Foren > Java > Desktop-Applikationen und Grafik > Probleme mit intersect() bei Ellipse2D.Double und Polygon
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 12.03.2006, 20:11 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard 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:
  1. private void createBorders() {
  2.     this.barricades.add(new BorderBarricade(new Point(30, 30), new Point(400, 30)));
  3.     this.barricades.add(new BorderBarricade(new Point(30, 30), new Point(30, 400)));
  4.     this.barricades.add(new BorderBarricade(new Point(30, 400), new Point(400, 400)));
  5.     this.barricades.add(new BorderBarricade(new Point(400, 30), new Point(400, 400)))
  6. }
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:
  1. public BorderBarricade(Point2D start, Point2D end) {
  2.     super(new int[]{(int)start.getX(), (int)end.getX()},
  3.             new int[]{(int)start.getY(), (int)end.getY()},
  4.             2);
  5. }

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:
  1. private void checkCollapse() {
  2.        
  3.         Iterator iter = this.barricades.iterator();
  4.  
  5.         while(iter.hasNext()) {
  6.             Polygon barricade = (Polygon)iter.next();
  7.  
  8.             Area ballArea = new Area(this);
  9.             ballArea.intersect(new Area(barricade));
  10.            
  11.             if(!ballArea.isEmpty()) {
  12.                 this.collapsed = true;
  13.                 System.out.println("ball touched wall");
  14.                 System.exit(1);
  15.             }
  16.         }
  17.     }
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(toolbarBorderLayout.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 hochBrunterB;
    private 
JToolBar toolbar;
}


class 
MyPanel extends JPanel{
    public 
MyPanel(double xdouble ydouble 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[]{
            
03103100        //x Koordinaten
        
},
                new 
int[]{
            
00100100        //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 xywh;

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:
  1. if(!ballArea.isEmpty()) {
  2.     this.collapsed = true;
  3.     System.out.println("ball touched wall");
  4.     System.exit(1);
  5. }


Danke im Voraus.
Grüße, Ben.

Geändert von Ben (12.03.2006 um 20:34 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.03.2006, 21:33 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

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:
  1. Rectangle rect = ballArea.getBounds();
  2. Rectangle rect2 = new Area(barricade).getBounds();
  3. System.out.println("Area " + rect.getHeight() + "," + rect.getWidth() + "," + rect.getX() + "," + rect.getY());
  4. 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:
  1. Polygon p = new RectangleBarricade();
  2. p.addPoint(40 , 300);
  3. p.addPoint(120, 300);            
  4. p.addPoint(120, 340);
  5. p.addPoint(40 , 340);
  6. this.data.add(p);
  7.        
  8. p = new TriangleBarricade();
  9. p.addPoint(400, 30);
  10. p.addPoint(400, 70);
  11. p.addPoint(320, 30);
  12. this.data.add(p);
dann bricht das Applet ab. Wenn ich dann aber auch das hier schreibe ..
Java Code:
  1. private void createBorders() {
  2.        
  3.         Polygon border = new BorderBarricade();
  4.         border.addPoint(30 , 30);
  5.         border.addPoint(400, 30);
  6.         this.barricades.add(border);
  7.        
  8.         border = new BorderBarricade();
  9.         border.addPoint(30 , 30);
  10.         border.addPoint(30 , 400);
  11.         this.barricades.add(border);
  12.        
  13.         border = new BorderBarricade();
  14.         border.addPoint(30 , 400);
  15.         border.addPoint(400, 400);
  16.         this.barricades.add(border);
  17.        
  18.         border = new BorderBarricade();
  19.         border.addPoint(400, 30);
  20.         border.addPoint(400, 400);
  21.         this.barricades.add(border);
  22.     }
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.
Angehängte Dateien
Dateityp: rar JavaFlipper.rar (18,4 KB, 2x aufgerufen)
Dateityp: zip JavaFlipper.zip (14,2 KB, 1x aufgerufen)

Geändert von Ben (13.03.2006 um 13:05 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.03.2006, 12:15 Nach oben    #3
Erfahrener Benutzer
 
Registriert seit: 02.02.2005
Beiträge: 525
Standard

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?
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.03.2006, 12:59 Nach oben    #4
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Ö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).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.03.2006, 14:09 Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 02.02.2005
Beiträge: 525
Standard

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.
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Probleme mit Strato / Arcor? MrNiceGuy Plauderecke 15 28.12.2006 23:35
Caching mittels dbm-Dateien, Probleme mit dba_popen() Ben PHP-Programmierung 4 27.07.2006 13:23
Probleme mit Anhängen Ben Archiv 0 16.06.2006 16:13
Layout Probleme VipViper2000 Desktop-Applikationen und Grafik 8 13.09.2005 22:35


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:55 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44