Перемещение точки относительно прямой

Автор Тема: Перемещение точки относительно прямой  (Прочитано 17998 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый день!
Пытаюсь подвинуть точку(midpoint) относительно прямой, заданной двумя точками(p1/p2), на определенное расстояние, делаю вот так:
Код - C# [Выбрать]
  1. Line columnFaceLine = Line.CreateUnbound(p1, p2); //создание прямой
  2. double projP3 = (columnFaceLine.Project(p3).XYZPoint - p3).GetLength(); //расстояние от точки до проекции точки на прямую - минимальное расстояние
  3. midpoint = (p1 + p2) / 2;
  4. XYZ lineDirection = columnFaceLine.Direction; //направление прямой
  5. XYZ normal = midpoint.CrossProduct(lineDirection).Normalize(); // определение нормального вектора к прямой относительно точки
  6. XYZ transform = normal.Multiply(projP3  / 2);
  7. midpoint = transform;
  8.  

Но проекция точки p3 - какая-то не правильная и точка midpoint перемещается черт знает куда.
 
« Последнее редактирование: 02-10-2015, 15:05:47 от shss »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
На вскидку:
Код - C# [Выбрать]
  1. midpoint = p1 + (p2 - p1) / 2

а дальше, наверное,
Код - C# [Выбрать]
  1. midpoint + projP3 * lineDirection.Normalize()

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
midpoint = p1 + (p2 - p1) / 2
это же тоже самое, что и (p1 + p2) / 2, ну если скобки раскрыть:)
midpoint + projP3 * lineDirection
а вот этого чтото я не совесем понял.
Может я не свосем ясно выразился мне надо переместить точку перпендикулярно прямой на расстояние

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Ну если раскрыть скобки будет
Код - C# [Выбрать]
  1. (p2 - p1) / 2

Да, не lineDirection, ошибся.

Код - C# [Выбрать]
  1. midpoint = (p2 - p1) / 2 + projP3 * normal

projP3 - это же как раз будет расстояние, на которое сместить нужно?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
А, вру, действительно
Код - C# [Выбрать]
  1. (p1 + p2) / 2
. Ну тогда к этому нужно прибавить вектор normal-и умноженный на заданную длину

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Пытаюсь подвинуть точку(midpoint) относительно прямой, заданной двумя точками(p1/p2), на определенное расстояние
Но проекция точки p3
Пародон, а причем здесь точка p3? в коде эта точка используется только для получения минимального расстояния projP3, которое в свою очередь нигде потом не используется
.
double projP3 = (columnFaceLine.Project(p3).XYZPoint - p3).GetLength(); //расстояние от точки до проекции точки на прямую - минимальное расстояние
можно чуть проще кстати:
Код - C# [Выбрать]
  1. double projP3 = columnFaceLine.Project(p3).Distance

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
А вообще вроде так точка перемещается:
Код - C# [Выбрать]
  1. Line line = ...;
  2. // направление = вектор
  3. var direction = line.Direction;
  4.  
  5. // нормализованный вектор
  6. var n = direction.Normalize();
  7.  
  8. // точка которую надо переместить
  9. var p = ...;
  10.  
  11. // расстояние, на которое надо переместить
  12. var d = 0.2; // в футах
  13.  
  14. // конечные координаты точки
  15. var res = p.Add(n.Multiply(d));
  16.  

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Виктор Чекалин,  так точка переместится в направлении line.Direction, я так понимаю, задача в том, чтобы сместиться относительно данной линии.

А если я все-таки ошибаюсь, можно же еще проще

Код - C# [Выбрать]
  1. var d = 0.2;
  2.  
  3. var res = line.GetEndPoint(0) + (line.Length / 2 + d) * line.Direction.Normalize() // можно и без Normalize(), line.Direction будет и так единичным вектором

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Саш, а в твоем понимании что значит относительно прямой? Это вдоль или перпендикулярно? Или еще как?

А если я все-таки ошибаюсь, можно же еще проще
Дык я можно сказать тож самое и написал, только подробно по шагам:)

В общем формула есть. Осталось только определиться, что и вдоль чего передвигать.
 

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Вообще ТС либо привел не полный код как минимум.
1) неизвестно что за p3
2) зачем нужно projP3
3) откуда взялась переменная t (строка 6)
4) строка 7 - midpoint = transform; что за transform и зачем это значение присваивать midpoint, если это середина линии?
shss, уточните пожалуйста все же какую точку и в каком направлении нужно переместить.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Да, нужны комментарии от shss

Про движение точки меня, возможно, сбил с толку вызов CrossProduct в исходном сообщение

https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Cross_product_parallelogram.svg/2000px-Cross_product_parallelogram.svg.png

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Да извиняюсь, за некорректную формулировку.
p3 - это точка вне прямой, с помощью, которой я определяю расстояние до прямой, на половину которого и надо подвинуть midpoint
Код - C# [Выбрать]
  1. double projP3 = (columnFaceLine.Project(p3).XYZPoint - p3).GetLength();
- но работает очень странно.
t - это  proj3, просто ошибся
Переместить надо перпендикулярно существующей линии

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Если я не ошибаюсь, то как раз:
Код - C# [Выбрать]
  1. XYZ normal = midpoint.CrossProduct(lineDirection).Normalize();
это и есть перпендикулярное направление относительно линии
а вот уже в какую сторону двигать определяет точка которая лежит или выше или ниже прямой
Код - C# [Выбрать]
  1. XYZ transform = normal.Multiply(projP3  / 2);

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
shss, вот так:

Я верно понял?

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Да, Виктор, все верно