Kreis animiert zeichnen

Vielleicht sollte man nebenbei nochmal auf Math#toDegrees(double) und insbesondere Math#toRadians(double) hinweisen…

hm… also ich seh ja nix, weil com.jgoodies hab ich nicht…
versteh auch nicht, warum man das braucht, wenn es doch die einfachste Implementation tun soll…
nee und mit t… also das war ja eigentlich ziemlich klar beschrieben…
Wenn es denn ein Winkel sein soll… ich mein das ist ja von hinten durch die Brust, aber egal… geht natürlich auch über t…

double t = arcAngle / 180;

wär ja ok… andererseits…
dann setzt man halt gleich ein** sin( Math.toRadians( arcAngle ) )** bzw. halt auch beim cos();

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder;

public class Fesnter extends JFrame 
{ 
	private JPanel contentPane; 
	private int arcAngle = 0; 
	private int arcdelta = 5;
	public static void main(String[] args) 
	{ 
		EventQueue.invokeLater(new Runnable() 
		{ 
			@Override 
			public void run() 
			{ 
				try 
				{ 
					Fesnter frame = new Fesnter(); 
					frame.setVisible(true); 
				} 
				catch (Exception e) 
				{ 
					e.printStackTrace(); 
				} 
			} 
		}); 
	} 
	public Fesnter() 
	{ 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		setBounds(100, 100, 500, 500); 
		contentPane = new JPanel(); 
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
		setContentPane(contentPane); 
		contentPane.setLayout(new BorderLayout());; 
		final JPanel panel = new JPanel() 
		{ 
			@Override 
			public void paint(Graphics g) 
			{ 
				Graphics2D g2d = (Graphics2D) g;
				g2d.setPaint(Color.RED);   
				g2d.setStroke(new BasicStroke(2));
				double xm = 250; 
				double ym = 250; 
				double r = 200; 
				double x1 = xm + r * Math.cos( Math.toRadians(arcAngle)); 
				double y1 = ym + r * Math.sin( Math.toRadians(arcAngle)); 
				double x2 = xm + r * Math.cos( Math.toRadians(arcAngle+arcdelta) ); 
				double y2 = ym + r * Math.sin( Math.toRadians(arcAngle+arcdelta) ); 
				g2d.draw(new Line2D.Double(x1, y1, x2, y2)); 
				System.out.println(x1 + " | " + y1 + " | " + arcAngle); 
				System.out.println(x2 + " | " + y2 + " | " + (arcAngle+arcdelta) ); 
			} 
		}; 
		contentPane.add(panel); 
		new Thread(new Runnable() { 
			@Override 
			public void run() { 
				while (arcAngle <= 360) { 
					try 
					{ 
						Thread.sleep(50); 
					} 
					catch (InterruptedException e) 
					{ 
						e.printStackTrace(); 
					} 
					arcAngle += arcdelta; 
					panel.repaint(); 
				} 
			} 
		}).start(); 
	} 
}```

[QUOTE=pappawinni]

double t = arcAngle / 180;

wär ja ok… [/QUOTE]
nicht ganz bei int / int :wink:

/ 180.0 geht

Oooooh, ok, wollte da eigentlich nur deine Aussage bestätigen, dass dabei die .0 verloren gegangen ist, schieb ich mal auf die Uhrzeit.
Im Kern ging mein Post aber eher dahin, auf t ganz zu verzichten.

rumspiel

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;

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

public class SlowArcPaint
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800,800);
        
        final SlowArcPaintPanel slowArcPaintPanel = new SlowArcPaintPanel();
        f.getContentPane().add(slowArcPaintPanel, BorderLayout.CENTER);
        
        JButton paintButton = new JButton("Paint");
        paintButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                startPainting(slowArcPaintPanel);
            }
        });
        f.getContentPane().add(paintButton, BorderLayout.SOUTH);
        
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
    
    private static void startPainting(final SlowArcPaintPanel slowArcPaintPanel)
    {
        Thread t = new Thread(new Runnable()
        {
            double angleRad = 0;
            
            @Override
            public void run()
            {
                while (angleRad < 2*Math.PI)
                {
                    angleRad += 0.05;
                    slowArcPaintPanel.setAngle(angleRad);
                    try
                    {
                        Thread.sleep(15);
                    }
                    catch (InterruptedException e)
                    {
                        Thread.currentThread().interrupt();
                        return;
                    }
                }
            }
        });
        t.start();
    }
}

class SlowArcPaintPanel extends JPanel
{
    private double angleRad = 0;
    
    @Override
    protected void paintComponent(Graphics gr)
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D)gr;
        g.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING, 
            RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(5));
        g.draw(new Arc2D.Double(200,  200,  400,  400,  
            0, Math.toDegrees(angleRad),  Arc2D.OPEN));
        
        if (angleRad >= Math.PI * 2)
        {
            paintSurprise(g);
        }
    }
    
    void paintSurprise(Graphics2D g)
    {
        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(5));
        g.draw(new Ellipse2D.Double(300, 300, 40, 40));
        g.draw(new Ellipse2D.Double(460, 300, 40, 40));
        g.draw(new Arc2D.Double(270, 330, 260, 200, 190, 160, Arc2D.OPEN));
    }
    
    void setAngle(double angleRad)
    {
        this.angleRad = angleRad;
        repaint();
    }
    
}

::manklatsch schön, dafür ein Fleiss-:bee:

das ist dann wohl die perfekteste Lösung :slight_smile: -incl. netter Überraschung.

Danke!