Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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);

		}

	}

}


Der Kreis sollte sich von der Mitte aus bewegen. Wenn man zielx und ziely auf 350 setzt bewegt sich der Kreis wie er sollte.

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

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.

Danke,

habs jetzt endlich geschafft. :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.