import java.awt.*;
import javax.swing.*;
public class DrawingProject extends JFrame
{
public static void main(String[] args)
{
DrawingProject frame = new DrawingProject();
frame.setSize(750, 750);
frame.setVisible(true);
}
public void paint(Graphics g)
{
g.drawOval(170, 170, 300, 300);
g.drawLine(235, 235, 330, 330);
g.drawLine(235, 235, 237, 257);
g.drawLine(235, 235, 257, 237);
g.drawLine(330, 255, 330, 330);
g.drawLine(330, 255, 345, 270);
g.drawLine(330, 255, 313, 270);
}
}
答案 0 :(得分:3)
考虑使用polar coordinates。有了它,你可以将每个点作为距离中心(总是相同的)和旋转角度(每个数字都增加)。
答案 1 :(得分:2)
使用polar coordinates来确定数字的位置。一个完整的圆圈有360度。有12个小时,这意味着每隔30度从角度0开始,必须放置一个数字。
答案 2 :(得分:2)
首先,使用hard coded坐标绘制线条的不良做法。特别是如果可以使用一些平凡的几何计算这些坐标。点击提供给您的第一个链接,我们会看到以下公式:
// 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 );
来源: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。