проецирование 3D в 2D
От: xmlx  
Дата: 21.09.05 16:29
Оценка:
double n_x,n_y,n_z;  //компоненты нормального вектора N к плоскости P (ед. вектор)
double x_0,y_0,z_0; // координаты точки проецируемой на плоскость P
double s_x,s_y,s_z; // координаты точки вектора N (точка S)
double l;        // расстояние от проецируемой точки до точки S
double Xp,Yp; // координаты на плоскости P
double Y_x,Y_y,Y_z; // направление оси Y на плоскости P (ед. вектор)
double vx,vy,vz,vl;
double cf_a=0.001;

// проецирование на плоскость
// точка с коорд. (x0,y0,z0) в точку на плоскости (Xp,Yp)
void 3Dto2D()
{l=fabs(n_x*(x_0-s_x)+n_y*(y_0-s_y)+n_z*(z_0-s_z));
 vx=x_0-s_x-n_x*l;
 vy=y_0-s_y-n_y*l;
 vz=z_0-s_z-n_z*l;
 vl=sqrt(vx*vx+vy*vy+vz*vz);
 vx=vx/(cf_a*l);
 vy=vy/(cf_a*l);
 vz=vz/(cf_a*l);
 Yp=vx*Y_x + vy*Y_y + vz*Y_z;
 Xp=vx*(n_y*Y_z-n_z*Y_y)+vy*(n_z*Y_x-n_x*Y_z)+vz*(n_x*Y_y-n_y*Y_x);
};


кто-нибудь знает лучший алгоритм?

мой email
xmlx2005@goolook.ru
Re: проецирование 3D в 2D
От: dsorokin Россия  
Дата: 21.09.05 18:13
Оценка:
Ээ... суровый метод

Проецирование на плоскость — это просто обобщенное преобразование Фурье. Новые коэффициенты вычисляются как скалярные произведения исходного вектора на базисные ортонормированные векторы плоскости P

    double x_0,y_0,z_0; // координаты точки, проецируемой на плоскость P
    double X_x,X_y,X_z; // направление оси X на плоскости P (ед. вектор)
    double Y_x,Y_y,Y_z; // направление оси Y на плоскости P (ед. вектор)
    double Xp,Yp; // координаты на плоскости P

    void 3Dto2D() {
        
        Xp = x_0 * X_x + y_0 * X_y + z_0 * X_z;
        Yp = x_0 * Y_x + y_0 * Y_y + z_0 * Y_z;
    }


причем должно выполняться

    X_x * Y_x + X_y * Y_y + X_z * Y_z == 0;
    X_x * X_x + X_y * X_y + X_z * X_z == 1;
    Y_x * Y_x + Y_y * Y_y + Y_z * Y_z == 1;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: проецирование 3D в 2D
От: dsorokin Россия  
Дата: 21.09.05 18:22
Оценка:
Сорри, забыл добавить точку центра координат плоскости P

    double x_0,y_0,z_0; // координаты точки, проецируемой на плоскость P
    double s_x,s_y,s_z; // координаты точки вектора N (точка S)
    double X_x,X_y,X_z; // направление оси X на плоскости P (ед. вектор)
    double Y_x,Y_y,Y_z; // направление оси Y на плоскости P (ед. вектор)
    double Xp,Yp; // координаты на плоскости P

    void 3Dto2D() {
        
        Xp = (x_0 - s_x) * X_x + (y_0 - s_y) * X_y + (z_0 - s_z) * X_z;
        Yp = (x_0 - s_x) * Y_x + (y_0 - s_y) * Y_y + (z_0 - s_z) * Y_z;
    }
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: проецирование 3D в 2D
От: xmlx  
Дата: 22.09.05 04:59
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Сорри, забыл добавить точку центра координат плоскости P


D>
D>    double x_0,y_0,z_0; // координаты точки, проецируемой на плоскость P
D>    double s_x,s_y,s_z; // координаты точки вектора N (точка S)
D>    double X_x,X_y,X_z; // направление оси X на плоскости P (ед. вектор)
D>    double Y_x,Y_y,Y_z; // направление оси Y на плоскости P (ед. вектор)
D>    double Xp,Yp; // координаты на плоскости P

D>    void 3Dto2D() {
        
D>        Xp = (x_0 - s_x) * X_x + (y_0 - s_y) * X_y + (z_0 - s_z) * X_z;
D>        Yp = (x_0 - s_x) * Y_x + (y_0 - s_y) * Y_y + (z_0 - s_z) * Y_z;
D>    }
D>


так это не эквивалентное преобразование! Yp здесь будет меньше на (n_x*l*Y_x+n_y*l*Y_y+n_z*l*Y_z)

моё значение Yp=(x_0-s_x)*Y_x + (y_0-s_y)*Y_y + (z_0-s_z)*Y_z — (n_x*l*Y_x+n_y*l*Y_y+n_z*l*Y_z);

или у меня алгоритм что-то искажает... но выдает правдоподобную картинку...
Re[4]: проецирование 3D в 2D
От: dsorokin Россия  
Дата: 22.09.05 08:19
Оценка: 2 (1)
X>так это не эквивалентное преобразование! Yp здесь будет меньше на (n_x*l*Y_x+n_y*l*Y_y+n_z*l*Y_z)

Все правильно , здесь же скалярное произведение нормали плоскости на ее базисный вектор! Такое выражение должно быть равно нулю по-определению, поскольку нормаль ортогональна любому вектору плоскости.

Честно говоря, я не совсем понял, зачем у вас используется коэффициент cf_a = 0.001. Может быть, у вас пространства не совсем эвклидовские? Такое тоже возможно, но тогда нужно будет несколько подкорректировать формулы, хотя математическая сущность везде останется одинаковой.

Также хочу обратить внимание, что очень важно правильно вычислять базисные векторы X и Y для плоскости P. Если мы знаем базисный Y и нормаль N, то в вашем случае (3D -> 2D) вектор X будет равен с точностью до знака нормированному по длине векторному произведению Y и N: X = +/- [Y, N] / sqrt ([Y, N], [Y, N]).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: проецирование 3D в 2D
От: sch  
Дата: 22.09.05 12:45
Оценка: 3 (1)
Demo Design 3D programming FAQ тебе в помощь
http://www.enlight.ru:8004/faq3d/content.htm
Posted via RSDN NNTP Server 1.9
А можно глупый вопрос?
От: Константин Россия  
Дата: 22.09.05 13:00
Оценка: +2
Здравствуйте, dsorokin, Вы писали:

D>Проецирование на плоскость — это просто обобщенное преобразование Фурье.


При чём здесь Фурье?
Когда я слышу слова преобразование Фурье как-то сразу представляется изоморфизм гильбертовых пространств. Ну там
L_2->l_2 (ряд Фурье)
L_2->L_2 (преобразование Фурье)

Всякие там слова типа равенство Парсеваля, обратное преобразование... Проецирование на плоскость никак не вяжется с этим.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: А можно глупый вопрос?
От: dsorokin Россия  
Дата: 22.09.05 14:05
Оценка:
К>При чём здесь Фурье?

Просто математики любят обобщать

Преобразование Фурье можно ввести не только для бесконечно-мерных гильбертовых пространств типа L2, но и для n-мерных эвклидовых пространств типа 3D/2D. То, что получается в результате преобразования исходной точки, иногда принято называть проекцией этой точки на то линейное многообразие, которое порождается соотвествующим базисом. Классический ряд Фурье из курса матана и простое визуальное проецирование из 3D на 2D — частные случаи более общего проецирования, при котором всегда находится ближайшая точка из соответсвующего многообразия.

Если есть интерес к этой теме, то могу посоветовать замечательную книгу A.H. Колмогорова и С.В. Фомина "Элементы теории функций и функционального анализа". Что касается самого названия проекция, то оно используется, например, в книге А.Н. Ширяева "Вероятность".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: А можно глупый вопрос?
От: Константин Россия  
Дата: 22.09.05 14:43
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Преобразование Фурье можно ввести не только для бесконечно-мерных гильбертовых пространств типа L2, но и для n-мерных эвклидовых пространств типа 3D/2D. То, что получается в результате преобразования исходной точки, иногда принято называть проекцией этой точки на то линейное многообразие, которое порождается соотвествующим базисом. Классический ряд Фурье из курса матана и простое визуальное проецирование из 3D на 2D — частные случаи более общего проецирования, при котором всегда находится ближайшая точка из соответсвующего многообразия.


Для меня нов такой взгляд на преобразование Фурье
Если честно признаться, я не очень понимаю какое отношение проекция имеет к к преобразованию Фурье/Интегралу Фурье...

Я рассматриваю преобразование Фурье как изоморфизм гильбертовых пространств: L_2(G) и L_2(группа характеров G).
Здесь G — локально компактная коммутативная группа.

D>Если есть интерес к этой теме, то могу посоветовать замечательную книгу A.H. Колмогорова и С.В. Фомина "Элементы теории функций и функционального анализа". Что касается самого названия проекция, то оно используется, например, в книге А.Н. Ширяева "Вероятность".


Книжки хорошие, согласен... Я с ними знаком
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: А можно глупый вопрос?
От: dsorokin Россия  
Дата: 22.09.05 16:02
Оценка: 3 (1)
К>Для меня нов такой взгляд на преобразование Фурье

Это преобразование таит в себе много интересного

Когда-то я интересовался нейронными сетями. Так вот, если рассматривать нейронную сеть Хопфилда, то там просто бросаются в глаза прямые аналогии с преобразованием Фурье. Конечно, не все так строго, многие вещи не выполняются, но уж очень похоже... Считается, что сеть Хопфилда в некотором приближении является моделью того, как работает человеческая ассоциативная память.


К>Если честно признаться, я не очень понимаю какое отношение проекция имеет к к преобразованию Фурье/Интегралу Фурье...


Можно использовать слово проекция, потому что в результате всегда находится ближайшая точка к исходной в соответствующей метрике и из соответствующего пространства. Наверное, классическое преобразование Фурье — это не самый лучший пример, потому что здесь мы отображаем L2 на тоже самое пространство L2, конечно, если я ничего не забыл за последние несколько лет своей программисткой деятельности . Так вот, поэтому здесь самого проецирования как бы не видно. Зато, если отображаем большое пространство на меньшее под-пространство, то тогда сразу становится понятно, почему результат можно назвать проекцией. Преобразование 3D -> 2D — тому частный пример.


К>Я рассматриваю преобразование Фурье как изоморфизм гильбертовых пространств: L_2(G) и L_2(группа характеров G).

К>Здесь G — локально компактная коммутативная группа.

Честно говоря, совсем не силен в этом. Видимо, это — что-то из алгебры?

Лично мне ближе следующее понимание преобразования Фурье. Берем некоторое, возможно бесконечное, множество векторов {e_1, e_2, ...}. Назовем их базисными. Пространство — линейное. Также обозначим через (x, y) — скалярное произведение x на у. Тогда рядом Фурье можно назвать следующую сумму

    Ф (x) = (x, e_1)*e_1 + (x, e_2)*e_2 + ... = sum_i { (x, e_i)*e_i }.


К такой форме приводится классический ряд Фурье (L2). Между прочим, тогда заметно упрощаются многие доказательства — там где раньше было несколько страниц, исписанных разными синусами и косинусами, появляется всего пара строчек для доказательства основных утверждений. Точно в таком же виде можно записать и наше проецирование из 3D на 2D. Более того, примерно также описывается работа нейронной сети Хопфилда (если не учитывать дискретности и некоторых других вещей), только в последнем случае, конечно, не может быть никакой речи об ортонормированности системы {e_1, e_2, ...} и выполнения прочих условий.

Так вот, если {e_1, e_2, ...} — ортонормированный базис, то точка Ф(x) — будет ближайшей к исходной точке x из того линейного мноообразия P (пространства), которое порождается линейными комбинациями {e_1, e_2, ...}. Поэтому Ф(x) можно назвать проекцией x на пространство P. В классическом же и частном случае ряда Фурье, имеем просто Ф(x) ~ x, что в общем случае может и не выполняться.

Так что, очень интересная штука — этот ряд Фурье.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: проецирование 3D в 2D
От: xmlx  
Дата: 22.09.05 16:06
Оценка:
Здравствуйте, dsorokin, Вы писали:

X>>так это не эквивалентное преобразование! Yp здесь будет меньше на (n_x*l*Y_x+n_y*l*Y_y+n_z*l*Y_z)


D>Все правильно , здесь же скалярное произведение нормали плоскости на ее базисный вектор! Такое выражение должно быть равно нулю по-определению, поскольку нормаль ортогональна любому вектору плоскости.


D>Честно говоря, я не совсем понял, зачем у вас используется коэффициент cf_a = 0.001. Может быть, у вас пространства не совсем эвклидовские? Такое тоже возможно, но тогда нужно будет несколько подкорректировать формулы, хотя математическая сущность везде останется одинаковой.


D>Также хочу обратить внимание, что очень важно правильно вычислять базисные векторы X и Y для плоскости P. Если мы знаем базисный Y и нормаль N, то в вашем случае (3D -> 2D) вектор X будет равен с точностью до знака нормированному по длине векторному произведению Y и N: X = +/- [Y, N] / sqrt ([Y, N], [Y, N]).



спасибо,
теперь ясно... (n_x*Y_x+n_y*Y_y+n_z*Y_z) = 0 ,так как угол между ними pi/2

// проецирование на плоскость
// точка с коорд. (x0,y0,z0) в точку на плоскости (Xp,Yp)
void p3Dto2D()
{l=fabs(n_x*(x_0-s_x)+n_y*(y_0-s_y)+n_z*(z_0-s_z));
 vx=x_0-s_x;
 vy=y_0-s_y;
 vz=z_0-s_z;
 Yp=vx*Y_x + vy*Y_y + vz*Y_z;
 Xp=vx*(n_y*Y_z-n_z*Y_y)+vy*(n_z*Y_x-n_x*Y_z)+vz*(n_x*Y_y-n_y*Y_x);
 Xp/=cf_a*l;
 Yp/=cf_a*l;
};



этот оптимизированный код работает быстрее!

а можно его ещё улучшить?
Re[4]: А можно глупый вопрос?
От: Константин Россия  
Дата: 22.09.05 16:50
Оценка:
Здравствуйте, dsorokin, Вы писали:

К>>Я рассматриваю преобразование Фурье как изоморфизм гильбертовых пространств: L_2(G) и L_2(группа характеров G).

К>>Здесь G — локально компактная коммутативная группа.

D>Честно говоря, совсем не силен в этом. Видимо, это — что-то из алгебры?


Добавим ещё функан, теорию представлений,...
И получим "абстрактный гармонический анализ"

Если рассматривать G=R, то её группа характеров =R. Имеем интегральное преобразование Фурье
Если рассматривать G=S^1 (окружность), то её группа характеров =Z. Имеем ряд Фурье

D>Так что, очень интересная штука — этот ряд Фурье.


это да
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: проецирование 3D в 2D
От: dsorokin Россия  
Дата: 22.09.05 17:21
Оценка:
X>теперь ясно... (n_x*Y_x+n_y*Y_y+n_z*Y_z) = 0 ,так как угол между ними pi/2

Ну да, это и есть ортогональность...


X>этот оптимизированный код работает быстрее!


Очень рад!


X>а можно его ещё улучшить?


Если вектор нормали N и вектор Y не меняются, т.е. плоскость всегда остается постоянной, то тогда можно использовать второй базисный вектор X вместо N — вычислений будет меньше. То есть, просто где-нибудь в самом начале положить

    X_x = n_y*Y_z - n_z*Y_y;
    X_y = n_z*Y_x - n_x*Y_z;
    X_z = n_x*Y_y - n_y*Y_x;


а потом сразу при проецировании использовать X_x, X_y и X_z так, как я написал до этого. Только я не понимаю, а зачем еще это?

    Xp/=cf_a*l;
    Yp/=cf_a*l;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: А можно глупый вопрос?
От: dsorokin Россия  
Дата: 22.09.05 18:00
Оценка:
К>>>Я рассматриваю преобразование Фурье как изоморфизм гильбертовых пространств: L_2(G) и L_2(группа характеров G).
К>>>Здесь G — локально компактная коммутативная группа.

К>Если рассматривать G=R, то её группа характеров =R. Имеем интегральное преобразование Фурье

К>Если рассматривать G=S^1 (окружность), то её группа характеров =Z. Имеем ряд Фурье


Интересно, а сколько может быть таких изоморфизмов для каждого G? Или само понятие группы характеров G определяется из того предположения, что такой изоморфизм единственен с своем роде?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: проецирование 3D в 2D
От: xmlx  
Дата: 23.09.05 04:05
Оценка:
Здравствуйте, dsorokin, Вы писали:

...

D>а потом сразу при проецировании использовать X_x, X_y и X_z так, как я написал до этого. Только я не понимаю, а зачем еще это?


D>
D>    Xp/=cf_a*l;
D>    Yp/=cf_a*l;
D>


а это что-бы более удалённые отрезки имели меньшие проекции на плоскости
Re[6]: А можно глупый вопрос?
От: Константин Россия  
Дата: 23.09.05 13:02
Оценка: 1 (1)
Здравствуйте, dsorokin, Вы писали:

К>>Если рассматривать G=R, то её группа характеров =R. Имеем интегральное преобразование Фурье

К>>Если рассматривать G=S^1 (окружность), то её группа характеров =Z. Имеем ряд Фурье

D>Интересно, а сколько может быть таких изоморфизмов для каждого G? Или само понятие группы характеров G определяется из того предположения, что такой изоморфизм единственен с своем роде?


Преобразование Фурье это вполне конкретный изоморфизм...
Характеры --- это гомоморфизмы из G в S^1.
Для R^1 это отображения g_y=x->e^{ixy}, y\in R
Для S^1 это отображения g_n=x->e^{2*pi*i*n*x}, n\in Z

Преобразование Фурье определяется примерно так F(h)=интеграл_по_G ( f(x) сопряженное(h(x)) dx ), h-характер.
Для ряда Фурье получим
a_n=F(g_n)=интеграл_[0,1]( f(y)e^{-2*pi*i*n*y}dy )
Для интеграла Фурье
g(x)=F(f)(x)=интеграл_R( f(y)e^{-i*x*y}dy )

Собственно доказывается, что преобразование Фурье --- изоморфизм.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: проецирование 3D в 2D
От: dsorokin Россия  
Дата: 23.09.05 14:37
Оценка:
X>а это что-бы более удалённые отрезки имели меньшие проекции на плоскости

тогда понятно
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: А можно глупый вопрос?
От: dsorokin Россия  
Дата: 23.09.05 15:11
Оценка:
Спасибо за интересную информацию

Она напоминает мне о теории функций комплексного переменного, но как давно я изучал ту теорию...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: А можно глупый вопрос?
От: Аноним  
Дата: 23.09.05 23:46
Оценка:
Здравствуйте, Константин, Вы писали:

К>>>Если рассматривать G=R, то её группа характеров =R. Имеем интегральное преобразование Фурье

К>>>Если рассматривать G=S^1 (окружность), то её группа характеров =Z. Имеем ряд Фурье

К>Преобразование Фурье это вполне конкретный изоморфизм...

К>Характеры --- это гомоморфизмы из G в S^1.
К>Для R^1 это отображения g_y=x->e^{ixy}, y\in R
К>Для S^1 это отображения g_n=x->e^{2*pi*i*n*x}, n\in Z

Все круто, только по-моему, для S^1 это просто отображения g[n](x) = x -> x^n
Хотя, в общем-то, понятно, что написано выше и что там имелось в виду
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.