Rollkurven (zykloide) darstellen

lachzb9be

Mitglied
Hallo,

ich brauch dringend Hilfe. Undzwar möchte ich ein Javaprogramm coden, dass eine Zykloide zeichnen kann. (Zykloide ? Wikipedia) Das Zeichnen ansich geht schonmal . nun möchte ich das animieren das der graph quasi stück für stück entsteht (aber nicht als javascript). wäre nett wenn mir wer helfen kann.
VIelen Dank schonmal
Java:
import java.awt.*;
import java.awt.event.ActionListener;

import javax.swing.JPanel;



public class Cycloid extends JPanel {

    int r1;
    int r2;
    Polygon p;
    Point pu;
    int centerx = 50;
    int centery= 100;
    final int numPoints = 100;




      
	public Cycloid (int inner , int outer) {
		r1 = inner;
		r2 = outer;
		p = new Polygon ( );
		for (int t = 0; t <  numPoints; t++) {
			double theta = 2.0 * Math.PI * t / numPoints;
			double x = (r1 + r2) * Math.cos (theta) + r2 * Math.cos (theta * r1 / r2);
			double y = (r1 + r2) * Math.sin  (theta) + r2 * Math.sin  (theta * r1 / r2);
			p.addPoint ( centerx + (int)x,  centery +(int) y);
		}
	}
	public Cycloid (int rad) {
		r1 = rad;
		p = new Polygon ();
		for (double t = 0; t <  numPoints;) {
			double x = (r1) * (t - Math.sin (t));
			double y = (r1) *(1- Math.cos  (t));
			p.addPoint ( centerx + (int)x,  centery -(int) y);
			t=t+0.01;
		}
	}


	public void paintComponent (Graphics g) {
		   super.paintComponent (g);
		   g.setColor (Color.blue);
		   g.drawPolygon (p);
		   repaint();
		   }
		   
		
}

und hier die testklasse

Java:
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class testCycloid  extends JFrame implements ActionListener{
	private JTextField eingabe;
	private JButton uebernehmen;
	int radius;
	public testCycloid () {
		eingabe = new JTextField(10);
		uebernehmen = new JButton("Übernehmen");
		uebernehmen.addActionListener(this);
		getContentPane ().setLayout (new GridLayout ());
		getContentPane ().add (eingabe);
		getContentPane ().add (uebernehmen);
		pack();
		};
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand() == "Übernehmen")
				radius = Integer.parseInt (eingabe.getText());
				getContentPane ().add  (new Cycloid (radius));
				repaint();
		  }
	public static void main(String[ ] args) {
				testCycloid pict = new testCycloid();
				pict.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
				//pict.setSize (1024, 300);
				pict.setVisible (true);
		
	}
}

des weiteren wäre es gut wenn der rollkreis auch mit dargestellt werden würde in der animation
 
S

SlaterB

Gast
'wäre es gut wenn der rollkreis auch mit dargestellt werden'
da du den bisher gewiss noch gar nicht hast ist das eine kühne Formulierung, komplizierter als das komplette Restprogramm ;),

was du brauchst ist ein Thread mit einer Schleife, der alle 50ms ein oder ein paar Punkte ins Polygon hinzufügt und repaint() aufruft
schau dir z.B.
Animation: Swing and thread : Swing ThreadThreadsJava
an

den Kreis musst du auch modellieren, zu jedem Zeitpunkt vor dem repaint nicht nur das Polygon aktuell halten, sondern irgendwo
auch den ausgerechneten Mittelpunkt des Kreises speichern und in paint dann den Kreis malen + eine Kante vom letzten Punkt des Polygons zum Mittelpunkt des Kreises oder was auch immer nötig ist
 

lachzb9be

Mitglied
hey danke für deine schnelle antwort. leider bin ich recht neu was das ganze java coden angeht. mit diesem buffered kram kann ich nicht viel anfangen. gibts nicht ne möglichtkeit das polygon einfach stückweise auszugeben?

habs mal mit nem thread sleep versucht beim points adden. problem nun ist dass das fenster erst aufgeht wenn alles fertig ist :(

Java:
import java.awt.*;
import java.awt.event.ActionListener;

import javax.swing.JPanel;



public class Cycloid extends JPanel {

    int r1;
    int r2;
    Polygon p;
    Point pu;
    int centerx = 50;
    int centery= 100;
    final int numPoints = 100;




      
	public Cycloid (int inner , int outer) {
		r1 = inner;
		r2 = outer;
		p = new Polygon ( );
		for (int t = 0; t <  numPoints; t++) {
			double theta = 2.0 * Math.PI * t / numPoints;
			double x = (r1 + r2) * Math.cos (theta) + r2 * Math.cos (theta * r1 / r2);
			double y = (r1 + r2) * Math.sin  (theta) + r2 * Math.sin  (theta * r1 / r2);
			p.addPoint ( centerx + (int)x,  centery +(int) y);
		}
	}
	public Cycloid (int rad) {
		r1 = rad;
		p = new Polygon ();
		for (double t = 0; t <  numPoints;) {
			double x = (r1) * (t - Math.sin (t));
			double y = (r1) *(1- Math.cos  (t));
			p.addPoint ( centerx + (int)x,  centery -(int) y);
			t=t+0.01;
			try {
				Thread.sleep(1);
				
				} catch (InterruptedException e){}	
				
		}
	}


	public void paintComponent (Graphics g) {
		   super.paintComponent (g);
		   g.setColor (Color.blue);
		   g.drawPolygon (p);
		   repaint();
		   }
		   
		
}



Hab dann noch was anderes probiert. Hier animiert er das ganze nur es sieht aus als wenn er nen fill polygon macht sieht total komisch aus.

Java:
import java.awt.*;
import java.awt.event.*;

public class Example2404
extends Frame
implements Runnable
{

   public static void main(String[] args)
   {
      Example2404 wnd = new Example2404();
      wnd.setSize(550,550);
      wnd.setVisible(true);

   }

   public Example2404()
   {
      super("Example2404");
      setBackground(Color.lightGray);
      //WindowListener
      addWindowListener(
         new WindowAdapter() {
            public void windowClosing(WindowEvent event)
            {
               System.exit(0);
            }
         }
      );
   }




   public void paint(Graphics g)
   {	
	    g.setColor (Color.blue);
		int r1 = 10;
		Polygon p = new Polygon ();
		for (double t = 0; t <  50;) {
			double x = (r1) * (t - Math.sin (t));
			double y = (r1) *(1- Math.cos  (t));
			p.addPoint ( 10 + (int)x,  50 -(int) y);
			t=t+0.02;	
			try {
	            Thread.sleep(10);
	            repaint();
	         } catch (InterruptedException e) {
	            //nichts
	         }
	        repaint();
			g.drawPolygon (p);
   }
   }
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
die Struktur vom Link ist schon unumgänglich,
du brauchst ein Thread, in etwa so mit Runnable + run()-Methode, wie dort zu sehen,
was ein Thread ist usw. kannst du in Lehrbüchern/ Internet nachlesen,
ich empfehle auch dieses Tutorial:
http://www.ralf-bauer.org/java/tutorial/Tutorial.zip

nur 'irgendwo anders' eine Schleife einzufügen, das bringt nix,
eine sleep-Zeit von 1 ms ist auch etwas knapp, unter 30 ist eher Zufall ob Java überhaupt ne Pause macht,
und 30ms wären immer noch 33x pro Sekunde, das sollte doch reichen
 
S

SlaterB

Gast
draw malt hier anscheindend ein geschlossenes Polygon,

verwende nur einmal
> g.drawPolygon (p);
am Ende nach der Schleife und teste verschiedene t,
und jetzt stell dir vor wie die alle übereinander gemalt werden,

auch dein Programm mit
> t = t + 1;
statt
> t=t+0.02;
zeigt etwas genauer was passiert, dazu dann besser
> Thread.sleep(100);

generell ist aber schwer verboten, in paint sleep() oder repaint() aufzurufen

------

das Problem mit den geschlossenen Polygon wirst du allerdings mit Thread genauso haben,
da muss man einen besseren Befehl suchen, oder alle Punkte in entgegensetzter Reihenfolge nochmal einfügen,
damit das Polygon in Kurve zurücktapselt statt eine glatte Linie zum Ursprung zu ziehen ;)
 
Zuletzt bearbeitet von einem Moderator:

lachzb9be

Mitglied
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class SwingWithThread extends JComponent {
  private Image[] frameList;

  private long msPerFrame;

  private volatile int currFrame;

  private Thread internalThread;
  int r1;
  Polygon p;
  double t= 0;
  private volatile boolean noStopRequested;

  public SwingWithThread(int width, int height, long msPerCycle, int framesPerSec,
      Color fgColor) {

    setPreferredSize(new Dimension(width, height));

    int framesPerCycle = (int) ((framesPerSec * msPerCycle) / 1000);
    msPerFrame = 1000L / framesPerSec;

    frameList = buildImages(width, height, fgColor, framesPerCycle);
    currFrame = 0;

    noStopRequested = true;
    Runnable r = new Runnable() {
      public void run() {
        try {
          runWork();
        } catch (Exception x) {
          // in case ANY exception slips through
          x.printStackTrace();
        }
      }
    };

    internalThread = new Thread(r);
    internalThread.start();
  }

  private Image[] buildImages(int width, int height, Color color, int count) {

    BufferedImage[] im = new BufferedImage[200];

    for (int i = 0; i < 200; i++) {
      im[i] = new BufferedImage(width, height,
          BufferedImage.TYPE_INT_ARGB);

		r1 = 10;
		p = new Polygon ();
			double x = (r1) * (t - Math.sin (t));
			double y = (r1) *(1- Math.cos  (t));
			p.addPoint ( 50 + (int)x,  50 -(int) y);
			t=t+0.01;
      
      
      
      Graphics2D g2 = im[i].createGraphics();
      g2.setColor(color);
      g2.draw(p);
      g2.dispose();
    }

    return im;
  }

  private void runWork() {
    while (noStopRequested) {
      currFrame = (currFrame + 1) % frameList.length;
      repaint();

      try {
        Thread.sleep(msPerFrame);
      } catch (InterruptedException x) {
        Thread.currentThread().interrupt();
      }
    }
  }

  public void stopRequest() {
    noStopRequested = false;
    internalThread.interrupt();
  }

  public boolean isAlive() {
    return internalThread.isAlive();
  }

  public void paint(Graphics g) {
    g.drawImage(frameList[currFrame], 0, 0, this);
  }

  public static void main(String[] args) {
    SwingWithThread redSquish = new SwingWithThread(500, 500, 2500L, 5, Color.blue);
    JFrame f = new JFrame();
    f.setLayout(new FlowLayout());
    f.add(redSquish);
    f.setSize(450, 250);
    f.setVisible(true);
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
  }
}
 
S

SlaterB

Gast
nur weil der Link komplizierte Sachen enthält wie die BufferedImages oder komplizierte Berechnung der FramesPerSecond, muss man die nicht alle auch verwenden,
wenn man ungefähr ne Ahnung hat, was ein Thread ist, dann kann man dort die Verwendung erkennen,
aber das magst du wohl nicht vorher lernen..

naja, damit es mal voran geht:
Java:
public class Test {
    public static void main(String[] args)    throws Exception  {
        SwingWithThread redSquish = new SwingWithThread();
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(redSquish);
        f.setSize(450, 250);
        f.setVisible(true);
    }
}

class SwingWithThread  extends JPanel {
    int r1 = 10;
    Polygon p = new Polygon();
    double t = 0;

    public SwingWithThread()  {
        Runnable r = new Runnable()  { // viel blah blah-Code, nur damit runWort() nebenläufig läuft
                public void run()  {
                    try  {
                        runWork();
                    }  catch (Exception x)  {
                        x.printStackTrace();
                    }
                }
            };
        new Thread(r).start();
    }

    private void runWork()  throws Exception {
        while (true)  { // in einer Schleife den Zustand alle x ms ändern
            double x = (r1) * (t - Math.sin(t)); 
            double y = (r1) * (1 - Math.cos(t));
            p.addPoint(50 + (int)x, 50 - (int)y);
            t = t + 1;
            repaint(); // Zeichnen veranlassen
            Thread.sleep(300);
        }
    }

    public void paintComponent(Graphics g) { // besser als paint
        super.paintComponent(g);
        g.drawPolygon(p); // einfach nur aktuellen Zustand malen
    }
}
 
Zuletzt bearbeitet von einem Moderator:

lachzb9be

Mitglied
wow super ich danke dir dann versuch ich nun mal da durchzusteigen und den kreis einzufügen und vllt das polygon durch ne polyline zu ersetzen das man dieses geschlossene nicht hat
 

lachzb9be

Mitglied
problem bei der polyline ist er erwartet 2 int arrays mit den punkten für x und y und n für anzahl der punkte wenn ich das einbaue und dann unten die polyline zeichnen lasse macht er wieder nüscht :(
 
S

SlaterB

Gast
Path2D also besser, siehe Marco13

wollte noch erwähnen dass ich die t-Ändeung und sleep() modifiziert habe, kannst du auch wieder erhöhen damit nicht so keine Krakelkurve rauskommt
 

lachzb9be

Mitglied
jo hab ich schon gesehn vielen dank euch 2 ich guck mit mal das path2d an ob ich das hinebkomme und nochmals danke


Path2D klappt super vielen dank!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
G Ampel graphisch darstellen AWT, Swing, JavaFX & SWT 2
T JComponents zur Laufzeit auf JPanel darstellen AWT, Swing, JavaFX & SWT 10
Augenblau JavaFX Wechselnde Werte in Label darstellen AWT, Swing, JavaFX & SWT 7
H Karte mit JXMapKit darstellen AWT, Swing, JavaFX & SWT 0
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
M Jtable besser darstellen AWT, Swing, JavaFX & SWT 6
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
J Mehrere Hyperlinks "stilvoll" darstellen. AWT, Swing, JavaFX & SWT 1
C Ventilator Geschwindigkeit darstellen AWT, Swing, JavaFX & SWT 1
A 3D-Grafik 3D Gitter Darstellen AWT, Swing, JavaFX & SWT 1
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
H Swing Arbeitsspeicherauslastung anderer Programme grafisch darstellen AWT, Swing, JavaFX & SWT 16
J jTable anders darstellen AWT, Swing, JavaFX & SWT 4
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
M Array grafisch darstellen AWT, Swing, JavaFX & SWT 9
D JOptionPane.QUESTION_MESSAGE Fett darstellen AWT, Swing, JavaFX & SWT 4
B Signal als Diagramm darstellen AWT, Swing, JavaFX & SWT 6
D Swing Bresenham Linienalgorithmus grafisch darstellen AWT, Swing, JavaFX & SWT 6
B 3D-Grafik Punkt in JAVA3D darstellen AWT, Swing, JavaFX & SWT 2
M In JField eine Kommazahl darstellen java.lang.NumberFormatException AWT, Swing, JavaFX & SWT 4
M Swing XML Datei in JTable darstellen + verändern AWT, Swing, JavaFX & SWT 3
X Icons in einer Spalte darstellen AWT, Swing, JavaFX & SWT 6
C Text in einer Seitenansicht darstellen AWT, Swing, JavaFX & SWT 3
M 2x JComponent in einem JFrame darstellen? AWT, Swing, JavaFX & SWT 7
Y Word Dokument im JPanel darstellen AWT, Swing, JavaFX & SWT 5
T Zeichen/char in Bild umwandeln und darstellen AWT, Swing, JavaFX & SWT 10
Zettelkasten Swing anklickbaren Link darstellen AWT, Swing, JavaFX & SWT 2
D Texte zeichenweise übereinander darstellen, gemeinsam umbrechen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
J 3D-Grafik JOGL - Verschiedene Perspektiven darstellen AWT, Swing, JavaFX & SWT 5
destroflyer Swing UTF-8 in JEditorPane darstellen AWT, Swing, JavaFX & SWT 5
A SWT: Daten in Raster mit Gitternetzlinien darstellen AWT, Swing, JavaFX & SWT 7
C JTable: Mehrere Farben in einer Zelle darstellen AWT, Swing, JavaFX & SWT 10
X Swing JList -> Daten anders darstellen als im Model hinterlegt -> möglich ? AWT, Swing, JavaFX & SWT 9
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
M Swing Prozentwerte grafisch darstellen - wie? AWT, Swing, JavaFX & SWT 4
T JFrame als JInternalFrame darstellen AWT, Swing, JavaFX & SWT 2
R Wie in GUI System.out's darstellen AWT, Swing, JavaFX & SWT 8
prakdi grafisches Darstellen von einer Parabel?![JAVA] AWT, Swing, JavaFX & SWT 2
M Bilder in einem Textfeld darstellen AWT, Swing, JavaFX & SWT 2
C Swing JComboBox - Problem bei Darstellen von ImageIcon AWT, Swing, JavaFX & SWT 4
M Java-Quellcode im Paanel mit Syntax-highlightning darstellen? AWT, Swing, JavaFX & SWT 2
T Choice "gezielt" darstellen aber wie - mit Koordinaten aber wie? AWT, Swing, JavaFX & SWT 6
F Einfaches Fenster "ordentlich" darstellen AWT, Swing, JavaFX & SWT 8
J Konsolentabelle darstellen AWT, Swing, JavaFX & SWT 7
F "Objekte" mit "Verbindungen" grafisch darstellen AWT, Swing, JavaFX & SWT 4
S Swing JTable: in erster Spalte Image darstellen AWT, Swing, JavaFX & SWT 30
Antoras Swing Umfangreiche formatierte Texte in Fenster darstellen AWT, Swing, JavaFX & SWT 2
R MousePosition über mehrere JPanels darstellen AWT, Swing, JavaFX & SWT 13
M Darstellen eines Bildes AWT, Swing, JavaFX & SWT 3
D java.lang.IllegalArgumentException beim Darstellen eines Panels AWT, Swing, JavaFX & SWT 7
S Datum in Tabelle darstellen? AWT, Swing, JavaFX & SWT 4
R JTable: Tabelle neu darstellen AWT, Swing, JavaFX & SWT 6
R JTable darstellen von leeren Zellen AWT, Swing, JavaFX & SWT 12
R JTable Darstellen der selektierten Zelle braucht lange AWT, Swing, JavaFX & SWT 7
S Mathematische Förmeln darstellen AWT, Swing, JavaFX & SWT 5
J JComboBox geöffnet darstellen AWT, Swing, JavaFX & SWT 5
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
1 Laden einer Datei zur Echtzeit Darstellen AWT, Swing, JavaFX & SWT 7
P HTML darstellen mit Java AWT, Swing, JavaFX & SWT 4
G Icon und Text in JTable darstellen AWT, Swing, JavaFX & SWT 3
F Ein JLayerdPane in einem JScrollPane darstellen AWT, Swing, JavaFX & SWT 2
SebSnake Animiertes GIF auf JPG Hintergrund darstellen? AWT, Swing, JavaFX & SWT 3
J .ps Bilder in JavaApplication darstellen AWT, Swing, JavaFX & SWT 4
J Titel im aktive JTabbedPane tab fett darstellen AWT, Swing, JavaFX & SWT 4
O DB-Zugriff + wie darstellen? AWT, Swing, JavaFX & SWT 6
P JScrollPane ohne Komponente in definierter Größe darstellen AWT, Swing, JavaFX & SWT 6
W Selbes Steuerelement auf 2 Fenster darstellen und zeichnen AWT, Swing, JavaFX & SWT 3
K JComboBox in DefaultTableModel darstellen AWT, Swing, JavaFX & SWT 2
T Bilder von Webcam darstellen AWT, Swing, JavaFX & SWT 3
M Windows-Fensterinhalt in Java-Applikation darstellen AWT, Swing, JavaFX & SWT 6
M Applet in JFrame darstellen AWT, Swing, JavaFX & SWT 2
Firefork JPopupMenu unter einem Schalter darstellen AWT, Swing, JavaFX & SWT 2
M JTable text zentriert darstellen AWT, Swing, JavaFX & SWT 5
G TableCellRenderer Background variiert darstellen AWT, Swing, JavaFX & SWT 3
S Text farbig darstellen AWT, Swing, JavaFX & SWT 3
F Frame in Frame darstellen AWT, Swing, JavaFX & SWT 2
S JComponent in JPanel darstellen AWT, Swing, JavaFX & SWT 2
B JFrame Transparent darstellen AWT, Swing, JavaFX & SWT 4
S JDialog durchsichtig darstellen ? AWT, Swing, JavaFX & SWT 2
F kleine Zahlen/buchstaben mit Java darstellen? AWT, Swing, JavaFX & SWT 3
J Große Anzahl von Comboboxen in Tabelle darstellen AWT, Swing, JavaFX & SWT 2
B Vectorinhalt in Tabellenzelle darstellen AWT, Swing, JavaFX & SWT 3
G Knoten im Jtree mit unterscheidlichen Farben darstellen AWT, Swing, JavaFX & SWT 5
$ JTree in JTable darstellen und selectieren AWT, Swing, JavaFX & SWT 13
T Festen Text mit Absätzen darstellen AWT, Swing, JavaFX & SWT 3
D Mit JOptionPane einen Link darstellen AWT, Swing, JavaFX & SWT 10
C Dasselbe JLabel mehrmals darstellen AWT, Swing, JavaFX & SWT 11
M Datenbericht aus Datenbank darstellen.(einfaches Konzept) AWT, Swing, JavaFX & SWT 2
S JTree in einem JTree darstellen AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen


Oben