обратитесь к моей быстрой схеме, присоединенной ниже.
то, что я пытаюсь сделать, получают координаты желтых точек при помощи угла от известных координат красных точек. принятие каждой желтой точки на расстоянии приблизительно в 20 пикселей от x:50/y:250 красной точки под прямым углом (я думаю, что это - то, чем это называют), как я получаю их координаты?
я полагаю, что это - очень простая тригонометрия, и я должен использовать Math.tan (), но они не преподавали нам много математики в художественной школе.
сопроводительный текст http://www.freeimagehosting.net/uploads/e8c848a357.jpg
Для этого вам не нужны триггеры. Просто используйте наклоны или измените x
и y
.
Для линии наклона m = y / x
, прямая, перпендикулярная этой линии, имеет наклон -1 / м
или -x / y
.
Наклон m между красными точками составляет -150/150
или -1/1
. Я заметил ваши положительные и
точки вниз.
Следовательно, положительный наклон равен 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)
Я надеюсь, что приведенные выше шаги помогут вам в формулировании вашего кода. Неважно, под каким углом, шаги те же.
Это довольно просто, если вы знаете, что он будет оставаться под углом 45 градусов. Если расстояние от 50 до 250 равно 20, то точки находятся в (50 - (20 * sqrt (2)), 250 - (20 * sqrt (2)))
и (50 + (20 / sqrt (2)), 250 + (20 / sqrt (2)))
.
Как правило, часть 20 * sqrt (2)
каждого должна быть заменена на (расстояние) * cos (угол)
и расстояние * sin (угол)
. Один предназначен для координаты x, а другой - для координаты y. (в зависимости от того, с какой стороны вы измеряете угол!)
Таким образом, вы должны использовать sin и cos. 45 градусов - это особый случай, когда sin и cos равны 1 / sqrt (2)
, поэтому не имеет значения, в каком направлении вы их используете.
Назовите красную точку в точке ( 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.
.Это должно сработать (я просто буду ссылаться на крайнюю левую желтую точку, но в конце мы получим их координаты):
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
Вычисление становится довольно уродливым, но решение его с помощью математики дает:
{{x -> 35.8579, y -> 235.858}, {x -> 64.1421, y -> 264.142}}
Вот где лежат две ваши желтые точки!
Программно вы можете легко решить такую систему, подставив y = 200 + x
во второе уравнение, затем переместив все на одну сторону и решив его как квадратное уравнение.
Поскольку желтые точки находятся под прямым углом от красно-красной линии, вы можете использовать что-то более простое. Я не буду отвечать на весь вопрос, но попытаюсь дать несколько подсказок:
Игнорируя фактическое расстояние до желтых точек, представьте некоторые другие точки на той же линии NW-SE, на том же расстоянии, что и красная точка NE. Вектор к ней - это просто вектор к красной точке, повернутый на 90 градусов.
Поворот на 90 градусов можно сделать, поменяв местами координаты и инвертировав одну из них.
Получив это, переместите желтую точку в более близкое положение, масштабируя вектор на реальное расстояние (20).