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

Положить точку на прямую

Страницы: 1 2 Следующая »
#0
21:49, 30 сен. 2014

Подскажите как положить точку на прямую строго на +/-45 градусов максимально просто - без использования пересечения прямых и тригонометрических фун-и(как на данный момент у меня в проекте)?
Надо так:
project45deg | Положить точку на прямую


#1
21:55, 30 сен. 2014

Прямую представь как
f(x)=<n,x>+c=0, где n - единичная нормаль к этой прямой, а c - это расстояние от начала координат до этой прямой.
Расстояние от любой точки x до этой прямой будет равно f(x).
Чтобы спроецировать точку на прямую под 90 градусов, надо взять
x + n*f(x)
Чтобы спроецировать под 45 градусов, надо взять
x + n*f(x) + (n*(x)).Rot90()

#2
22:58, 30 сен. 2014

TarasB. Если я правильно понимаю, то получается перпендикуляр + (n*(x)).Rot90() это и будет искомое решение? Что находится в Rot90()(интуитивно понятно, что поворот на 90 градусов, но всё же)?

#3
23:08, 30 сен. 2014

nedoproger
Ну да, перпендикуляр, плюс он же, но повёрнутый на 90. Разве не очевидно? Нарисуй на бумажке.

#4
23:13, 30 сен. 2014

Ну, я это понял.  Просто, ведь, для поворота юзаем тригонометрию (

#5
23:58, 30 сен. 2014

nedoproger
Для поворота на 90 нужна тригонометрия? О_О

#6
0:25, 1 окт. 2014

Так пойдет?

vec2d PutAPointOnTheLine(const vec2d&point,const vec2d&a,const vec2d&b){
  return a+vec2d((point-a).Rot(b-a).x,0).UnRot(b-a);
}

PutAPointOnTheLine | Положить точку на прямую
Скачать:  DemoVec2dRot
Сделано на QapLite

#7
0:49, 1 окт. 2014

Adler
> .Rot(b-a)
а что оно делает?

#8
1:20, 1 окт. 2014

nedoproger
> Просто, ведь, для поворота юзаем тригонометрию (
vec2d(-y, x) и вот тебе повёрнутый на 90 вектор.

#9
12:41, 1 окт. 2014

TarasB
> а что оно делает?
Vec2dRot | Положить точку на прямую
Поворачивает систему координат вокруг начала координат для вектора this и OX так, чтобы вектор OX в ней был параллельным вектору vec2d(1,0) и возвращает вектор this в этой системе координат.
Для краткости я называю это "повернуть вектор на вектор OX" или "проекция вектора на вектор OX".

vec2d vec2d::Rot(const vec2d&OX)const
{
  real M=OX.Mag();
  return vec2d(((x*+OX.x)+(y*OX.y))/M,((x*-OX.y)+(y*OX.x))/M);
}
vec2d vec2d::UnRot(const vec2d&OX)const
{
  real M=OX.Mag();
  if(M==0.0f)
  {
    return vec2d(0,0);
  }
  ;
  return vec2d(((x*OX.x)+(y*-OX.y))/M,((x*OX.y)+(y*+OX.x))/M);
}
#10
13:49, 1 окт. 2014

Суслика на вас нет! Или Аслана. Чем прямая задана? В каком пространстве? Какие функции можно использовать? Задача без условия не имеет ни решения ни смысла!

#11
0:16, 2 окт. 2014
TarasB
Для поворота на 90 нужна тригонометрия? О_О
belK@
vec2d(-y, x) и вот тебе повёрнутый на 90 вектор.

Омг. чё-то я зафейлил)
Adler
> Так пойдет?
Спасибо, но это же обычный перпендикуляр.
Алексей Патрашов
2д случай. Прямая задана двумя точками p1,p2. Хотелось бы использовать всё, что будет оптимально, так как проецирование будет в реальном времени.
TarasB
Не вышло у меня, видно я не сильно догнал как составить прямую в таком виде f(x)=<n,x>+c=0. Можно подробнее чуть?
#12
1:24, 2 окт. 2014

nedoproger
суть решения сводится к тому, что прямая задается вектором направления и точкой через которую прямая проходит
формулу найди в интернете
так вот у тебя есть вектор направления прямой
значит ты можешь взять перпендикуляр к этому вектору
и вот у тебя опять есть вектор направления и твоя точка,
значит ты можешь составить уравнение прямой перпендикулярной первой
точка пересечения двух этих прямых будет точкой проекции под прямым углом
дальше ты берешь длину отрезка между твоей точкой и точкой проекции под прямым углом
и откладываешь такой же отрезок на прямой получаешь точку проекции под 45 градусов

PS: или тебе нужно прям кодом выложить ))) или формулами
тогда может ты начнешь что расскажешь нам каким образом у тебя задана прямая?

уравнение прямой через точку и направляющий вектор
Изображение
точка
Изображение
направляющий вектор
Изображение

#13
15:45, 2 окт. 2014

1. Переходим в систему координат с началом в точке p1.
2. Из точки p3 требуется построить вектор p3M с выполнением условия

(p2,p3M) = |p2| * |p3M| * cos(45)

3. Выразим вектор p3M через известные векторы и неизвестный параметр t.

p3M = t * p2 - p3

4. Делаем подстановку в скалярное произведение

(p2,t * p2 - p3) = |p2| * |t * p2 - p3| * cos(45)

t * p2^2 - (p2,p3) = |p2| * |t * p2 - p3| * cos(45)

(t * p2^2 - (p2,p3))^2 = p2^2 * (t^2 * p2^2 - 2 * t * (p2,p3) + p3^2)/2

t^2 * p2^4 - 2 * t * p2^2 * (p2,p3) + (p2,p3)^2 = p2^2 * p3^2 - (p2,p3)^2

t * p2^2 - (p2,p3) = sqrt(p2^2 * p3^2 - (p2,p3)^2)

t = (sqrt(p2^2 * p3^2 - (p2,p3)^2) + (p2,p3)) / p2^2

5. Через окончательную подстановку получаем координаты точки, которую потом перенесём в исходную систему координат.

p3M = ((sqrt((p2 - p1)^2 * p3^2 - ((p2 - p1),p3)^2) + ((p2 - p1),p3)) / (p2 - p1)^2) * (p2 - p1) + 2 * p1 - p3

#14
17:11, 2 окт. 2014

nedoproger
> Не вышло у меня, видно я не сильно догнал как составить прямую в таком виде
> f(x)=<n,x>+c=0. Можно подробнее чуть?

У тебя проблемы найти n или c?
У тебя как прямая заданая изначально? Что при неё известно? Две точки или что?

Сначала сводишь к Ax+By+C=0, потом делишь всё на sqrt(A*A+B*B)

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

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