You have a couple of errors in your code (and logic):
You're using 2 angles to calculate the X
and Y
coords, thus, giving you weird results. As per this Wikipedia image the angle theta is the same for bot coords.
![enter image description here](https://i.stack.imgur.com/JzhRt.png)
You're using the angle in degrees, but Math.cos(angle)
and Math.sin(angle)
require that the angle
is given in radians, so, you must convert the angles to radians as like Math.roRadians(angle)
, as shown in this question: How to use Math.cos() & Math.sin()?
Not really an error but a suggestion from @MadProgrammer in this other answer of mine to use the Shape API instead of pure .drawOval
as you did while drawing the line, change drawOval
to draw(new Ellipse2D.Double(...))
.
You're overriding paint(Graphics g)
method instead of paintComponent(Graphics g)
this could cause some issues while painting. Use JPanels
and override their paintComponent
method and add those JPanel
s to your JFrame
.
Having said all of the above, I came to a good example that follows the above advises as well as solving the issue:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class RadiusDrawer {
private JFrame frame;
private int centerX = 50;
private int centerY = 50;
private int x = 0;
private int y = 0;
private int r = 100;
public static void main(String[] args) {
SwingUtilities.invokeLater(new RadiusDrawer()::createAndShowGui);
}
private void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
frame.add(new MyCircle());
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@SuppressWarnings("serial")
class MyCircle extends JPanel {
int cx = 0;
int cy = 0;
public MyCircle() {
int angle = 0;
x = (int) (r * Math.cos(Math.toRadians(angle)));
y = (int) (r * Math.sin(Math.toRadians(angle)));
y *= -1; //We must inverse the Y axis since in Math Y axis starts in the bottom while in Swing it starts at the top, in order to have or angles correctly displayed, we must inverse the axis
calculateCenter();
}
private void calculateCenter() {
cx = centerX + r;
cy = centerY + r;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
drawCircle(g2d, centerX, centerY, r);
drawRadius(g2d);
}
private void drawCircle(Graphics2D g2d, int x, int y, int r) {
g2d.setColor(Color.BLACK);
g2d.draw(new Ellipse2D.Double(x, y, r * 2, r * 2));
}
private void drawRadius(Graphics2D g2d) {
g2d.setColor(Color.BLUE);
g2d.draw(new Line2D.Double(cx, cy, cx + x, cy + y));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
}
}
Here are some screenshots of the output at 0, 60 and 90 degrees.
![enter image description here](https://i.stack.imgur.com/b19Yht.png)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…