import java.awt.geom.*;
class Balken extends Line2D.Double implements Hindernis {
public Balken(Point2D start, Point2D end) {
super(start, end);
}
}
class PaintTest extends JComponent {
protected void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D g2 = ( Graphics2D )g;
g2.setStroke(new BasicStroke(5));
g2.draw( new Balken( new Point2D.Double(10,10), new Point2D.Double( 100, 100 ) ) );
}
}
package flipper;
import java.awt.*;
import java.awt.geom.*;
class Balken extends Line2D.Double implements Hindernis {
/**
*
* Balken(Point2D, Point2D)
*
* @param start
* @param end
*
* Konstruktor ruft den Konstruktor der Oberklasse auf.
*/
public Balken(Point2D start, Point2D end) {
super(start, end);
}
/**
*
* initSpielfeld()
*
* Initialisierung des Spielfeldes.
* Es werden hier die Hinderniselemente zusammengefügt, die im Endeffekt das Spielfeld darstellen
* sollen.
*/
private void initSpielfeld() {
Hindernis balkenLinks = new Balken(new Point(80,80), new Point(80,420));
this.hindernisse.add(balkenLinks);
Hindernis balkenRechts = new Balken(new Point(420,80), new Point(420,420));
this.hindernisse.add(balkenRechts);
Hindernis balkenOben = new Balken(new Point(80,80), new Point(420,80));
this.hindernisse.add(balkenOben);
Hindernis balkenUntenLinks = new Balken(new Point(80,420), new Point(210,420));
this.hindernisse.add(balkenUntenLinks);
Hindernis balkenUntenrechts = new Balken(new Point(290,420), new Point(420,420));
this.hindernisse.add(balkenUntenrechts);
}
/**
*
* initSpielfeld()
*
* Initialisierung des Spielfeldes.
* Es werden hier die Hinderniselemente zusammengefügt, die im Endeffekt das Spielfeld darstellen
* sollen.
*/
private void initSpielfeld() {
Hindernis balkenLinks = new Balken(new Point(80,80), new Point(80,420), this.zeichenflaeche.getGraphics());
this.hindernisse.add(balkenLinks);
// [...]
}
package flipper;
import java.awt.*;
import java.awt.geom.*;
class Balken extends Line2D.Double implements Hindernis {
/**
*
* Balken(Point2D, Point2D)
*
* @param start
* @param end
*
* Konstruktor ruft den Konstruktor der Oberklasse auf.
*/
public Balken(Point2D start, Point2D end, Graphics g) {
super(start, end);
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(5));
}
}
/**
*
* move()
*
* Die Flipperkugel wird bewegt, indem sie an einer anderen Stelle neugezeichnet wird.
*/
public void move() {
this.checkCollapse();
double x = this.getX() + 1;
double y = this.getY() + 1;
this.setFrame(x,y,this.radius * 2, this.radius * 2);
}
/**
*
* checkCollapse()
*
* Kleine Testmethode, die überprüft, ob die Hindernisse erkennen, ob die Kugel eine Koordinate
* mit ihnen teilt oder nicht.
*/
private void checkCollapse() {
Iterator iter = this.hindernisse.iterator();
while(iter.hasNext()) {
Shape h = (Shape)iter.next();
if(h.contains(this.getX(), this.getY())) {
System.out.println("Collapse");
}
}
}
Versuchs mal mit der Methode intersects(...)Student hat gesagt.:Das Problem entsteht, weil ich überprüfen will, ob eine Kugel (extends Ellipse2D.Double)
ein Hindernis berührt. Ich dachte mir, dass die Methode contains(..) dafür ganz gut sein könnte.
Class Ellipse2D:
intersects
public boolean intersects(double x,
double y,
double w,
double h)
Polygon balken = new Polygon(new int[]{
0, 1, 100, 99 //x Koordinaten
},
new int[]{
0, 0, 100, 100 //y Koordinaten
}, 4); //Anzahl Eckpunkte
Ellipse2D.Double kugel = new Ellipse2D.Double(60,39,30,30);
Area kugelBereich = new Area(kugel);
kugelBereich.intersect(new Area(balken));
if(kugelBereich.isEmpty()){
System.out.println("Kugel überschneidet Balken nicht.");
}else{
System.out.println("Kugel überschneidet Balken.");
}
//-->Konsolausgabe: Kugel überschneidet Balken.
//Aber mit dieser Kugel: Ellipse2D.Double kugel = new Ellipse2D.Double(60,38,30,30);
//ist die Konsolausgabe: Kugel überschneidet Balken nicht.
/*
* Ueberschneidende_Formen.java
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class Ueberschneidende_Formen extends JFrame {
private MyPanel panel;
public Ueberschneidende_Formen() {
super("Überschneidende Formen");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(250,180);
setResizable(false);
setLocationRelativeTo(null);
//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);
}
});
}
public static void main(String args[]) {new Ueberschneidende_Formen().setVisible(true);}
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){
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;
}
/*
* 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){
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;
}