Как сделать лучше и быстрее настенные часы, используя качели? - PullRequest
1 голос
/ 14 марта 2012

Я уже начал его, но я понятия не имею, как поставить некоторые цифры на часы.оценка линий такая боль.= / есть идеи как это сделать проще и быстрее?хх вот мой код.

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);


}
}

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Рассмотрите возможность использования полярных координат для этого.С его помощью вы определяете каждую точку как расстояние от центра (которое всегда одинаково) и угол поворота (который вы увеличиваете для каждого числа).

2 голосов
/ 15 марта 2012

Во-первых, плохая практика - рисовать линию, используя жестко запрограммированные координаты.Особенно, если эти координаты могут быть вычислены с использованием некоторой тривиальной геометрии.При нажатии на первую ссылку, предоставленную вам, мы видим следующие формулы:

// 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 для этого.

2 голосов
/ 14 марта 2012

Используйте полярные координаты , чтобы понять, где найти номера.Полный круг имеет 360 градусов.Это 12 часов, что означает, что начиная с угла 0 каждые 30 градусов, нужно разместить число.

Вот полный пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...