2016-05-02 3 views
1

Я изучал фракталы и решил попробовать, но тут же столкнулся с гораздо более простой проблемой. Я не могу нарисовать линию под любым углом, кроме 0, 45, 90, ... и т. Д.Java: Как бы я нарисовал линию под углом, отличным от 45 градусов или нулевым градусом и т. Д.?

Проблема: Мой угол - это целое число, и я использую Math.toRadians (угол) для вычисления сам угол как его нарисованный. Когда я рисую линию, мне нужно сбрасывать (int) в double, полученный из Math.toRadians(), что заставляет меня терять сам угол, и я считаю, что это мешает линии рисовать.

код я использую: `

Graphics2D g2d = (Graphics2D) g; 

    int angle = 90; 

    int startX = getWidth()/2; 
    int startY = getHeight()/2; 
    int length = 100; 

    int endX = startX + (int)Math.cos(Math.toRadians(angle)) * length; 
    int endY = startY + (int)Math.sin(Math.toRadians(angle)) * length; 

    g2d.drawLine(startX, startY, endX, endY); 

`

Решение:

Graphics2D g2d = (Graphics2D) g; 

    int angle = 91; 

    int startX = getWidth()/2; 
    int startY = getHeight()/2; 
    int length = 100; 



    int endX = startX + (int)(Math.cos(Math.toRadians(angle)) * length); 
    int endY = startY + (int)(Math.sin(Math.toRadians(angle)) * length); 

    g2d.drawLine(startX, startY, endX, endY); 

Спасибо, ребята!

+6

Вы должны использовать 'int' * после * умножения на' length'. – ruakh

+0

^--- '(int) (Math.cos (Math.toRadians (angle)) * length)' – MadProgrammer

+0

Синус и косинус являются действительными числами, частями в диапазоне [-1,1], определяющими угол. Сохраняйте их точность при любых вычислениях до последнего момента, если вам нужно приложить к целому числу. – laune

ответ

2

Вы являетесь жертвой приоритета оператора. Вам нужно

int endX = startX + (int) (Math.cos(Math.toRadians(angle)) * length); 
int endY = startY + (int) (Math.sin(Math.toRadians(angle)) * length); 
1

Для лучшей точности, используйте Math.round():

int endX = startX + (int)Math.round(Math.cos(Math.toRadians(angle)) * length); 
int endY = startY + (int)Math.round(Math.sin(Math.toRadians(angle)) * length); 

Вы можете не заметить никакой разницы в ваш рисунок на экране, но теряется точность может добавить до видимых глюков.

+0

Для лучшей точности использования 2D Graphics и Shapes API который поддерживает double;) – MadProgrammer

+0

@MadProgrammer Является ли пиксель (x, y) прямоугольником ([x, x + 1], [y, y + 1]) или ([x-0.5, x + 0.5], [y -0,5, у + 0,5])? Должен ли программист беспокоиться об этом? Например, следите за разной интерпретацией дробных значений по целочисленной сетке пикселей? Я никогда не сталкивался с этим обсуждением (но не пытался его найти). – laune

+0

Все дело в контексте, в зависимости от того, как он настроен, API-интерфейс Graphics может использовать антианализ для рендеринга дробных элементов – MadProgrammer