Точка в данном направлении на заданном расстоянии

Автор Тема: Точка в данном направлении на заданном расстоянии  (Прочитано 9346 раз)

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Наверно криво я назвал тему))

Встала передо мной задача: известны две точки pt1, pt2 и известно расстояние Length. Нужно найти 3 точку, которая будет лежать в направлении вектора, проходящего через известные точки:


Получил я вектор от точки 1 до точки 2 и все - тыкался, мыкался и понял - я совершенно не умею пользоваться векторами( Даже не очень-то понимаю их

Прошу на данной задаче хоть в общих чертах объяснить работу векторов
« Последнее редактирование: 22-07-2015, 00:18:00 от Александр Ривилис »

Отмечено как Решение Александр Пекшев aka Modis 23-07-2015, 11:04:35

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Как-то так без проверки:
Код - C# [Выбрать]
  1. Point3d pt3 = pt2 + (pt2 - pt1).GetNormal() * Length;

1. (pt2 - pt1) даёт вектор из точки pt1 в точку pt2
2. (pt2 - pt1).GetNormal() даёт единичный (т.е. единичной длины) вектор из точки pt1 в pt2
3. (pt2 - pt1).GetNormal() * Length даёт вектор длиной Length направленный как в п. 2
4.  pt2 + (pt2 - pt1).GetNormal() * Length даёт искомую точку
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Для этих целей удобнее использовать встроенную в Автокад работу с векторами
using Autodesk.AutoCAD.Geometry
читабельность кода будет выше, чем писать свою математику, но производительность скорее всего похуже.

Суть такая:
создаем вектор
удлиняем до нужного размера.
Координаты смещения, относительно начальной точки получены.
Прибавляем смещение к начальной точке ,получаем абсолютные координаты.

Код - C# [Выбрать]
  1. double x1 = 139.9854;
  2. double y1 = 212.5808;
  3. double x2 = 172.8894;
  4. double y2 = 192.8063;
  5. double len2 = 14.8510;//расстояние pt3-pt2
  6. Vector2d vector1 = new Vector2d(x2 - x1, y2 - y1);
  7. double len1 = vector1.Length;//длина pt2-pt1
  8. double koef = (len1 + len2) / len1;//коэффициент удлинения до вектора pt3-pt1
  9. Vector2d vector2 = vector1 * koef ;
  10. double x3 = x1 + vector2.X;//185.6185
  11. double y3 = y1 + vector2.Y;//185.1564

...если нужно в Point2d, а не X,Y, попробуй создавать вектора так:
Код - C# [Выбрать]
  1. Point2d p1;
  2. Point2d p2;
  3. Vector2d vector = p2 - p1;

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Код - C# [Выбрать]
  1. Point2d p1 = new Point2d(139.9854, 212.5808);
  2. Point2d p2 = new Point2d(172.8894, 192.8063);
  3. double len2 = 14.8510;
  4.  
  5. Vector2d vector0 = new Vector2d(p1.X, p1.Y);
  6. Vector2d vector1 = p2 - p1;
  7. double len1 = vector1.Length;
  8. double koef = (len1 + len2) / len1;
  9. Vector2d vector2 = vector1 * koef;
  10. Vector2d vector3 = vector0 + vector2;
  11.  
  12. Point2d p3 = new Point2d(vector3.X, vector3.Y);

Так должно быть "читабельнее", за счет оперирования понятием вектор)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Привалов Дмитрий
То, что у тебя уместилось в 12 строк у меня заняло одну строку. По поводу читабельности кода - это вопрос спорный.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
То, что у тебя уместилось в 12 строк у меня заняло одну строку
Протестую! Нечестно считать строки с пробелами и исходные данные, которые у Вас в коде не указаны. Прибавьте себе 5 строк для честности))))))


По поводу читабельности кода - это вопрос спорный
Согласен.
В книгах "Совершенный код", и "Чистый код" авторы в споре о коде "быстро&читабельно" выбрали для себя "читабельно". Аргументы подробно изложены в данных книгах на более чем 1000 страниц.
И спорить можно бесконечно, но мы даже не спросили человека о задаче, что "Точка в данном направлении на заданном расстоянии" повторяется 1 раз или 10 млн. раз в цикле.  Без этого спор бессмысленный ;-).

В данном случае предлагаю не быстрое решение конкретной задачи, т.к. решение задачи уже предложено Вами и для задачи оптимально.
Но рекомендую общий подход решения любых геометрических задач, в том числе и данной задачи, используя Vector2d, и соответственно операции на уровне векторов.
Это удобно и понятно, хоть и немного медленнее.

Основной логический код в данном случае, это сложение векторов:
 Vector2d vector3 = vector0 + vector2;
остальное - обслуга данной строчки
...как-то так, извиняйте если что не так)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Протестую! Нечестно считать строки с пробелами и исходные данные, которые у Вас в коде не указаны. Прибавьте себе 5 строк для честности))))))
Ладно. Хотя Modis указал, что у него уже есть pt1, pt2 и Length, так что непонятно зачем их нужно в примере задавать (да ещё и такие странные).

Но рекомендую общий подход решения любых геометрических задач, в том числе и данной задачи, используя Vector2d, и соответственно операции на уровне векторов.
Почему же Vector2d, когда пространство с которым оперирует AutoCAD трехмерное и в большинстве случаев (как минимум 90%) используется Vector3d, а не Vector2d? Да и точки обычно Point3d, а не Point2d.
С учетом того, что операция вычитания из Point3d другой Point3d возвращает Vector3d, а прибавление Vector3d к Point3d возвращает Point3d всё резко упрощается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
да ещё и такие странные
ну линию в автокаде начертил, и поставил pt2 посредине, чтоб не выдумывать pt3 и проверить результат.
Координаты оттуда и взял)

Почему же Vector2d
Согласен, взял частный случай 2d.  Можно смело заменить на Vector3d ничего в коде особо не измениться.
....Ну и точки соответственно Point3d использовать

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я пока не могу проверить и попробовать все это, но на данный момент ответ Александра Ривилиса пока понятней. Хотя хочется именно разобраться с Vector3D

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
на данный момент ответ Александра Ривилиса пока понятней. Хотя хочется именно разобраться с Vector3D

Александр также использовал Vector3D, вот тут (pt2 - pt1).

Чтоб понять в чем удобство явного использования Vector2D(Vector3D), представьте более сложную задачу:
Ну к примеру расчитать перемещение резца на станке с ЧПУ, после нескольких операций.
у вас более сложное смещение, состоящее из трех продольных смещений, одного поперечного, снова продольного и например смещение под углом 35 градусов на 10мм.

Если попытаетесь описать формулу через операции с точками или координатами получится что-то явно громоздкое, плохо читаемое и плохо контролируемое.

в векторах у вас основная формула будет выглядеть например так:
Vector3d суммарноеСмещение = Продольное1 + продольное2 + продольное3+ поперечное +продольное4 + смещениена10ммПодУглом35;

Думаю согласитесь, что близко к решению данной задачи.

А перед основной формулой для каждого вектора вы распишите вычисление, например так
Продольное1 = точкаПослеФрезеровки - точкаНачалаКоординат;

продольное2 = точкаПослеПолировки - точкаПослеФрезеровки;

Да больше строк кода, да медленнее, чем через формулы с координатами. Но согласитесь более близко к геометрии, и проще написать/проверить ;-)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр также использовал Vector3D, вот тут (pt2 - pt1).
Именно. Как я уже писал операция вычитания Point3d из Point3d даёт результат в виде Vector3d
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение