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

Помогите найти матрицу 3×3 которая переобразует 2D-точку в точку перисичения двух прямых?

#0
21:52, 5 июля 2018

Короче дали мне вот такое задание:

У нас есть точка (x),  и есть источник света точка (y) . И есть линия L(l1,l2) .

Надо найти матрицу 3×3  которая преобразует точку (x) в  точку (p) которая являеттся теню от точки (x) на линии L(l1,l2) ? Причём все точки в 2D пространстве , а матрицу надо найти такую что  p = A * (x) где A это матрица 3×3 которую нам надо найти , а (p) это и есть тень ?

А верней надо сделать нечто подобное

p3 = A * vec3(x.x , x.y , 1.0) ;

p.x = p3.x /p3.z

p.y = p3.y/p3.z

Другими словами нам над найти точку перисчения линии [x , y] с линией [L(l1,l2)]

Через матрицу 3×3 A ? А точка перисичения это точка (p) должна делиться на координату p.z

Вот я написал такой код :

https://www.onlinegdb.com/HkEvF2FGQ ,

на что мне сказали что моя  матрица не должна зависит от точки (x) .

Очевидно что человек чушь собачую несет ибо такое невозможно! Обясните что этот  человек хочет от меня?

P.S я эму дал уже три варянта, и всё они находили правильные данные. И всё три варянта эго не устраивали, что эму нужнО ?

Как мне переписать функцию intersection_Matrix, что эго устраивало?


#1
0:01, 6 июля 2018

Это матрица перспективной проекции, просто не в 3д а в 2д. Конечно она не зависит от точки х.

#2
0:04, 6 июля 2018

werasaimon
> Очевидно что человек чушь собачую несет ибо такое невозможно!
Как 3д-акселераторы могут существовать в действительности, если проекционных матриц - не существует? Изображение

#3
1:00, 6 июля 2018

Другими словами нам над найти точку перисчения линии [x , y] с линией [L(l1,l2)]

vec3 tmp = cross(cross(vec3(x, 1.0), vec3(y, 1.0)), cross(vec3(l1, 1.0), vec3(l2, 1.0)));
vec2 p = tmp.xy / tmp.z;
Но походу тебя просят сделать матрицу проекции в 2д для построения 2д шедоумапы, а это не точка пересечений двух линий.

#4
22:06, 6 июля 2018

Матрица проекции даст не точку, а линию тени.  То есть чем дальше будет стоять точка от линии, тем больше будет тень .
А мне надо именно матрицу проекции на линию по опридиленому напрвлению!
MrShoor
> Но походу тебя просят сделать матрицу проекции в 2д для построения 2д
> шедоумапы, а это не точка пересечений двух линий.
Вот и я так думаю  , но тот кто меня просит явно этого не догоняет. И поэтому фиг поймешь что эму надо ?

MrShoor
> Другими словами нам над найти точку перисчения линии [x , y] с линией
> [L(l1,l2)]
> vec3 tmp = cross(cross(vec3(x, 1.0), vec3(y, 1.0)), cross(vec3(l1, 1.0),
> vec3(l2, 1.0)));
> vec2 p = tmp.xy / tmp.z;
Вот наверно вместо cross надо использовать косиметричную матрицу  , и получить то что мне нужно!?

P.S : вот например матрица проекции и матрица взгляда  с моей математической библиотеки . И как мне найти нужную точку , а верней матрицу

+ Показать

#5
21:49, 18 июля 2018

Кароче думал каким боком суда можно вписать матрицу проекции ortho_3×3/perspective_3×3.  Что получить нужную мне матрицу которая переводит точку в точку перисичения.  И пришел к выводу что ни каким ! Может кто то подскажет каким боком это сделать? И причём матрица проекции не должна зависит от точки которую она будет трансформировать

#6
22:34, 18 июля 2018

Обозначим равномерные координаты {x, y, w}.
Тогда точка p обозначится вектором:

    Изображение

А прямая l - ковектором:

    Изображение

Соответственно, условие нахождения точки q на прямой l:

    Изображение

Нужно найти матрицу m, проецирующую произвольную точку на эту прямую:

    Изображение

    Изображение

Таким образом, задача сводится к решению уравнения:

    Изображение

для неизвестного mαβ, выраженное через lα.

Обрати внимание - поскольку однородные координаты нечувствительны к масштабу, у уравнения будет бесконечное множество решений, отличающихся масштабом.

Альтернативно, можно представить задачу через поиск оператора f, отображающего произвольную прямую на соответствующую проецирующую матрицу:

    Изображение

Тогда ответом будет αβγ, не зависящий ни от одной переменной.

#7
23:35, 18 июля 2018

Delfigamer
> Обозначим равномерные координаты {x, y, w}.
> Тогда точка p обозначится вектором:
>    
>
> А прямая l - ковектором:
>
>    
>
> Соответственно, условие нахождения точки q на прямой l:
>
>    
>
> Нужно найти матрицу m, проецирующую произвольную точку на эту прямую:
>
>    
>
>    
>
> Таким образом, задача сводится к решению уравнения:
>
>    
>
> для неизвестного mαβ, выраженное через lα.
>
> Обрати внимание - поскольку однородные координаты нечувствительны к масштабу, у
> уравнения будет бесконечное множество решений, отличающихся масштабом.
>
> Альтернативно, можно представить задачу через поиск оператора f, отображающего
> произвольную прямую на соответствующую проецирующую матрицу:
>
>    
>
> Тогда ответом будет f αβγ, не зависящий ни от одной переменной.


Ну это всё понятно , Да именно это мне и нужно!
Но мне надо готовое ришения для отображения f(m) : q => p ? Ну то бишь , нужен сам способ взятия такой матрицы m ?

#8
2:56, 19 июля 2018

Только сейчас увидел про источник света.
Там точно такой же принцип - записываешь уравнения в однородных координатах и решаешь.

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

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