Здравствуйте, 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;
};
этот оптимизированный код работает быстрее!
а можно его ещё улучшить?