Nano Hash - криптовалюты, майнинг, программирование

НЕ ортогональная проекция: проецирование точки на линию в заданном направлении (2d)

Мне нужно решение для проецирования 2d точки на 2d линию в определенном направлении. Вот что у меня есть до сих пор: вот как я делаю ортогональную проекцию:

CVector2d project(Line line , CVector2d point)
{
    CVector2d A = line.end - line.start;
    CVector2d B = point - line start;

    float dot = A.dotProduct(B);
    float mag = A.getMagnitude();

    float md = dot/mag;

    return CVector2d (line.start + A * md);
} 

Результат :

(Проецирование P на строку и результат Pr):

введите здесь описание изображения

но мне нужно спроецировать точку на линию в заданном НАПРАВЛЕНИИ, которая должна вернуть такой результат (точка проекта P1 на линию в определенном направлении вычислить Pr):

введите здесь описание изображения

Как я должен учитывать вектор направления для расчета Pr?

10.12.2013

Ответы:


1

Я могу придумать 2 метода из моей головы.

Лично я бы сделал это, используя аффинные преобразования (но, похоже, у вас нет этой концепции, поскольку вы используете векторы, а не точки). Процедура с аффинными преобразованиями проста. Поверните точки к одной из основных осей, прочитайте координату вашей точки, обнулите другое значение и выполните обратное преобразование. Причина этой стратегии в том, что почти все процедуры преобразования сводятся к очень простым, понятным для человека операциям со схемой аффинного преобразования. Так что никакой реальной работы не нужно делать, когда у вас есть инструменты и структуры данных под рукой.

Однако, поскольку вы этого не предвидели, я предполагаю, что вместо этого вы хотите услышать векторную операцию (потому что вы либо предпочитаете матричную операцию, либо убегаете, когда ее предлагают, это одно и то же). Итак, у вас следующая ситуация:

Пример того, как векторы приводят к вашему решению

Это выражается в виде системы уравнений (она намеренно показывает вам, что на данный момент это НЕ код, а математика):

line.start.x + x*(line.end.x - line.start.x)+ y*direction.x = point.x
line.start.y + x*(line.end.y - line.start.y)+ y*direction.y = point.y

теперь это можно решить для x (и y)

x = (direction.y * line.start.x - direction.x * line.start.y -
    direction.y * point.x + direction.x * point.y) /
    (direction.y * line.end.x - direction.x * line.end.y - 
     direction.y * line.start.x + direction.x * line.start.y);

// the solution for y can be omitted you dont need it

y = -(line.end.y * line.start.x - line.end.x * line.start.y - 
      line.end.y * point.x + line.start.y * point.x + line.end.x * point.y - 
      line.start.x point.y)/
     (-direction.y * line.end.x + direction.x * line.end.y + 
      direction.y *  line.start.x - direction.x * line.start.y)

Расчет сделан с помощью mathematica, если я не скопировал ничего неправильно, он должен работать. Но я бы никогда не использовал это решение, потому что оно непонятно (хотя это математика в средней школе или, по крайней мере, там, где я нахожусь). Но используйте преобразование пространства, как описано выше.

10.12.2013
  • Привет ! Прежде всего, извините за поздний пост, я был занят в эти дни. Наконец-то мне удалось решить его особым образом (аналогично вашему второму предложению), однако вы были правы: аффинные преобразования - правильный (или, по крайней мере, стандартный способ ), чтобы решить эту проблему, мне просто нужно углубиться в нее... В любом случае решение было очень простым: спроецируйте точку (P1) на вектор, ортогональный направлению. Теперь у нас есть новая точка (давайте назовем ее P2), поэтому нам просто нужно найти точку пересечения между двумя линиями (линия 1 и линия между точками P1 и P2). Результатом будет проекция (Pr на рис. 2). 20.12.2013
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..