Войти
ПрограммированиеФорум2D графика и изометрия

Как Обобщить алгоритм IntersectRayToAABBox для N-мерного случая ( 3D-Графика )

Страницы: 1 2 Следующая »
#0
0:33, 18 июля 2018

вот есть самый простой  код , для  алгоритма  IntersectRayToAABBox-в 3D ,
этот алгоритм нужен для проверки истины . для пресечения луча(Ray)  с коровкой(Axis-Aligned Bounding-Box) ,,,!

+ Показать


а мне надо чтоб было , что типа такого , чтоб обобщить  IntersectRayToAABBox на N-мерный случай
вот немного кода для примера , чтоб понять как это , типа ,  должно быть !!!!!!!

Vec<T> min, max;
 bool IntersectRayToAABBox( Ray<Vec<T>> &r)
          {

             //------------- help me ?-----------------------//
               T enter = T(0.0f);
              T exit  = T(1.0f);

              T tx1 = (min[0] - r.origin[0]) / r.direction[0];
              T tx2 = (max[0] - r.origin[0]) / r.direction[0];

              T tmin = std::min(tx1, tx2);
              T tmax = std::max(tx1, tx2);

              for (std::size_t i = 0; i < Vec<T>::components; ++i)
              {
                  if(std::abs(r.direction[i]) < T(0.00001) ) continue;

                  T tx1 = (min[i] - r.origin[i]) / r.direction[i];
                  T tx2 = (max[i] - r.origin[i]) / r.direction[i];

                  tmin  = std::max(tmin, std::min(tx1, tx2));
                  tmax = std::min(tmax, std::max(tx1, tx2));

                  if(tmin > tmax)
                  {
                    std::swap(tmin,tmax);
                    return false;
                  }


                  //Reduce interval based on intersection
                  if(tmin > enter) enter = tmin;
                  if(tmax < exit)  exit  = tmax;
              }

              r.maxFriction = enter;

              return true;

          }

    
P>S: Vec<T>::components_size == это количество компонент у вектора. типа 1D.2D.3D.....!
[1,2,3......n] == оператор на компоненту вектора

Если кто имеет готовое Хорошие решения для n-мерного случая  для IntersectRayToAABBox_N ,то поделитесь кодом , пожалуйста , ну или подскажите как это сделать лучшее всего ?
P>S: ili soevt&?


#1
5:05, 18 июля 2018

werasaimon
> для пресечения луча(Ray)  с коровкой
пересечение луча с коровкой. вау.

код пересечения всегда одинаковый для любой размерности:

Vector minScales = (aabb.minPoint - ray.origin) * ray.invDir; //покомпонентное умножение
Vector maxScales = (aabb.maxPoint - ray.origin) * ray.invDir;

Scalar minParam = min(minScales, maxScales).GetMaxComponent();
Scalar maxParam = max(minScales, maxScales).GetMinComponent();

return minParam < maxParam;
здесь min — покомпонентный минимум двух векторов, GetMinComponent() возвращает минимальную компоненту вектора.
#2
5:23, 18 июля 2018

Suslik
> код пересечения всегда одинаковый для любой размерности:
>
> Vector minScales = (aabb.minPoint - ray.origin) * ray.invDir; //покомпонентное
> умножение
> Vector maxScales = (aabb.maxPoint - ray.origin) * ray.invDir;
>
> Scalar minParam = min(minScales, maxScales).GetMaxComponent();
> Scalar maxParam = max(minScales, maxScales).GetMinComponent();
>
> return minParam < maxParam;
так это практический тоже самое что и я написал в коде номер два !
Но все ровно попробую так !
Ещё вопрос , Правильно ли я понял твои функции ?

Vector min( Vector min , Vector max )
{
   Vector res;
    for (std::size_t i = 0; i < Vector::components_size; ++i)
   { 
             res[i] = std::min(min[i],max[i]);
   }
   return res;
}


Vector max( Vector min , Vector max )
{
   Vector res;
    for (std::size_t i = 0; i < Vector::components_size; ++i)
   { 
             res[i] = std::min(min[i],max[i]);
   }
   return res;
}

float Vector::GetMinComponent() const
{
    float  min = this.data[0];
    for (std::size_t i = 0; i < Vector::components_size; ++i)
   {
       if( this[i] < min )
       {
            min = this.data[i];
       }
   }
   return min;
}

float Vector::GetMaxComponent() const
{
    float  max = this.data[0];
    for (std::size_t i = 0; i < Vector::components_size; ++i)
   {
       if( this[i] > max )
       {
            max = this.data[i];
       }
   }
   return max;
}

P>S: а почему GetMinComponent , а не getMinComponent ?

#3
7:25, 18 июля 2018

werasaimon
> P>S: а почему GetMinComponent , а не getMinComponent ?
А есть разница? Ведь Suslik просто привел псевдокод, который написал так как ему было удобно и все. В данном случае вопросы стиля, как мне кажется, не очень уместны.

#4
7:59, 18 июля 2018

Vlad2001_MFS
> А есть разница? Ведь Suslik просто привел псевдокод, который написал так как
> ему было удобно и все. В данном случае вопросы стиля, как мне кажется, не очень
> уместны
но мне просто было интересно почему  Suslik пишет в таком  стили , может в таком стили .  есть какие то плюсы ..!?
P.S и плюс я уже очень долго , сам не могу сделать выбор между начинать функции с буквы в нижнем  , или верхнем регистре (как красивее будет) ?

Чтоб не писать новый пост , то я уже напишу тут !
  Может есть у кого обобщоный на n-мерное пространство алгоритм для колизии GJK-EPA или GJK-SAP . Поделитесь кодом или подсказокой .!?

#5
11:41, 18 июля 2018

werasaimon
> P.S и плюс я уже очень долго , сам не могу сделать выбор между начинать функции
> с буквы в нижнем  , или верхнем регистре (как красивее будет) ?
Красота субъективна. В первую очередь она идет из стиля того кода, в котором ты работаешь.

#6
12:05, 18 июля 2018

werasaimon
Если на работе есть соглашение по оформлению кода, то пиши как там указано. Иначе просто открой блокнот и напиши там всякие названия в двух разных стилях - какой больше понравится тот и выбирай. Не стоит на этом зацикливаться.

#7
12:14, 18 июля 2018

Vlad2001_MFS
> Если на работе есть соглашение по оформлению кода, то пиши как там указано.
К сожалению так оно и есть , и от такой красоти кода , блевать то тянет , особено от получение гетеров без префикса get !

P.S: вот что я бы всем посоветовал,  писать инкапислируваные перименые в класах, не вот так m_nameValue , а вот так mNameValue.  Так как проводилсь исследования, и было выяснено что наш мозг практический не воспринимает там ту черту (_). И второй метод красивее!

#8
13:36, 18 июля 2018

красивым всегда кажется то оформление кода, к которому привык. с опытом, когда поработаешь над многими проектами и привыкнешь к оформлению кода каждого из них, любой стандартно оформленный код воспринимается нормально. кроме winapi, разумеется.

#9
13:44, 18 июля 2018

Suslik
> кроме winapi, разумеется
Реализацию STL от Miscrosoft не забудь еще.

#10
15:28, 18 июля 2018

Eugene
> Реализацию STL от Miscrosoft не забудь еще.
это что ли тоже кодом считается?

#11
16:50, 18 июля 2018

Suslik
> с опытом, когда поработаешь над многими проектами и привыкнешь к оформлению
> кода каждого из них, любой стандартно оформленный код воспринимается нормально
Ну это еще и от человека зависит. Я не имея опыта вполне спокойно отношусь к любым стандартным стилям кода. Единственное - не очень хорошо воспринимаю такое форматирование:

+ Скриншот
+ Сам код, но сломано форматирование
#12
17:19, 18 июля 2018

Vlad2001_MFS
Есть объективно плохие вещи, и это — одна из них.
Объективным критерием качества кодстайла может считаться то, как много кода аффектится некоторым конкретным изменением, и какова вероятность коллизии двух разных изменений в одной строке.
Иными словами, кодстайл тем лучше, чем выше обособленность строк кода.
Потому что это напрямую влияет на качество истории репозитория и сложность мержей.

Читаемость слишком субъективна, чтобы ее мерить. И адекватные кодстайлы читаются более-менее одинаково.

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

void foo(int a,
   int b,
   int c)
{
   (void)a,b,c;
}

void bar(int a,
         int b,
         int c)
{
   (void)a,b,c;
}
Переименование foo в foo1 заденет только одну строку, переименование bar в bar1 заденет три строки (потому что нужно будет пододвинуть выравнивание). Значит, первое форматирование лучше второго.

#13
17:24, 18 июля 2018

Eugene
Полностью согласен. Пример, кстати, был из X-Ray'я - там такого много.

#14
21:34, 18 июля 2018

Вот лично я пишу код в стиле GNU/C++, но только я адекватно выравнивою блоки , а по использую шаблоны (патерны ) GoF/MVC. И я не могу воспринимать другой стиль кода . Потому что очевидно что это самый красивый стиль кода в мире  . А все другие стили может и удобные , но не такие красивые !
А код должен обязан быть красивым как с точки зрения стиля кода , так и из точки алгоритма  . Так и с художественной точки зрения .
Иначе это код ни кто не поймет , и будет как Microsoft с их (winapi) . И все подумают что вы больные !

P.S:  видь код это искуствво , хороший код как хорошая картина (Восхищает) , и заставляет задуматься . Не так ли ?

Страницы: 1 2 Следующая »
ПрограммированиеФорум2D графика и изометрия

Тема в архиве.