Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2020, 16:13   #11
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

я вот что не понял:
Цитата:
Сообщение от Pavia Посмотреть сообщение
Система
N*P+D=0
P=R*t+R0
Решаем подставим второе уравнение в первое
N*R*t+N*R0+D=0
как у вас это получилось? Если подставить второе в первое, то должно получиться так: N*(R*T+R0)+D=0

Цитата:
Сообщение от Pavia Посмотреть сообщение
Подставляем ваши значения P=R*t+R0 получаем rayStart==R*0+R0 откуда
R0=rayStart;
что такое t и почему здесь оно равно 0?


Цитата:
Сообщение от Desc Посмотреть сообщение
Не пойму, каким боком квадрат до 3D
Если речь о 3D, тогда не квадрат а куб.
а куб из чего состоит?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2020, 17:26   #12
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Из восьми координатных точек.
Периметр куба обозначен 8-ю координатными точками на трехмерной координатной сетке.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 19.07.2020, 17:49   #13
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Из восьми координатных точек.
ну это как посмотреть.
на самом деле куб состоит из шести квадратов, каждый из которых состоит из четырёх вершин.
Цитата:
Сообщение от Desc Посмотреть сообщение
Из восьми
тогда уж из двух

Последний раз редактировалось BLACK_RAIN; 19.07.2020 в 17:51.
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.07.2020, 18:38   #14
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Видимо, квадрат не параллелен ни одной из координатных плоскостей, потому 3D - трёхмерное пространство, короче. Если преобразовать координатную систему в другую, где квадрат расположен в одной из координатных плоскостей, его стороны - по двум осям координат, один из углов тогда будет в точке 0,0,0 новой системы, то, может быть решалось бы легче. Но думать неохота - лето, жара.
Геометрия - наука нудная. Даже аналитическая геометрия. На мой взгляд.
http://www.reshebnik.ru/solutions/9/13/

Последний раз редактировалось digitalis; 19.07.2020 в 18:43.
digitalis вне форума Ответить с цитированием
Старый 19.07.2020, 20:23   #15
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
Не пойму, каким боком квадрат до 3D
Все 3-х мерные тела делают из четырёхугольников(Quadrilateral) если делать из и треугольников то возникают артифакты.
https://youtu.be/k_S1INdEmdI
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 19.07.2020 в 20:57.
Pavia вне форума Ответить с цитированием
Старый 19.07.2020, 20:53   #16
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
как у вас это получилось? Если подставить второе в первое, то должно получиться так: N*(R*T+R0)+D=0
Так скобки раскрыть.
Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
что такое t и почему здесь оно равно 0?
Допустим мы хотим пересчитать все точки луча. Для этого будем рисовать направляющий вектор - vec{a} который указывает на точки луча. Все эти вектора имеют масштабный параметр t.
t*vec{a} меняя t вы можете пересчитать все точки. У луча есть начальная точка и удобно поместить начало направляющего вектора в эту точку и при t=0 мы получаем что t*vec{a} - указывает на начальную точку.

https://youtu.be/NJRtk9TgcXY
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 20.07.2020, 09:19   #17
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

набросал код:
Код:
bool SameSide(glm::vec3 p1, glm::vec3 p2, glm::vec3 a, glm::vec3 b)
{
    glm::vec3 cp1 = glm::cross(b - a, p1 - a);
    glm::vec3 cp2 = glm::cross(b - a, p2 - a);
    if (glm::dot(cp1, cp2) >= 0)
    {
        return true;
    }
    return false;
}

bool PointInTriangle(glm::vec3 p, glm::vec3 p1, glm::vec3 p2, glm::vec3 p3)
{
    glm::vec3 a = p1;
    glm::vec3 b = p2;
    glm::vec3 c = p3;
    if (SameSide(p, a, b, c) && SameSide(p, b, a, c) && SameSide(p, c, a, b)) //тут false
    {
        glm::vec3 vc1 = glm::cross(a - b, a - c);
        if (abs(glm::dot(a - p, vc1)) <= 0.01f)
        {
            return true;
        }
    }
    return false;
}

bool Intersect(RAY ray, glm::vec3 p1, glm::vec3 p2, glm::vec3 p3, glm::vec3 p4)
{
    glm::vec3 n = glm::cross(p2 - p1, p4 - p1);
    glm::vec3 d = -n * p1;
    glm::vec3 r0 = ray.start;
    glm::vec3 r = ray.finish - ray.start;
    glm::vec3 p = -(n * r0 + d) / n + d;
    return (PointInTriangle(p, p1, p2, p4) || PointInTriangle(p, p2, p3, p4));
}

    RAY ray;
    ray.start = glm::vec3(5.0f, 0.5f, 1.0f);
    ray.finish = glm::vec3(5.0f, 0.5f, -1.0f);

    glm::vec3 p1(0.0f, 0.0f, 0.0f);
    glm::vec3 p2(10.0f, 0.0f, 0.0f);
    glm::vec3 p3(10.0f, 10.0f, 0.0f);
    glm::vec3 p4(0.0f, 10.0f, 0.0f);
    if (Intersect(ray, p1, p2, p3, p4))
    {
        std::cout << ":)" << std::endl;
    }
но не работает
в дебаггере p равно чему-то непонятому:

там получается n(0,0,100), а потом на это делится.
Почему мы делим на 0?

Последний раз редактировалось BLACK_RAIN; 20.07.2020 в 10:51.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.07.2020, 12:39   #18
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

В книге ничего по этому не сказано.
t - общее для всех. Достаточно взять любое не 0 значение нормали.
Код:
float t;
if (n.x != 0 ) t=-(n.x*r0.x+d)/n.x*r.x
  else t=-(n.y*r0.y+d)/n.y*r.y
    else t=-(n.z*r0.z+d)/n.z*r.z
      else return false; // особый случай
glm::vec3 p = r*t + r0;

П.С. Заметил у себя ошибку. Вместо "+d" должно быть "r0"
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 20.07.2020, 13:15   #19
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
П.С. Заметил у себя ошибку. Вместо "+d" должно быть "r0"
P= -(N * R0 + R0) / N + R0;
то есть, так должно быть?
Цитата:
Сообщение от Pavia Посмотреть сообщение
t - общее для всех. Достаточно взять любое не 0 значение нормали.
Я совсем запутался. Зачем откуда-то (и откуда?) брать нормаль? Она же вычисляется исходя из позиций вершин квада. Вы сами писали, что N=CrossProduct(p2-p1,p4-p1); а t у вас было равно 0.
если нет, то я тогда не понял.
не проще будет мой код отредактировать, чтобы оно просто заработало? Я очень туго соображаю в математике. А тут даже не математика, а линейная алгебра.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.07.2020, 15:58   #20
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
А тут даже не математика, а линейная алгебра.
Точнее - аналитическая геометрия. Но и та, и другая - это отрасли математики.
https://www.matburo.ru/ex_subject.php?p=geom
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать пересечение луча и модели в OpenGL? Rasool Мультимедиа в Delphi 1 28.03.2015 23:07
Обрезание луча по границам прямоугольника С# Weyner Помощь студентам 0 10.04.2013 17:10
Обрезание луча по границам прямоугольника Weyner C# (си шарп) 0 10.04.2013 17:00
Обратный ход луча по горизонтали 04h andy301086 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 23.12.2011 12:56
Отражение луча Illusionist Общие вопросы Delphi 3 30.05.2009 23:20