# Objekt in Kreisbahn bewegen



## Trendsoundz (24. Dez 2010)

Frohe Weihnachten allerseits=)
Ich würde gerne wissen wir man ein Objekt in der Kreisbahn am besten bewegen kann.
Hat da jemand eine Idee?
Ich will das Objekt nicht um 360° drehen,sondern es soll eine Kreisbahn bilden.


----------



## Runtime (24. Dez 2010)

Den Pivot verschieben?


----------



## Trendsoundz (24. Dez 2010)

Kannst du mich mal genauer Aufklären was du mit Pivot meinst??=)


----------



## Runtime (24. Dez 2010)

Den Drehungsmittelpunkt.


----------



## André Uhres (24. Dez 2010)

Hallo Trendsoundz,

versuch's mal so:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SimpleJoystickDemo extends JFrame {

    private int displayWidth = 340;
    private int displayHeight = 550;
    private final Point position;

    public SimpleJoystickDemo() {
        super("SimpleJoystickDemo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(displayWidth, displayHeight);
        setLocationRelativeTo(null);
        position = new Point();
        SimpleJoystick myJoystick = new SimpleJoystick(150, position, 100);
        add(myJoystick, BorderLayout.PAGE_END);
        Drawing drawing = new Drawing(position);
        add(drawing);
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                new SimpleJoystickDemo().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }

    class Drawing extends JPanel {

        private final Point position;

        public Drawing(Point position) {
            this.position = position;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(Color.RED);
            g2.fillOval(160 + position.x, 160 - position.y, 15, 15);
        }
    }
}

class SimpleJoystick extends JPanel {

    //Maximum value for full horiz or vert position where centered is 0:
    private int joyOutputRange;
    private float joySize;     //joystick icon size
    private float joyWidth, joyHeight;
    private float joyCenterX, joyCenterY;  //Joystick displayed Center
    //Display positions for text feedback values:
    private int textHorizPos, textVertPos;
    private int fontSpace = 12;
    private float curJoyAngle;    //Current joystick angle
    private float curJoySize;     //Current joystick size
    private boolean isMouseTracking;
    private boolean leftMouseButton;
    private int mouseX, mouseY;
    private Stroke lineStroke = new BasicStroke(10,
            BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
    private final Point position;

    public SimpleJoystick(final int joyOutputRange, final Point position,
            final int joySize) {
        this.joyOutputRange = joyOutputRange;
        this.position = position;
        this.joySize = joySize;
        joyWidth = joySize;
        joyHeight = joyWidth;
        setPreferredSize(new Dimension((int) joyWidth + 250,
                (int) joyHeight + 80));
        joyCenterX = getPreferredSize().width / 2;
        joyCenterY = getPreferredSize().height / 2;
        this.joySize = joyWidth / 2;
        setBackground(new Color(226, 226, 226));
        MouseAdapter mouseAdapter = new MouseAdapter() {

            @Override
            public void mouseMoved(final MouseEvent e) {
                mouseCheck(e);
            }

            @Override
            public void mousePressed(final MouseEvent e) {
                leftMouseButton = SwingUtilities.isLeftMouseButton(e);
                mouseCheck(e);

            }
        };
        addMouseMotionListener(mouseAdapter);
        addMouseListener(mouseAdapter);
    }

    private void mouseCheck(final MouseEvent e) {
        mouseX = e.getX();
        mouseY = e.getY();
        float dx = mouseX - joyCenterX;
        float dy = mouseY - joyCenterY;
        if (leftMouseButton) {
            isMouseTracking = true;
        } else {
            isMouseTracking = false;
        }
        if (isMouseTracking) {
            curJoyAngle = (float) Math.atan2(dy, dx);
            curJoySize = (float) Point.distance(mouseX, mouseY,
                    joyCenterX, joyCenterY);
        } else {
            curJoySize = 0;
        }
        if (curJoySize > joySize) {
            curJoySize = joySize;
        }
        position.x = (int) (joyOutputRange * (Math.cos(curJoyAngle)
                * curJoySize) / joySize);
        position.y = (int) (joyOutputRange * (-(Math.sin(curJoyAngle)
                * curJoySize) / joySize));
        SwingUtilities.getRoot(SimpleJoystick.this).repaint();
    }

    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(Color.LIGHT_GRAY);
        g2.fillOval((int) (joyCenterX - joyWidth / 2),
                (int) (joyCenterY - joyHeight / 2),
                (int) joyWidth, (int) joyHeight);
        //rotate and draw joystick line segment:
        Graphics2D g3 = (Graphics2D) g2.create();
        g3.translate(joyCenterX, joyCenterY);
        g3.rotate(curJoyAngle);
        g3.setColor(Color.GRAY);
        g3.setStroke(lineStroke);
        g3.drawLine(0, 0, (int) curJoySize, 0);
        g3.dispose();
        //
        g2.setColor(Color.GRAY);
        g2.fillOval((int) joyCenterX - 10,
                (int) joyCenterY - 10, 20, 20);
        textHorizPos = 50;
        textVertPos = (int) (joyCenterY - 50);
        g2.drawString("Horiz:", textHorizPos, textVertPos);
        textHorizPos += (4 * fontSpace);
        g2.drawString(String.valueOf((int) position.x), textHorizPos,
                textVertPos);
        textHorizPos = 50;
        textVertPos += 12;
        g2.drawString("Vert:", textHorizPos, textVertPos);
        textHorizPos += (4 * fontSpace);
        g2.drawString(String.valueOf((int) position.y), textHorizPos,
                textVertPos);
        g2.setColor(Color.BLUE);
        g2.drawString("START = left mouse click", 10, 20);
        g2.drawString("STOP = right mouse click", 160, 20);
    }
}
```

Gruß,
André

EDIT: Es geht natürlich auch ohne die Klasse SimpleJoystick automatisch mit einem javax.swing.Timer:

```
Timer timer = new Timer(10, new ActionListener() {

    private double currentAngle, radius = 155;

    public void actionPerformed(ActionEvent e) {
        currentAngle++;
        if (currentAngle > 360) {
            currentAngle = 0;
        }
        float angle = (float) Math.toRadians(currentAngle);
        position.x = (int) (radius * Math.cos(angle));
        position.y = (int) (radius * -(Math.sin(angle)));
        drawing.repaint();
    }
});
timer.start();
```


----------



## Landei (25. Dez 2010)

Gegeben sei der Kreismittelpunkt x0, y0 und der Kreisradius r. Dann ändert sich der Drehwinkel alpha konstant mit der Zeit, und die Koordinaten berechnen sich zu 

x = x0 + r*sin(alpha);
y = y0 + r*cos(alpha);

(oder Vorzeichen und Winkelfunktionen vertauscht, je nach gewünschter Drehrichtung und Startposition). Winkelangaben sind natürlich nicht in Grad, sondern in Bogenmaß, und es empfielt sich, beim Winkeln 2pi (also 360°) abzuziehen, wenn er größer als 2pi wird, um numerische Ungenauigkeiten zu verringern.


----------

