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

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

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

Отмечено как Решение shss 02-10-2015, 17:40:16

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Код - C# [Выбрать]
  1. var p3 = ...; // точка вне прямой columnFaceLine
  2.  
  3. var midpoint = (p1 + p2) / 2; //точка в середине прямой columnFaceLine
  4.  
  5. var intersectionPoint = columnFaceLine.Project(p3).XYZPoint; // точка пересечения перпендикуляра от прямой columnFaceLine к точке p3
  6.  
  7. var line1 = Line.CreateBound (intersectionPoint, p3); // кратчайшее расстояние от columnFaceLine до p3;
  8.  
  9. var distance = line1.Length/2; // расстояние, на которое нужно передвинуть midpoint
  10.  
  11. var direction = line1.Direction.Normalize(); // направление, в котором нужно передвинуть midpoint. Возможно Normalize() лишнее, надо проверить.
  12.  
  13. // двигаем точку на нужное расстояние
  14. var res = midpoint.Add(direction.Multiply(d));
  15.  

Должно быть так.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
да этот код работает. В случае если точка вне прямой лежит в пределах отрезка

А вот в случае если точка, лежащая не на прямой (заданной координатами р1 и р2), находится не в пределах отрезка, то функция
Код - C# [Выбрать]
  1. var intersectionPoint = columnFaceLine.Project(p3).XYZPoint;
работает неверно



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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
да этот код работает. В случае если точка вне прямой лежит в пределах отрезка

А вот в случае если точка (р3), лежащая не на прямой (заданной координатами р1 и р2), находится не в пределах отрезка, то функция
Код - C# [Выбрать]
  1. var intersectionPoint = columnFaceLine.Project(p3).XYZPoint;
работает неверно


Меня это и насторожило это поведение проекции

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Меня это и насторожило это поведение проекции
Не, метод правильно сработал. метод ищет минимальное расстояние от точки до кривой. А если точка находится в границах кривой, то минимальное расстояние - это перпендикуляр от точки к прямой, либо от точки к касательной кривой.

Но в этом случае мой способ действительно не сработает для этой задачи. Надо покопаться, есть ли готовые методы или надо свой написать

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
А если точка находится не в границах отрезка, то что тогда метод возвращает?
Я предполагал, что нужно делать прямую Unbound и будет тоже самое проекция на бесконечную прямую:
Код - C# [Выбрать]
  1. Line columnFaceLine = Line.CreateUnbound(p1, p2);
  2. var intersectionPoint = columnFaceLine.Project(p3).XYZPoint;
  3.  
а получается

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Видимо, придется через синус все считать.

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

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

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Кратчайшее расстояние от точки до прямой, в этом случае будет отрезком от точки до одного из концов прямой
это в случае если прямая создана при помощи CreateBound

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Вообще в случае с Unbound должен тоже тоже перпендикуляр построить.
Код - C# [Выбрать]
  1. Line columnFaceLine = Line.CreateUnbound(p1, p2);
думаю вот здесь построена не та линия, которую вы ожидали, поэтому и конечный результат неверный.
Это не значит что линия будет начинаться в точке p1 и проходить через p2. p2 это направление.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
то есть получается Line.CreateBound(p1, p2) и Line.CreateUnbound(p1, p2) это две разных линии?

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Хм кажется я нашел ответ:
Returns the unbounded line that passes through the specified point in the direction of the specified vector

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Да, вот он ответ:
Line columnFaceLine = Line.CreateUnbound(p1, Line.CreateBound(p1, p2).Direction);

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Line columnFaceLine = Line.CreateUnbound(p1, Line.CreateBound(p1, p2).Direction);
Угу, только зачем создавать лишний объект.
Направление можно найти просто: p2-p1
Т.е.
Код - C# [Выбрать]
  1. Line columnFaceLine = Line.CreateUnbound(p1, p2-p1);

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Всем огромное Спасибо за подсказки!