Отсутствующие координаты. Справка по базовой тригонометрии - PullRequest
7 голосов
/ 01 июня 2010

пожалуйста, обратитесь к моей быстрой диаграмме, приложенной ниже.

Я пытаюсь получить координаты желтых точек, используя угол из известных координат красных точек. если предположить, что каждая желтая точка находится примерно в 20 пикселях от красной точки x: 50 / y: 250 под прямым углом (я думаю, это так и называется), как я могу получить их координаты?

Я считаю, что это очень базовая тригонометрия, и я должен использовать Math.tan (), но они не научили нас математике в художественной школе.

альтернативный текст http://www.freeimagehosting.net/uploads/e8c848a357.jpg

Ответы [ 5 ]

7 голосов
/ 01 июня 2010

Вам на самом деле не нужны триггеры для этого. Просто используйте уклоны или измените x и y.

При заданной линии наклона m = y/x линия, перпендикулярная этой линии, имеет наклон -1/m или -x/y.

Наклон m между красными точками равен -150/150 или -1/1. Я заметил ваши положительные y баллы вниз.

Следовательно, положительный наклон равен 1/1. Ваши x и y изменяются с одинаковой скоростью, с одинаковым количеством.

Как только вы это узнаете, все остальное будет довольно легко выяснить. Так как они выровнены под углом 45 градусов, соотношение сторон треугольника 45-45-90 равно 1 : 1 : sqrt(2). Таким образом, если ваша длина равна 20, индивидуальное изменение x и y будет равно 20/sqrt(2) или примерно 14 в целых числах.

Итак, ваши две желтые точки будут на (36, 236) и (64, 264). Если линии не выровнены в удобной степени, вам придется использовать arctan() или что-то подобное, и получить угол между линией и горизонтальной линией, чтобы вы могли вычислить соотношение изменения x и y.

Надеюсь, мой ответ не был слишком сложным для подражания. Для более общего решения см. Ответ Трубадура.


Редактировать: Поскольку ОП говорит, что нижняя красная точка фактически вращается вокруг верхней красной точки, нам потребуется более гибкое решение.

Я собираюсь расширить этот ответ от Трубадура, так как я делаю то же самое. Пожалуйста, смотрите его пост, когда вы читаете мой.

1. Получить вектор от начала координат (200, 100) до точки вращения (50, 250):

vector = (200 - 50, 100 - 250) = (150, -150)

2. Поверните ваш вектор, поменяв местами x и y, и отмените x, чтобы получить новый вектор:

vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150)

3. Получите единичный вектор (длиной 1) из нового вектора:

vector = vector / length(vector)
       = (150 / length(vector), 150 / length(vector))
       ~= (0.7071, 0.7071)

       where

       length(vector) = sqrt(150^2 + 150^2) ~= 212.2320

4. Получите вектор смещения длины 20, умножив единичный вектор.

displacement_vector = vector * 20 
                    = (0.7071 * 20, 0.7071 * 20)
                    = (14.1421, 14.1421)

5. Добавьте / вычтите этот вектор из / в ваш вращающийся вектор (точку):

yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254)
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236)

Я надеюсь, что описанные выше шаги помогут вам сформулировать ваш код. Неважно, под каким углом, те же самые шаги.

4 голосов
/ 01 июня 2010

Назовите красную точку в (50, 250) A, а другую в (200, 100) B.

Одним из способов было бы сначала вычислить вектор AB, т.е.

v_AB = ( 200 - 50, 100 - 250 ) = ( 150, -150 )

Вы можете создать вектор под прямым углом к ​​нему, поменяв местами компоненты и поменяв знак одного из двух компонентов. Так

v_AB_perp = ( 150, 150 )

- это вектор, повернутый вращением v_AB по часовой стрелке, когда вы смотрите на него на экране. Вы можете нормализовать это, чтобы получить единичный вектор, разделив его на величину, т.е.

v_AB_perp_normalised = v_AB_perp / |v_AB_perp|

Чтобы получить желтые точки, просто умножьте это на ваши 20 пикселей и добавьте / вычтите их до координат A.

2 голосов
/ 01 июня 2010

Это должно сработать (я просто ссылаюсь на крайнюю левую желтую точку, но мы получим координаты обоих в конце):

  1. Найдите наклон линии, заданной двумя красными точками.
  2. Найти уравнение линии между желтой точкой и красной точкой (d2).
  3. Найдите координаты желтых точек, используя уравнение линии d2 и тот факт, что расстояние от нижней красной точки равно 20.

Для 1 :

Найдите склон: m = (y1 - y2) / (x1 - x2) = (250 - 100) / (50 - 200) = 150 / -150 = -1

Для 2 :

Мы знаем, что d1 (линия между красными точками) перпендикулярна d2 (линия между красной точкой и желтой точкой), и поэтому произведение их уклонов должно быть -1. Следовательно, наклон d2 равен m = 1

.

Следовательно, уравнение: d2: y - 250 = x - 50 => d2: y - x = 200

Для 3 :

Требуемая желтая точка лежит на линии d2, а ее расстояние до самой низкой красной точки равно 20. Решить систему уравнений:

y - x = 200
(x - 50)^2 + (y - 250)^2 = 400

Вычисления становятся довольно уродливыми, но решение их с помощью mathematica дает:

{{x -> 35.8579, y -> 235.858}, {x -> 64.1421, y -> 264.142}}

Вот где лежат ваши две желтые точки!

Программно, вы можете легко решить такую ​​систему, подставив y = 200 + x во второе уравнение, затем переместив все в одну сторону и решив его как квадратное уравнение.

2 голосов
/ 01 июня 2010

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

Игнорируя фактическое расстояние до желтых точек, представьте себе несколько других точек на той же линии NW-SE, на том же расстоянии, что и красная точка NE. Вектор к этому - просто вектор к красной точке, повернутой на 90 градусов.

Поворот на 90 градусов можно выполнить, меняя координаты и переворачивая одну из них.

Получив это, переместите эту желтую точку в более близкое положение, масштабируя этот вектор на реальном расстоянии (20).

1 голос
/ 01 июня 2010

Это довольно легко, если вы знаете, что оно будет держаться при 45 градусах. Если расстояние от 50, 250 равно 20, то точки имеют значения (50 - (20*sqrt(2)), 250 - (20*sqrt(2))) и (50 + (20/sqrt(2)), 250 + (20/sqrt(2))).

Как правило, 20*sqrt(2) часть каждого должна быть заменена на (distance)*cos(angle) и distance*sin(angle). Один для координаты х и один для координаты у. (в зависимости от того, с какой стороны вы измеряете угол!)

Таким образом, вы должны использовать грех и cos. 45 градусов - это особый случай, когда sin и cos равны 1/sqrt(2), поэтому не имеет значения, в каком направлении вы их используете.

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