markint Geschrieben 29. März 2009 Geschrieben 29. März 2009 Hallo, ich habe ein Problem mit der Bewegung auf meinem Radar. Der Kreis der sich bewegt ist bei einer hohen Steigung zu schnell und man sieht nicht mehr die Bewegung. Hat jemand eine Idee wie man das lösen kann, sodass immer die gleiche Bewegungsgeschwindigkeit vollzogen wird? import javax.swing.*; import java.awt.*; public class Animation { private int startx = 300;//Startpunkt private int starty = 300;//Startpunkt private int zielx = 100;//Zielpunkt private int ziely = 440;//Zielpunkt public static void main(String[] args){ Animation a = new Animation(); a.go(); } public void go(){ JFrame frame = new JFrame(); frame.setSize(577, 597); frame.setResizable(false); MyPanel panel = new MyPanel(); frame.add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); double m = calculateAlterationRate(startx, starty, zielx, ziely); //Steigung einer Geraden. //Routenberechnung(FEHLERHAFT!!) //Der If-Block macht überhaupt nichts richtig. if (Math.abs(m) < 1){ double reciprocal = 1/m; if(ziely >= starty){ while(!(zielx-10 <= startx && startx <= zielx+10) || !(ziely-10 <= starty && starty <= ziely)){ startx = (int)Math.round(startx - reciprocal); starty++; panel.repaint(); try{ Thread.sleep(200); } catch(InterruptedException e){ e.printStackTrace(); } } } else{ while(!(zielx-10 <= startx && startx <= zielx+10) || !(ziely-10 <= starty && starty <= ziely)){ startx = (int)Math.round(startx - reciprocal); starty--; panel.repaint(); try{ Thread.sleep(200); } catch(InterruptedException e){ e.printStackTrace(); } } } } //Dieser Else-Block hier scheint(!) korrekt zu laufen. Zumindest habe ich noch kein Gegenbeispiel gefunden. else{ if(zielx >= startx){ while(!(zielx-10 <= startx && startx <= zielx+10) || !(ziely-10 <= starty && starty <= ziely)){ starty = (int)Math.round(m + starty); startx++; panel.repaint(); try{ Thread.sleep(200); } catch(InterruptedException e){ e.printStackTrace(); } } } else{ while(!(zielx-10 <= startx && startx <= zielx+10) || !(ziely-10 <= starty && starty <= ziely)){ starty = (int)Math.round(starty - m); startx--; panel.repaint(); try{ Thread.sleep(200); } catch(InterruptedException e){ e.printStackTrace(); } } } } } private double calculateAlterationRate(int startx,int starty,int zielx,int ziely){ return (ziely - starty)/(zielx - startx); //Steigung einer Gerade } class MyPanel extends JPanel { //der Radar mit einem Kreis public void paint(Graphics g){ g.setColor(Color.gray); g.fillRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(new Color((float)0.2, (float)0.2, (float)0.2)); g.fillOval(0, 0, 570, 570); g.setColor(Color.black); g.fillOval(35, 35, 500, 500); g.setColor(Color.white); g.drawOval(35, 35, 500, 500); g.setColor(new Color((float)0.0, (float)1.0, (float)0.5)); drawCircles(g); g.setColor(Color.white); g.fillOval(startx, starty, 20, 20); } private void drawCircles(Graphics g){ g.drawOval(235, 235, 100, 100); g.drawOval(185, 185, 200, 200); g.drawOval(135, 135, 300, 300); g.drawOval(85, 85, 400, 400); } } } Zitieren
flashpixx Geschrieben 29. März 2009 Geschrieben 29. März 2009 Ich kann das nicht nachvollziehen, bei mir läuft der Kreis gleichförmig nach unten aus dem Bild und die Geschwindigkeit ist sehr langsam Phil Zitieren
markint Geschrieben 29. März 2009 Autor Geschrieben 29. März 2009 Der Kreis sollte sich von der Mitte aus bewegen. Wenn man zielx und ziely auf 350 setzt bewegt sich der Kreis wie er sollte. Zitieren
flashpixx Geschrieben 29. März 2009 Geschrieben 29. März 2009 Um die korrekte Bahn zu berechnen zu können, benötigst Du den Winkel der zwischen der Hypotenuse und der Kathete des rechtwinklingen Dreiecks aus den Koordinatenpunkten existiert. Die Hypothenuse ist die Seite, die Ziel- und Startpunkt verbindet. Rechne Dir diesen Winkel aus und damit kannst Du dann die jeweilige Pixelposition in der Iteration bestimmen. Phil Zitieren
speedi Geschrieben 30. März 2009 Geschrieben 30. März 2009 Wenn du eine gradlinige Bewegung zwischen Start und Zielpunkt berechnen willst erstell dir doch einfach einen Bewegungsvektor: double stepX = ((double)zielX-(double)startX)/(double)anzahlDerGeünschtenZyklen; double stepY = ((double)zielY-(double)startY)/(double)anzahlDerGeünschtenZyklen; danach berechnest du die derzeitigePosition wie folgt: int currentX = (int)(startX+stepX*derzeitigerZyklus); int currentY = (int)(startY+stepY*derzeitigerZyklus); Im übrigen: Mach die Berechnungen in Zukunft besser in einem Thread (oder verwende vorhandene technologien um es zu parallelisieren (z.B. Timer)). Wenn du nämlich eine interaktive GUI hättest, wäre diese für die Zeit der Simulation nicht mehr bedienbar. Zitieren
markint Geschrieben 6. April 2009 Autor Geschrieben 6. April 2009 Danke, habs jetzt endlich geschafft. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.