Войти
ПрограммированиеФорум2D графика и изометрия

Как найти точки на перепендикуляре

Страницы: 1 2 Следующая »
#0
21:25, 23 мар. 2016

Друзья, так уж вышло, что я уже ничего не помню со школы, кроме слова перепендикуляр...
Задача у меня простая. Есть две точки A и B, точнее их координаты. Мне нужно нарисовать прямоугольник так, как это нарисовано на картинке.
Нужно вычислить координаты точек a, b, c, d.

В конечном итоге нужно написать функцию, которая будет принимать 4 параметра:
1. Координаты точки A
2. Координаты точки B
3. Координаты точки x к которой нужно "протянуть" кабель перпендикуляр
4. Расстояние, на котором желанная точка y должна находится от точки x

Подскажите что нибудь. Я смотрю на эти все "мануалы" и вижу фигу.
Спасибо.
Изображение


#1
23:22, 23 мар. 2016
void GetOffsetPts(int float2 A, in float2 B, in float Dist, out float2 a, out float2 b, out float2 c, out float2 d) {
  float2 Dir = normalize(B - A);
  float2 Offset = float2(-Dir.y, Dir.x); //rotate 90deg
  Offset *= Dist;
  a = A + Offset;
  d = A - Offset;
  b = B + Offset;
  c = B - Offset;
}
#2
9:30, 24 мар. 2016

zeleniy
> 3. Координаты точки x к которой нужно "протянуть" кабель перпендикуляр
> 4. Расстояние, на котором желанная точка y должна находится от точки x
Чего?

#3
14:34, 24 мар. 2016

Нипанятна. Для наглядности хоть бы "x" на чертеже отметил, чтобы было яснее, от чего перпендикуляр кидать и куда.

#4
14:51, 24 мар. 2016

"x" - это в данном случае A и/или B. A "y" - a, b, c и/или d.

#5
19:19, 24 мар. 2016

Точку а можно найти, если повернуть нормаль от A до B на 90 градусов против часовой и умножить на половину высоты прямоугольника, точку d найти точно также, но повернув нормаль по часовой. Точку b ты найдешь, если помножишь нормаль от A до B на ширину прямоугольника, а затем прибавишь к полученным координатам повернутую на 90 градусов против часовой и умноженную на половину высоты прямоугольника нормаль, а точку c точно так же, как и b, но повернув нормаль по часовой. Сложна, но вроде то, что ты хотел. Перевести в код лень. Я дал тебе идею - воплощай.

#6
7:50, 25 мар. 2016

MrShoor
+100500

Находишь направление, нормализуешь, поворачиваешь на 90 гр, находишь смешение и прибавляешь(отнимаешь) к исходным точкам.

#7
10:18, 25 мар. 2016

k119_55524
Только вот как-то странно он повернул. Просто по Y отзеркалив.

#8
10:55, 25 мар. 2016

MrOcelot
Усё правильно. Поменял компоненты местами и изменил знак у одной из компоненты(задаёт направление вращения).

#9
13:31, 25 мар. 2016

Спасибо всем за участие. Код не пригодился, т.к. написан на непонятном языке. Я примерно понял последовательность действий... кажется. Постараюсь понять на пальцах. Допустим у меня A (2, 1) и B (3, 4).

1. Мне нужно найти направление/координаты вектор... я так и не понял. Делается это так:
x2 - x1, y2 - y1 т.е. (3 - 2, 4 - 1) = (1, 2) - это координаты моего вектора.

2. Теперь мне нужно найти длинну отрезка AB:
sqrt((x2 - x1) ^ 2 + (y2 - y1) ^ 2) = sqrt((3 - 2) ^ 2 + (4 - 1) ^ 2) = 1.414214

3. Нормализуем векор AB:
(1 / 1.414214, 2 / 1.414214) = (0.7071068 / 1.414214) - это координаты моего отнормированного вектора AB

Надеюсь до этого всё было верно, если нет - поправьте.
Теперь как его повернуть на 90 и -90 градусов? Синусы, косинусы? Можно поподробнее...

#10
13:47, 25 мар. 2016

MrOcelot
Ну давай так.

Offset
(
cos 90°- sin 90°
sin 90°cos 90°
)
  · Dir
не спрашивайте
#11
13:51, 25 мар. 2016

zeleniy
> Теперь как его повернуть на 90 и -90 градусов? Синусы, косинусы? Можно
> поподробнее...
* фейспалм *
cin
> нужно компоненты поменять местами и один из компонентов вектора
> умножить на -1
MrShoor
> float2 Offset = float2(-Dir.y, Dir.x); // повернуть на 90 градусов
k119_55524
> Поменял компоненты местами и изменил знак у одной из компоненты
В этом треде явно не хватает рисунка со стрелочками.

#12
13:53, 25 мар. 2016

v(a, b) ->(поворот на 90) = v'(-b, a) или v'(b,-a), от знака зависит направление вращения.

https://habrahabr.ru/post/131931/

rotate | Как найти точки на перепендикуляре
#13
15:23, 25 мар. 2016

k119_55524
Не заметил, что компоненты поменяны местами. Получается да, MrShoor сделал всю работу за ОПа.

#14
15:42, 25 мар. 2016

cin
На инопланетном. В тему срочно нужны дешифровщики языков внеземных цивилизаций!

Страницы: 1 2 Следующая »
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.