провести линию известного расстояния вдоль известного угла - PullRequest
1 голос
/ 09 февраля 2012

Я знаю, что это не сложный вопрос, но, к сожалению, я отсталый по математике.

Мне нужно нарисовать линию в 50 пикселей от известной начальной точки вдоль известного угла до неизвестной конечной точки,Угол определяется по начальной точке (400 400) и щелчку мыши;линия должна быть проведена к щелчку мыши, но только к 50 пикселям к щелчку.

Я широко использовал Google и нашел несколько решений, но это просто не для меня.

Вот как я получаю угол.:

float angle = (float) Math.toDegrees(Math.atan2(400 - event.getY(), 400 - event.getX()));
float angleInDegrees = (angle + 270) % 360;

"событие" - это щелчок мышью.

float endX = 250 + 50 * (float)Math.cos(angleInDegrees);
float endY 250 + 50 * (float)Math.sin(angleInDegrees);

line.setStartX(400);
line.setStartY(400);
line.setEndX(endX);
line.setEndY(endY);

Все, что я нашел, вращалось вокругMath.cos и Math.sin, но я до сих пор не понимаю.Я думаю, что проблема связана с отображением радианов в координаты сцены, но я не уверен.Итак, люди, в чем я глуп?Буду признателен за любую помощь.

Ответы [ 3 ]

5 голосов
/ 09 февраля 2012

Я бы не стал беспокоиться об углах. Вы можете сделать это, просто используя отношения:

int startX = 400;
int startY = 400;
int dx = event.getX() - startX;
int dy = event.getY() - startY;
float distToTarget = Math.sqrt(dx * dx + dy * dy);
float ratio = 50 / distToTarget;
int endX = startX + Math.round(ratio * dx);
int endY = startY + Math.round(ratio * dy);

Затем провести от (startX, startY) до (endX, endY).

Вот что происходит:

  1. вычисляет вектор, который идет от (400, 400) до щелчка мыши (это (dx, dy))
  2. масштабировать вектор так, чтобы он был длиной 50 пикселей
  3. округлить масштабированный вектор, чтобы он имел целочисленную длину по x и y
  4. добавить масштабированный округленный вектор к (400, 400), чтобы вычислить конечную точку
3 голосов
/ 09 февраля 2012

Вам даже не нужно иметь дело с радианами / градусами. Вернемся к геометрическому определению синуса и косинуса: синус равен opposite/hypotenuse, косинус равен adjacent/hypotenuse. («Противоположный» и «смежный» означают ноги прямоугольного треугольника, соответственно противоположные и смежные с углом, под которым вы принимаете синус или косинус).

Итак:

float opposite = event.getY() - 400;
float adjacent = event.getX() - 400;
float hypotenuse = Math.sqrt(opposite*opposite + adjacent*adjacent);

float cosine = adjacent/hypotenuse;
float sine = opposite/hypotenuse;

float endX = 400 + 50 * cosine;
float endY = 400 + 50 * sine;
1 голос
/ 09 февраля 2012

Ошибка в вашем коде в том, что вы используете градусы, в то время как Math.cos и Math.sin требуют аргумента в радианах .
Используйте Math.toRadians вместо Math.toDegrees и ваш код начнетработа.

...