Нарисуйте линию под определенным углом в Java - PullRequest
29 голосов
/ 21 августа 2010

Допустим, у меня есть (x, y), который всегда одинаков для начальной точки линии, и (x, y), который изменяется для конечной точки этой же линии. Линия также всегда 40px длиной. В начале программы линия начинается в вертикальной ориентации (назовем ее 0 градусов). Исходя из пользовательского ввода, мне нужно, чтобы линия была перерисована на определенное количество градусов от ее начала путем изменения только конца (x, y).

БОЛЬШЕ ЕДЫ ДЛЯ МЫСЛИ, ЕСЛИ ВАМ НУЖНО ЭТО:

Я пытаюсь рассчитать это и заставить его работать на Java. Я могу заставить математику работать, чтобы вычислить точку на основе длины дуги сегмента круга, но я не знаю, как заставить Java делать это.

Я думаю, что это будет работать легче, если исходить из углов треугольника, так как я всегда буду знать длину двух сторон треугольника (одна сторона, образованная длинной линией 40px, а другая сторона, образованная начальной точкой этой линии и граница JPanel) и угол, который образуют эти две линии. Тем не менее, мой мозг не способен понять это. Любая помощь будет высоко ценится.

UPDATE:

@ Касабланка сделала меня на правильном пути. Я освежил свои тригонометрические функции и вот как я это сделал.

Во-первых, я не осознавал, что 90 градусов были прямо вверх, но однажды я понял, что мое решение отражает этот факт. Я рисовал свою линию, начиная с нижнего центра кадра и выходя. Поскольку сторона opposite треугольника находится на правой стороне экрана, когда угол, заданный моим пользователем, меньше 90 градусов, и на левой стороне экрана, когда угол, заданный моим пользователем, больше 90 градусов. Мне пришлось настроить формулу, чтобы учесть этот факт, поэтому у меня есть четыре метода, один для координаты x в левой части экрана (когда заданный пользователем угол превышает 90 градусов), один для y координата на левой стороне экрана (когда заданный угол больше 90 градусов) и то же самое для правой стороны экрана, когда заданный угол меньше 90 градусов. int length во всех методах - длина гипотенузы. Еще раз спасибо за вашу помощь @casablanca!

public double leftSideX(double angle, int length){
    double x = frameWidth/2 - (length * Math.cos(Math.toRadians(90-(Math.toDegrees(angle)-90))));
    return x;
}

public double leftSideY(double angle, int length){
    double y = frameHeight - (length * Math.sin(Math.toRadians(90-(Math.toDegrees(angle)-90))));
    return y;
}

public double rightSideX(double angle, int length){
    double x = frameWidth/2 + (length * Math.cos(angle));
    return x;
}

public double rightSideY(double angle, int length){
    double y = frameHeight - (length * Math.sin(angle));
    return y;
}

1 Ответ

68 голосов
/ 21 августа 2010

Это то, что вы ищете?

startX = x;
startY = y;
endX   = x + 40 * Math.sin(angle);
endY   = y + 40 * Math.cos(angle);

И нарисуйте линию от (startX, startY) до (endX, endY) в любом используемом вами API.

Также обратите внимание, что angle в радианах. Если у вас это было в градусах, вам нужно сначала преобразовать его:

angle = angle * Math.PI / 180;
...