На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Выбор отрезка в пространстве курсором
    Здравствуйте.
    Есть проблемка. Необходимо программно реализовать выбор отрезка курсором.
    Т.е. имеем: в пространстве произвольно расположены отрезки, координаты известны.
    Также в пространстве произвольно располагается камера. Координаты, угол взгляда тоже известны.
    Нужно сделать выбор отрезка, который ближе всего (визуально) расположен к курсору:

    Скрытый текст
    Прикреплённая картинка
    Прикреплённая картинка

    Прикреплённая картинка
    Прикреплённая картинка



    Насколько я понимаю, алгоритм должен быть примерно такой:

    Скрытый текст
    Прикреплённая картинка
    Прикреплённая картинка


    Дано: P1 - точка наблюдения; вектор V - задает угол наклона камеры; отрезок 1-2.
    Находим плоскость, образованную точками P1-1-2, затем перпендикулярную ей плоскость, проходящую через отрезок 1-2. Потом находим точку P2 пересечения линии, заданной вектором V и этой перпендикулярной плоскостью. Дальше находим расстояние (d) от точки P2 до отрезка. Ну и как бы всё.
    Всё это проделываем для каждого отрезка и находим отрезок с минимальным расстоянием d.

    На словах всё хорошо, но с практикой у меня туговато. Можете популярно разжевать дураку как это реализовать?
    А то не очень дружу со всеми этими формулами.

    Ну с плоскостью P1-1-2 вроде понятно - нормальный вектор будет векторным произведением векторов (P1,1)x(P1,2). А дальше как?
    Сообщение отредактировано: Moorka -
      Цитата
      Потом находим точку P2 пересечения линии, заданной вектором V и этой перпендикулярной плоскостью. Дальше находим расстояние (d) от точки P2 до отрезка.


      Это не минимальное расстояние (хотя и близко к нему).

      Для поиска минимального расстояния между скрещивающимися прямыми в пространстве:

      Задать параметрически луч зрения как
      ExpandedWrap disabled
           P =  P1 + unitV * u


      Задать параметрически прямую, содержащую отрезок как
      ExpandedWrap disabled
           L = StartPoint + (EndPoint - StartPoint) * v


      Минимальный отрезок между этими прямыми перпендикулярен обеим

      ExpandedWrap disabled
            (L - P) .dot. unitV = 0
            (L - P) .dot. (EndPoint - StartPoint) = 0

      Решается система уравнений для неизвестных u и v.
      u должно быть положительным, v в пределах 0..1, иначе ближайшая точка отрезка - один из концов.

      Есть ещё особый случай - прямые параллельны.
      Сообщение отредактировано: MBo -
        Спасибо, вроде разобрался.

        Если P - точка наблюдения, v - вектор взгляда, AB - заданный отрезок, то:

        нормальный вектор плоскости, проходящей через P и вектор v и параллельной AB:

        n = [v x AB]

        И расстояние от прямой v до отрезка AB:

        dist = abs(Px*nx + Py*ny + Pz*nz - nx*Ax - ny*Ay - nz*Az) / sqrt(nx2 + ny2 + nz2)

        или так:

        dist = abs(Dot(P,n) - Dot(n,A)) / sqrt(Dot(n,n))
        Сообщение отредактировано: Moorka -
          Цитата MBo @
          Есть еще особые случаи - прямые пересекаются, прямые параллельны.

          "Прямые пересекаются" не является особым случаем и решается в рамках вышеописанного алгоритма - просто получится расстояние 0, и всё.
            OpenGL

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


            Рейтинг@Mail.ru
            [ Script execution time: 0,0769 ]   [ 19 queries used ]   [ Generated: 19.04.24, 06:21 GMT ]