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;
};



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

а можно его ещё улучшить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.