Swing Manuellen Kreis zeichen

derSoerrn

Aktives Mitglied
Guten Abend zusammen,

mir fehlt gerade ein wenig die Logik wie ich eine Linie zeichne und per Tastendruck dazu auffordere eine RUNDE Kurve zu werden. Meine Gedanken bisher waren, dass ich einen Kreis nehme und ihn auf dem Panel erstmal nur nach rechts bewege (ohne das Panel zu löschen) und sobald man eine Taste drückt (idealer Weise 'links' / 'rechts' oder 'a' / 'd') sich die Linie nach oben bzw. nach unten bewegt. Allerdings kann ich ja nur mit int´s arbeiten, weshalb das alles dann ziemlich eckig aussieht (vgl. das angehängte Bild).

Ich habe mir 8 bools gemacht:

Code:
private boolean right, left, up, down, leftToTop, leftToBottom, rightToTop, rightToBottom

Mit diesen lege ich eben fest, in welche Richtung sich die Linie "bewegen" soll - so:
Java:
					if(right){
						lineX++;
						lineY += 0;
					} else if(left){
						lineX--;
						lineY += 0;
					} else if(up){
						lineX += 0;
						lineY--;
					} else if(down){
						lineX += 0;
						lineY--;
					} else if(rightToTop){
						lineX++;
						lineY--;
					} else if(leftToTop){
						lineX--;
						lineY--;
					} else if(leftToBottom){
						lineX--;
						lineY++;
					} else if(rightToBottom){
						lineX++;
						lineY++;
					}

Ich nehme erstmal am Anfang an, dass rechts true ist. Sobald ich dann einmal nach links drücke muss die Linie sich nach links-oben bewegen (also
Code:
rightToTop = true;

// rest false
)

Wenn ich dann wieder nach rechts gehe muss eben wieder right true werden und wenn ich weiter nach rechts gehe eben rightToBottom.

Ich habe mir überlegt einen Integer "count" zu initialisieren und ihn für rechts zu subtrahieren und für links zu addieren, wobei dann geprüft wird, ob er vor dem addieren/subtrahieren bereits bei 0/7 ist und ihn wenn es so ist jeweils auf 7 bzw. 0 zu setzen.

Jedoch ist dies doch ein ziemlich hässliche Lösung oder nicht? Würde mich sehr über Verbesserungsvorschläge freuen - habe nämlich wie ihr bestimmt merkt noch nie wirklich in JAVA gezeichnet.:oops:

Danke für Eure Hilfe
 

Anhänge

  • zu eckig.PNG
    zu eckig.PNG
    5,8 KB · Aufrufe: 22
Zuletzt bearbeitet:

misterbanana

Mitglied
Hallo,

ich würde mit floats arbeiten und dann winkelfunktionen verwenden.
Du kannst ja anhand der x und y Koordinaten dann je nach eingabe, relativ fließend die
Richtung bestimmen. Ich hoffe du verstehs gerade was ich meine :)

mfg misterbanana
 

derSoerrn

Aktives Mitglied
Verstehen an sich schon. Allerdings weiß ich nicht genau wie ich das umsetzen soll. Hättest du ein Beispiel?

Momentan zeichne ich nämlich so:

Java:
public void paintComponent(Graphics g) {
			// super.paintComponent(g);
			g.setColor(Color.RED);
			g.fillArc((int) lineX, (int) lineY, 10, 10, 360, 360);
		}
 
Zuletzt bearbeitet:

misterbanana

Mitglied
das tupel (x,y) beschreibt eine richtung, so wie du es jetzt bereits machst.
dieses grundprinzip würde ich weiter verfolgen. Nun machst du das stufenlos
indem du bei tastendruck eine richtungsanderungsfunktion aufrufst.
die funktion sollte wohl sowas wie sin oder cos verwenden, die abhängig
von der aktuellen richtung (ggf. mittels counter) die neue richtung berechnet.
der wert der sinusfunktion schwankt ja zwischen -1 und 1
und das kannst du auf x und einmal auf y-achse anwenden.

mfg misterbanana
 
Zuletzt bearbeitet:

misterbanana

Mitglied
um das noch etwas konkreter zu beschreiben:

du hast 2 variablen für die aktuelle Position:
float actX, actY;

zusätzlich 2 variablen die dieser positon eine verschiebung beschreiben:
float deltaX, deltaY;

diese werden mit der methode, die geschrieben werden muss ermittelt


diese deltas müssen bei jedem Aufruf auf die position(actX, actY) addiert werden (delta-werte sind zb zwischen -1 und 1)

dann kannst du mittels typecast so die funktion aufrufen:

g.fillArc((int) actX, (int) actY, 10, 10, 360, 360);

es wird hierbei gerundet.

ich hoffe das hilft dir, sonst einfach fragen.

mfg misterbanana
 

derSoerrn

Aktives Mitglied
Also meinst du ungefähr so?

Java:
g.fillArc((int) (lineX + calcCos(count)), (int) (lineY + calcSin(count)), 10, 10, 360, 360);

Wenn ja, dann funktioniert das nicht :p

count zählt nun bis 360 hoch und wird dann wieder auf null gesetzt. Wenn es kleiner als 0 werden sollte, dann wird es wieder auf 360 gesetzt.

Und die Positionen werden jetzt jeweils mit sinus bzw cosinus von count addiert.

Jedoch steht der Punkt nun auf der Stelle.
 

derSoerrn

Aktives Mitglied
Leider nicht, weil JAVA meint dass Math.sin(360) = 0.9589... sei und von 90 = 0.89399, was ja völliger Quatsch ist oder nicht? wie stelle ich das Bogenmaß aus, bzw wie rechne ich es in Grad um? :D
 
Zuletzt bearbeitet:

derSoerrn

Aktives Mitglied
Ne das Problem ist, dass die Sinus Methode von Java Math im Winkel im Bogenmaß annimmt und nicht wie wir hier in "normalen" Gradzahlen. Muss mal eben noch herausfinden, wie ich das umrechnen kann
 

derSoerrn

Aktives Mitglied
So damit geht es:

Java:
public float sin(int i) {
			double intoRadians = Math.toRadians(i);
			float result = (float) Math.sin(intoRadians);
			if(i == 180 || i == 360){
				return 0;
			}
			return result;
		}

		public float cos(int i) {
			double intoRadians = Math.toRadians(i);
			float result = (float) Math.cos(intoRadians);
			if(i == 90 || i == 270){
				return 0;
			}
			return result;
		}

Allerdings reagiert die "Linie" etwas schwer fällig. Hast du auch noch ne Idee, wie man das besser lösen könnte?
 

derSoerrn

Aktives Mitglied
Hmm. Ich lade dir morgen mal mein Miniprogammcode hier hin. Kannst es dir dann ja anschauen und mir präzise sagen was du für nicht so schön hältst, wenn du willst.
 

derSoerrn

Aktives Mitglied
So hier hast du mal das ganze Programm. Wenn du willst kannst du mir jetzt gerne alles sagen, was nicht so schön gelöst ist :p

Java:
package bewegtesZeichnen;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class XXX {

	public static void main(String[] args) {
		new XXX();
	}

	private JFrame window = new JFrame();
	private Curve curve = new Curve();
	
	private Thread animationThread;

	private boolean playing = true;
	private boolean plus;
	private boolean minus;
	
	private float x = 2;
	private float y = 50;

	private int angle = 360;
	
	public XXX() {		
		window.setSize(1000, 800);
		window.setBackground(Color.BLACK);
		window.setLocationRelativeTo(null);
		window.add(curve);
		window.setFocusable(true);
		window.addKeyListener(curve);
		window.requestFocus();
		load();
		animationThread.start();
		window.requestFocus();
	}

	private void load() {
		// windowListener, um die noch laufenden Threads
		// beim schließen des Fensters zu beenden
		window.addWindowListener(new WindowListener() {

			@Override
			public void windowOpened(WindowEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void windowIconified(WindowEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void windowDeiconified(WindowEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void windowDeactivated(WindowEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}

			@Override
			public void windowClosed(WindowEvent arg0) {
				// TODO Auto-generated method stub
				System.exit(0);
			}

			@Override
			public void windowActivated(WindowEvent arg0) {
				// TODO Auto-generated method stub

			}
		});

		// Sichtbarkeit des Fensters
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				window.setVisible(true);
			}
		});

		// Thread um das Programm am Laufen zu halten:
		animationThread = new Thread(new Runnable() {
			public void run() {
				curve.repaint();
				while (playing) {
					if (x < window.getWidth() - 30 && x > 0 && y > 0
						&& y < window.getHeight() - 30) {
						curve.repaint();
						if (plus) {
							if (angle < 360) {
								angle += 2;
							} else {
								angle = 0;
							}
						} else if (minus) {
							if (angle > 0) {
								angle -= 2;
							} else {
								angle = 360;
							}
						}
					System.out.println(angle);
					try {
						Thread.sleep(150);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					}
				}
			}
		});
	}

	private class Curve extends JPanel implements KeyListener {
		Graphics2D g2d;
		
		private float height = 10f;
		private float width = 10f;

		public Curve() {
			
		}

		public void paintComponent(Graphics g) {
			//super.paintComponent(g);
			
			g2d = (Graphics2D) g;
			g2d.setColor(Color.ORANGE);
			g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
			Ellipse2D.Float circle= new Ellipse2D.Float(getXPos(), getYPos(),
					width, height);
			g2d.fill(circle);
		}

		public float getXPos() {
			float posX = x + cos(angle);
			x = posX;
			return posX;
		}
		
		public float getYPos() {
			float posY = y + sin(angle);
			y = posY;
			return posY;
		}

		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			System.out.println(e.VK_LEFT + " Taste: " + e.getKeyChar());
			if (e.getKeyChar() == 'a' || e.getKeyChar() == 'A'
					|| e.getKeyChar() == e.VK_LEFT) {
				plus = false;
				minus = true;
			} else if (e.getKeyChar() == 'd' || e.getKeyChar() == 'D'
					|| e.getKeyChar() == e.VK_RIGHT) {
				plus = true;
				minus = false;
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			if (e.getKeyChar() == 'a' || e.getKeyChar() == 'A'
					|| e.getKeyChar() == e.VK_LEFT) {
				minus = false;
			} else if (e.getKeyChar() == 'd' || e.getKeyChar() == 'D'
					|| e.getKeyChar() == e.VK_RIGHT) {
				plus = false;
			}
		}

		@Override
		public void keyTyped(KeyEvent e) {

		}

		public float sin(int i) {
			double intoRadians = Math.toRadians(i);
			float result = (float) Math.sin(intoRadians);
			if (i == 180 || i == 360) {
				return 0;
			}
			return result;
		}

		public float cos(int i) {
			double intoRadians = Math.toRadians(i);
			float result = (float) Math.cos(intoRadians);
			if (i == 90 || i == 270) {
				return 0;
			}
			return result;
		}
	}
}
 
Zuletzt bearbeitet:

misterbanana

Mitglied
Hallo,

Java:
public float getXPos() {
            float posX = x + cos(angle);
            x = posX;
            return posX;
}

kann vereinfacht werden zu:

Java:
public float getXPos() {
            x += cos(angle);
            return x;
}

An dieser Stelle kannst du auch du auch die intensität der richtungsänderung anpassen:

Java:
public float getXPos() {
            x += (cos(angle) * 2);
            return x;
}

Für y dann dasselbe.

Damit würde der kreis einen größeren umfang haben. Da dies antiproportional wirkt müsstest du also
für einen kleineren Umfang Werte im bereich ]0,1[ wählen.

Ansonsten läuft das ja soweit.

mfg misterbanana
 

derSoerrn

Aktives Mitglied
Ok stimmt: jedes mal beim Methodenaufruf ein neues float Objekt zu erstellen ist nicht so effizient. Werde das mal ändern.
Sonst meinst du ist alles programmiertechnisch in Ordnung oder würdest du noch mehr ändern?
 

misterbanana

Mitglied
So an sich sieht das, soweit ich mir das angeguckt habe, schonmal ganz gut aus.
Du solltest dir aber auf jeden Fall mal javadoc angucken.
How to Write Doc Comments for the Javadoc Tool
Dann kann man als Außenstehender besser überblicken was wofür gedacht ist (Rückgabewert etc.).

Wenn du das in ner IDE bearbeitest (zb. eclipse), dann ploppt da auch immer schön auf, was die Methoden für Parameter erwarten und
so weiter.

Sonst wäre das Thema für mich erstmal abgeschlossen, falls keine weiteren Fragen bestehen ;)

Und immer schön weiter rumprobieren :)

mfg misterbanana
 

derSoerrn

Aktives Mitglied
Das mit den Kommentaren hätte ich natürlich machen sollen. Hatte aber keine Lust, weil ich das Programm ja eig nur für mich selbst geschrieben habe und da schien es mir unnötig für die 200 Zeilen Code Kommentare zu schreiben :bae:

Das Thema hier wäre dann auch für mich abgeschlossen. Hab aber schon wieder ein neues :oops: Wenn du willst kannst du gerne mal reingucken

Hier ;D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
L 2D-Grafik Linie von Kreis zu Kreis AWT, Swing, JavaFX & SWT 3
S Kreis vergrößern/verkleinern mit Buttons AWT, Swing, JavaFX & SWT 1
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
L 2D-Grafik Dreieck in einem Kreis??? AWT, Swing, JavaFX & SWT 1
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13
J Grafik (Kreis) schneller bewegen? AWT, Swing, JavaFX & SWT 6
E Kreis-Mal-Programm AWT, Swing, JavaFX & SWT 7
S Kreis in Kreis AWT, Swing, JavaFX & SWT 5
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
M 2D-Grafik "Unvollständiger" Kreis(kontur) AWT, Swing, JavaFX & SWT 8
T Einen Kreis anzeigen AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Text in einem Kreis zentrieren AWT, Swing, JavaFX & SWT 3
Semox 2D-Grafik Radialer Verlauf in einem Kreis AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
P Swing FocusTraversalPolicy dreht sich im Kreis AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
Semox Swing Kreis löschen durch Mausklick in der Nähe AWT, Swing, JavaFX & SWT 2
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
K Wenn Mauszeiger in der Nähe vom Kreis, soll Kreis an eine andere Stelle springen AWT, Swing, JavaFX & SWT 8
Spin Hilfe - Erklärungsbedarf für Kreis AWT, Swing, JavaFX & SWT 5
H Punkte im Kreis AWT, Swing, JavaFX & SWT 3
G kreis malen -> welche funktion? AWT, Swing, JavaFX & SWT 3
G Farbe ändern bei Klick auf einen Kreis AWT, Swing, JavaFX & SWT 5
M Kreis mit gedrückter Maus bewegen AWT, Swing, JavaFX & SWT 20
U Farbe von Kreis AWT, Swing, JavaFX & SWT 3
G Kreis zeichnen und mit Maus ziehen AWT, Swing, JavaFX & SWT 3
S Kreis als JFrame AWT, Swing, JavaFX & SWT 9
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
T Kreis ActionListener AWT, Swing, JavaFX & SWT 5
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Swing Tastatur zeichen AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Zeichen werden über unabhängingen JRadioButton nicht gefüllt AWT, Swing, JavaFX & SWT 28
I JOptionPane maximale Zeichen einstellen AWT, Swing, JavaFX & SWT 2
L JavaFX ASCII Zeichen /char von KeyEvent erhalten AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
C JavaFX Tiefgestellte Zeichen in fxml AWT, Swing, JavaFX & SWT 2
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
L Ausgabe in JEditorPane mittels HTMLEditorKit zeigt auf bestimmten Systemen falsche Zeichen AWT, Swing, JavaFX & SWT 1
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
A Zeichen-Steuerelement in Swing AWT, Swing, JavaFX & SWT 0
kaoZ Swing Aktives Zeichen für Spieleprogrammierung ? AWT, Swing, JavaFX & SWT 8
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
R einzelne Zeichen in jTable einlesen AWT, Swing, JavaFX & SWT 10
S SWT [TextBox] Bestimmtes Zeichen entfernen unterbinden AWT, Swing, JavaFX & SWT 3
P readLine solange es mit einem bestimmten Zeichen anfängt AWT, Swing, JavaFX & SWT 5
P Komische Zeichen beim Abspeichern von TextFelder AWT, Swing, JavaFX & SWT 2
Jats Zeichen auf mehrere JPanels AWT, Swing, JavaFX & SWT 7
P 2D-Grafik versch. Rectangles aus array von textfelder zeichen AWT, Swing, JavaFX & SWT 6
DEvent Swing JTextField Anzahl an sichtbaren Zeichen AWT, Swing, JavaFX & SWT 4
D JLabel und JPanel -> Neu zeichen?! oO AWT, Swing, JavaFX & SWT 2
E jTextFiled max 160 Zeichen? AWT, Swing, JavaFX & SWT 4
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
A Rechteck zeichen AWT, Swing, JavaFX & SWT 4
Q AWT Choice ein Zeichen hinzufügen AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Textbasiertes 2D Spiel, jedes Zeichen manipulierbar AWT, Swing, JavaFX & SWT 7
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
T Zeichen/char in Bild umwandeln und darstellen AWT, Swing, JavaFX & SWT 10
2 Bücher über Zeichen und Baumalgorithmen AWT, Swing, JavaFX & SWT 5
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
F Zeichen per Menuitem funktioniert nicht AWT, Swing, JavaFX & SWT 2
V Nur zulässige Zeichen in JTable-Zellen eintragen können AWT, Swing, JavaFX & SWT 2
P Swing Probleme beim Zeichen AWT, Swing, JavaFX & SWT 6
aze JTextfield nur so breit dass alle zeichen sichtbar sind AWT, Swing, JavaFX & SWT 2
3TageBart Ebenen in Zeichen-Programm implementieren AWT, Swing, JavaFX & SWT 9
P Zeichen abhängig davon, ob sich eine Variable geändert hat AWT, Swing, JavaFX & SWT 2
G Blinkenden Punkt zeichen AWT, Swing, JavaFX & SWT 2
G Viele Fehler beim zeichen AWT, Swing, JavaFX & SWT 5
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J jTextarea Anzahl Zeichen in einer Zeile begrenzen AWT, Swing, JavaFX & SWT 2
Lazybone CMYK Zeichen AWT, Swing, JavaFX & SWT 12
H Polyline zeichen, aber wie? AWT, Swing, JavaFX & SWT 2
D jTable ausdrucken => € zeichen wird nicht richtig angezei AWT, Swing, JavaFX & SWT 7
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
K UNICODE ZEICHEN in den SWing-GUIs AWT, Swing, JavaFX & SWT 4
B Dreiecke zeichen AWT, Swing, JavaFX & SWT 3
D Zeichen ein Pixel mit Java2D AWT, Swing, JavaFX & SWT 15
C JFormattedTextField - nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 3
F Zeichen von Linien, Rechtecken, zb wie in paint AWT, Swing, JavaFX & SWT 2
B Zeichen werden im JFormattedTextField überschrieben AWT, Swing, JavaFX & SWT 3
C PI-Zeichen im JLabel AWT, Swing, JavaFX & SWT 3
G Zeilenumbruch nach n Zeichen in JTextArea AWT, Swing, JavaFX & SWT 24
U kleiner-Zeichen JEditorPanel (war: JOptionPane) AWT, Swing, JavaFX & SWT 5
T JLayerdPane: wie etwas über eine AWT Komponente zeichen? AWT, Swing, JavaFX & SWT 2
N Tastatur Zeichen einlesen ohne sichtbares Fenster AWT, Swing, JavaFX & SWT 8
D JTextPane: "Nichtdruckbare Zeichen" anzeigen & AWT, Swing, JavaFX & SWT 4
R letztes Zeichen aus textfeld auslesen AWT, Swing, JavaFX & SWT 2
M rendern von zeichen AWT, Swing, JavaFX & SWT 4
R Zeichen-Markierungrahmen AWT, Swing, JavaFX & SWT 5
F Eingabe in JPasswordField auf vier Zeichen beschränken AWT, Swing, JavaFX & SWT 3
M Transparentes gif als extra Klasse auf einen JFrame zeichen AWT, Swing, JavaFX & SWT 17
B ComboBox: nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben