Во-первых, плохая практика - рисовать линию, используя жестко запрограммированные координаты.Особенно, если эти координаты могут быть вычислены с использованием некоторой тривиальной геометрии.При нажатии на первую ссылку, предоставленную вам, мы видим следующие формулы:
// polar to Cartesian
double x = Math.cos( angleInRadians ) * radius;
double y = Math.sin( angleInRadians ) * radius;
// Cartesian to polar.
double radius = Math.sqrt( x * x + y * y );
double angleInRadians = Math.acos( x / radius );
source: mindprod.com
Первые две строки делают именно то, что вы хотите!Они рассчитывают расстояние, пройденное по оси под определенным углом.Мы можем использовать эти формулы для расчета точки назначения ваших линий.Для начальной точки мы будем использовать центр фрейма.
Теперь давайте поместим эти формулы в несколько методов:
private int calculateHorizontalOffset(int angle, int radius) {
return (int) Math.round(Math.cos(Math.toRadians(angle)) * radius);
}
private int calculateVerticalOffset(int angle, int radius) {
return (int) Math.round(Math.sin(Math.toRadians(angle)) * radius);
}
Теперь легко вычислить координаты ваших линий, вотокончательный результат:
import java.awt.*;
import javax.swing.*;
public class DrawingProject extends JFrame {
/**
* This is the size of our clock
*/
int radius = 300;
public static void main(String[] args) {
DrawingProject frame = new DrawingProject();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(750, 750);
frame.setVisible(true);
}
private int calculateHorizontalOffset(int angle, int radius) {
return (int) Math.round(Math.cos(Math.toRadians(angle)) * radius);
}
private int calculateVerticalOffset(int angle, int radius) {
return (int) Math.round(Math.sin(Math.toRadians(angle)) * radius);
}
public void paint(Graphics g) {
int offsetX, offsetY;
//here we calculate the center of our drawing pane
int centerX = getWidth() / 2;
int centerY = getHeight() / 2;
//then we draw a circle using the data we have so far
g.drawOval(centerX - radius / 2, centerY - radius / 2, radius, radius);
//then, with our formulas, we create a line to the left (angle = 0)
offsetX = calculateHorizontalOffset(0, radius / 2 - 50);
offsetY = calculateVerticalOffset(0, radius / 2 - 50);
g.drawLine(centerX, centerY, centerX + offsetX, centerY + offsetY);
//and a second line to the top (angle = 270)
offsetX = calculateHorizontalOffset(270, radius / 2 - 10);
offsetY = calculateVerticalOffset(270, radius / 2 - 10);
g.drawLine(centerX, centerY, centerX + offsetX, centerY + offsetY);
}
}
Еще один совет, операция закрытия JFrame по умолчанию - HIDE_ON_CLOSE.Простого сокрытия рамки обычно недостаточно.Мы хотим закрыть приложение, как только окно закроется.Я использовал EXIT_ON_CLOSE для этого.