Mein Programm zeichnet ungenau oder ich hab nen Denkfehler.
Also es soll ein Kreis in einem Quadrat gezeichnet werden, der Kreis soll die Seiten des Quadrats berühren.
Also nach der Rechnung stimmt alles (ich lasse "Fläche des Quadrats" und "Fläche des Quadradts" - "Fläche des Kreises" ausgeben) aber gezeichnet liegt der Kreis im Quadrat ohne die Ränder zuberühren.
Hab wieder eine abgeänderte Canvas benutzt find das im Moment damit noch einfacher etwas zu zeichnen
//Canvas.class
Also es soll ein Kreis in einem Quadrat gezeichnet werden, der Kreis soll die Seiten des Quadrats berühren.
Also nach der Rechnung stimmt alles (ich lasse "Fläche des Quadrats" und "Fläche des Quadradts" - "Fläche des Kreises" ausgeben) aber gezeichnet liegt der Kreis im Quadrat ohne die Ränder zuberühren.
Code:
import java.awt.Rectangle;
import java.awt.geom.Ellipse2D;
class Kreis {
double PI = 3.1415;
double radius;
Kreis(double r) {
radius = r;
}
void vergroessern(double wert) {
radius += wert;
}
double liefereFlaeche() {
return radius * radius * PI;
}
void zeichne() {
Canvas canvas = Canvas.getCanvas();
canvas.draw(this, "red", new Ellipse2D.Double(radius/2, radius/2, radius,radius));
canvas.wait(1000);
}
}
// realisiert ein Quadrat mit einem internen die Raender des
// Quadrats berührenden Kreis
class QuadratMitKreis {
Kreis kreis;
double groesse;
QuadratMitKreis(double g) {
kreis = new Kreis(g / 2);
groesse = g;
}
void vergroessern(double wert) {
kreis.vergroessern(wert / 2);
groesse += wert;
}
double liefereFlaeche() {
return groesse * groesse;
}
double liefereFlaecheOhneKreis() {
return liefereFlaeche() - kreis.liefereFlaeche();
}
void zeichne() {
Canvas canvas = Canvas.getCanvas();
canvas.draw(this, "black", new Rectangle.Double(0, 0, groesse, groesse));
canvas.wait(1000);
}
}
public class UE22Aufg6 {
public static void main(String[] args) {
int eingabe = IO.readInt("Bitte groesse des Quadrats eingeben");
QuadratMitKreis Qmk = new QuadratMitKreis(eingabe);
System.out.println("Quadrat [" + eingabe + "]");
System.out.println("Fläche Quadrat : "+Qmk.liefereFlaeche());
double erg=Qmk.liefereFlaeche()-Qmk.kreis.liefereFlaeche();
System.out.println("Fläche des Quadrats ohne Kreis : \t"+ erg );
Qmk.zeichne();
Qmk.kreis.zeichne();
while (Qmk.groesse != 101) {
eingabe++;
Qmk.vergroessern(1);
Qmk.zeichne();
Qmk.kreis.zeichne();
System.out.println("Quadrat [" + eingabe + "]");
System.out.println("Fläche Quadrat : "+Qmk.liefereFlaeche());
erg=Qmk.liefereFlaeche()-Qmk.kreis.liefereFlaeche();
System.out.println("Fläche des Quadrats ohne Kreis : \t"+ erg );
}
}
}
Hab wieder eine abgeänderte Canvas benutzt find das im Moment damit noch einfacher etwas zu zeichnen
//Canvas.class
Code:
class Canvas {
static Canvas canvasSingleton;
static {
canvasSingleton = new Canvas("Shapes", 500, 500, Color.white);
canvasSingleton.setVisible(true);
}
static Canvas getCanvas() {
return canvasSingleton;
}
// ----- instance part -----
JFrame frame;
CanvasPane canvas;
Graphics2D graphic;
Color backgroundColour;
Image canvasImage;
List objects;
HashMap shapes;
Canvas(String title, int width, int height, Color bgColour) {
frame = new JFrame();
canvas = new CanvasPane();
frame.setContentPane(canvas);
frame.setTitle(title);
canvas.setPreferredSize(new Dimension(width, height));
backgroundColour = bgColour;
frame.pack();
objects = new ArrayList();
shapes = new HashMap();
}
void setVisible(boolean visible) {
if (graphic == null) {
// first time: instantiate the offscreen image and fill it with
// the background colour
Dimension size = canvas.getSize();
canvasImage = canvas.createImage(size.width, size.height);
graphic = (Graphics2D) canvasImage.getGraphics();
graphic.setColor(backgroundColour);
graphic.fillRect(0, 0, size.width, size.height);
graphic.setColor(Color.black);
}
frame.setVisible(visible);
}
void draw(Object referenceObject, String color, Shape shape) {
objects.remove(referenceObject); // just in case it was already there
objects.add(referenceObject); // add at the end
shapes.put(referenceObject, new ShapeDescription(shape, color));
redraw();
}
void erase(Object referenceObject) {
objects.remove(referenceObject); // just in case it was already there
shapes.remove(referenceObject);
redraw();
}
void setForegroundColor(String colorString) {
if (colorString.equals("red"))
graphic.setColor(Color.red);
else if (colorString.equals("black"))
graphic.setColor(Color.black);
else if (colorString.equals("blue"))
graphic.setColor(Color.blue);
else if (colorString.equals("yellow"))
graphic.setColor(Color.yellow);
else if (colorString.equals("green"))
graphic.setColor(Color.green);
else if (colorString.equals("magenta"))
graphic.setColor(Color.magenta);
else if (colorString.equals("white"))
graphic.setColor(Color.white);
else
graphic.setColor(Color.black);
}
void wait(int milliseconds) {
try {
Thread.sleep(milliseconds);
} catch (Exception e) {
// ignoring exception at the moment
}
}
void redraw() {
erase();
for (Iterator i = objects.iterator(); i.hasNext();) {
((ShapeDescription) shapes.get(i.next())).draw(graphic);
}
canvas.repaint();
}
void erase() {
Color original = graphic.getColor();
graphic.setColor(backgroundColour);
Dimension size = canvas.getSize();
graphic.fill(new Rectangle(0, 0, size.width, size.height));
graphic.setColor(original);
}
private class CanvasPane extends JPanel {
public void paint(Graphics g) {
g.drawImage(canvasImage, 0, 0, null);
}
}
private class ShapeDescription {
private Shape shape;
private String colorString;
ShapeDescription(Shape shape, String color) {
this.shape = shape;
colorString = color;
}
void draw(Graphics2D graphic) {
setForegroundColor(colorString);
graphic.draw(shape); // .Fill für gefüllten Kreis
}
}
}