HonniCilest
Erfahrenes Mitglied
[Iterationmöglich, aber nur Ersetzung von F]
Total unperformant bei größeren Eingaben, aber die Funktionalität, wie ich bisher gekommen bin erfüllts
(glaube ich zumindest
)
Halbes Jahr Java, noch blutiger Anfänger, also seid nicht so hart ^.^
Ich denke der wichtigste funktionelle Teil steht in der überschriebenen paintComponent-Methode und in getWayToGo()
Edit: jar-File im Anhang
Total unperformant bei größeren Eingaben, aber die Funktionalität, wie ich bisher gekommen bin erfüllts


Halbes Jahr Java, noch blutiger Anfänger, also seid nicht so hart ^.^
Ich denke der wichtigste funktionelle Teil steht in der überschriebenen paintComponent-Methode und in getWayToGo()
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class ZeichenbegabteSchildkroete extends JFrame implements WindowListener, ActionListener {
public static final long serialVersionUID = 1L;
private JMenuBar myMenuBar;
private JMenu schildkroete, farbgebung;
private JCheckBoxMenuItem schwarz, rotverlauf;
private JMenuItem myStart, myReset;
private JPanel myPicture, myOptions, myActions;
private JTextField startliste, iteration, ersetzungsliste;
private JLabel _startliste, _iteration, _ersetzungsliste;
private JTextField xPosition, yPosition, schrittweite, drehwinkel;
private JLabel _xPosition, _yPosition, _schrittweite, _drehwinkel;
private String myWayToGo;
private int farbmodi;
public ZeichenbegabteSchildkroete() {
super();
init();
initFrame();
initComponents();
setVisible(true);
}
public void init() {
farbmodi = 1;
}
public void initFrame() {
setTitle("Zeichenbegabte Schildkroete");
setSize(800,700);
setLocation(50,50);
addWindowListener(this);
}
public void initComponents() {
// Menu für die verschiedenen Aufgaben
myMenuBar = new JMenuBar();
schildkroete = new JMenu("Schildkroete");
myStart = new JMenuItem("Start");
myStart.addActionListener(this);
schildkroete.add(myStart);
myReset = new JMenuItem("Reset");
myReset.addActionListener(this);
schildkroete.add(myReset);
myMenuBar.add(schildkroete);
farbgebung = new JMenu("Farbe");
schwarz = new JCheckBoxMenuItem("schwarz");
schwarz.setSelected(true);
schwarz.addActionListener(this);
farbgebung.add(schwarz);
rotverlauf = new JCheckBoxMenuItem("roter Verlauf");
rotverlauf.addActionListener(this);
farbgebung.add(rotverlauf);
myMenuBar.add(farbgebung);
setJMenuBar(myMenuBar);
// -----------------------------------
// content
setLayout(new BorderLayout());
myOptions = new JPanel();
myOptions.setLayout(new GridLayout(1,8));
_xPosition = new JLabel("X-Position");
_xPosition.setHorizontalAlignment(JLabel.CENTER);
myOptions.add(_xPosition);
xPosition = new JTextField("130");
myOptions.add(xPosition);
_yPosition = new JLabel("Y-Position");
_yPosition.setHorizontalAlignment(JLabel.CENTER);
myOptions.add(_yPosition);
yPosition = new JTextField("10");
myOptions.add(yPosition);
_schrittweite = new JLabel("Schrittweite");
_schrittweite.setHorizontalAlignment(JLabel.CENTER);
myOptions.add(_schrittweite);
schrittweite = new JTextField("5");
myOptions.add(schrittweite);
_drehwinkel = new JLabel("Drehwinkel");
_drehwinkel.setHorizontalAlignment(JLabel.CENTER);
myOptions.add(_drehwinkel);
drehwinkel = new JTextField("22.5");
myOptions.add(drehwinkel);
add(myOptions, BorderLayout.NORTH);
myPicture = new JPanel() {
public static final long serialVersionUID = 1L;
{ setOpaque(true); }
public void paintComponent(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
int gehe;
double actualX, actualY;
double drehe, actualDrehe;
Vector tempX = new Vector();
Vector tempY = new Vector();
Vector tempW = new Vector();
if(myWayToGo != null) {
try {
actualX = Integer.parseInt(xPosition.getText());
}
catch(NumberFormatException nfe) {
xPosition.setText("0");
actualX = 0;
}
try {
actualY = Integer.parseInt(yPosition.getText());
}
catch(NumberFormatException nfe) {
yPosition.setText("0");
actualY = 0;
}
try {
gehe= Integer.parseInt(schrittweite.getText());
}
catch(NumberFormatException nfe) {
schrittweite.setText("0");
gehe = 0;
}
try {
drehe = Double.parseDouble(drehwinkel.getText());
}
catch(NumberFormatException nfe) {
schrittweite.setText("drehwinkel");
drehe = 0;
}
actualDrehe = 0;
if(farbmodi == 1) {
g.setColor(Color.black);
}
// geht Zeichen für Zeichen durch
for(int i=0; i<myWayToGo.length(); i++) {
// F gefunden, zeichne eine Linie, Trigonometrie notwendig
if(myWayToGo.charAt(i) == 'F') {
if(farbmodi == 2) {
// setzt Farbe der Linie entsprechend dem der Höhe
if(actualY<=getHeight() && actualY >=0) {
g.setColor(new Color((int)(actualY/getHeight()*255),0,0));
}
else {
g.setColor(new Color(0,0,0));
}
}
// zeichne Linie, erst hier Rundung (Pixel sind ganzzahlig) um Rundungsfehler einzuschränken
g.drawLine((int)actualX,
(int)(getHeight()-actualY),
// cos&sin nehmen Radiand nicht Grad! -> Umrechnung von Grad zu Radiand notwendig
(int)(actualX+=Math.cos(actualDrehe*2*Math.PI/360)*gehe),
(int)(getHeight()-(actualY+=Math.sin(actualDrehe*2*Math.PI/360)*gehe)));
}
// + gefunden, drehe Kopf der Schildkröte gegen den Uhrzeiger
else if(myWayToGo.charAt(i) == '+') {
actualDrehe += drehe;
}
// - gefunden, drehe Kopf der Schilkröte in Uhrzeigersinn
else if(myWayToGo.charAt(i) == '-') {
actualDrehe -= drehe;
}
// [ gefunden, speichere Daten
else if(myWayToGo.charAt(i) == '[') {
tempX.add(""+actualX);
tempY.add(""+actualY);
tempW.add(""+actualDrehe);
}
// ] gefunden, lese Daten
else if(myWayToGo.charAt(i) == ']') {
actualX = Double.parseDouble((String)tempX.lastElement());
tempX.removeElementAt(tempX.size()-1);
actualY = Double.parseDouble((String)tempY.lastElement());
tempY.removeElementAt(tempY.size()-1);
actualDrehe = Double.parseDouble((String)tempW.lastElement());
tempW.removeElementAt(tempW.size()-1);
}
}
}
}
};
add(myPicture, BorderLayout.CENTER);
myActions = new JPanel();
myActions.setLayout(new GridLayout(1,6));
_startliste = new JLabel("Startliste");
_startliste.setHorizontalAlignment(JLabel.CENTER);
myActions.add(_startliste);
startliste = new JTextField("++++F");
myActions.add(startliste);
_iteration = new JLabel("Iteration");
_iteration.setHorizontalAlignment(JLabel.CENTER);
myActions.add(_iteration);
iteration = new JTextField("5");
myActions.add(iteration);
_ersetzungsliste = new JLabel("Ersetzungsliste");
_ersetzungsliste.setHorizontalAlignment(JLabel.CENTER);
myActions.add(_ersetzungsliste);
ersetzungsliste = new JTextField("FF-[-F+F+F]+[+F-F-F]");
myActions.add(ersetzungsliste);
add(myActions, BorderLayout.SOUTH);
// -----------------------------------
}
// iteriert und ersetzt
public String getWayToGo() {
String myString = startliste.getText();
int iterator;
try {
iterator = Integer.parseInt(iteration.getText());
}
catch(NumberFormatException nfe) {
iterator = 0;
}
for(int i=1; i<=iterator; i++) {
myString = myString.replaceAll("F", ersetzungsliste.getText());
}
return myString;
}
// WindowListener
public void windowClosing(WindowEvent we) {
System.exit(0);
}
public void windowClosed(WindowEvent we) {}
public void windowOpened(WindowEvent we) {}
public void windowActivated(WindowEvent we) {}
public void windowDeactivated(WindowEvent we) {}
public void windowIconified(WindowEvent we) {}
public void windowDeiconified(WindowEvent we) {}
// ActionListener
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == myStart) {
myWayToGo = getWayToGo();
repaint();
}
else if(ae.getSource() == myReset) {
myWayToGo = null;
repaint();
}
else if(ae.getSource() == schwarz) {
farbmodi = 1;
rotverlauf.setSelected(false);
repaint();
}
else if(ae.getSource() == rotverlauf) {
farbmodi = 2;
schwarz.setSelected(false);
repaint();
}
}
public static void main(String[] args) {
new ZeichenbegabteSchildkroete();
}
}
Edit: jar-File im Anhang
Anhänge
Zuletzt bearbeitet: