}
//Строим матрицу преобразования (3-D transformation matrix)
//для перспективного проецирования (perspective projection):
//центр проецирования (r, phi, theta),
//фокус (fx, fy, fx),
//вектор от объекта до экрана UP <ux, yx, uz>,
//тип проецирования (type_of_projection):
//PerspectiveProjection:
public void Projection(ref float[,] M,
int type_of_projection, float R,
float phi, float theta,
float Fx, float Fy, float Fz,
float ux, float uy, float uz)
{
float Cx, Cy, Cz, r2;
//Переходим к прямоугольным координатам:
Cy = R * (float)Math.Sin(phi);
r2 = R * (float)Math.Cos(phi);
Cx = r2 * (float)Math.Cos(theta);
Cz = r2 * (float)Math.Sin(theta);
MatrixTransformation(ref M, type_of_projection,
Cx, Cy, Cz, Fx, Fy, Fz, ux, uy, uz); //ref M
}
//Строим матрицу преобразования, чтобы получить
//отражение напротив плоскости, проходящей
//через (p1, p2, p3) с вектором нормали <n1, n2, n3>:
public void m3Reflect(ref float[,] M,
float p1, float p2, float p3,
float n1, float n2, float n3)
{
float[,] T = new float[5, 5]; //Перенос.
float[,] R1 = new float[5, 5]; //Вращение 1.
float[,] r2 = new float[5, 5]; //Вращение 2.
float[,] S = new float[5, 5]; //Отражение.
float[,] R2i = new float[5, 5]; //Не вращать 2.
float[,] R1i = new float[5, 5]; //Не вращать 1.
float[,] Ti = new float[5, 5]; //Не переносить.
float D, L;
float[,] M12 = new float[5, 5];
float[,] M34 = new float[5, 5];
float[,] M1234 = new float[5, 5];
float[,] M56 = new float[5, 5];
float[,] M567 = new float[5, 5];
//Переносим плоскость к началу координат:
MatrixTranslate(ref T, -p1, -p2, -p3);
MatrixTranslate(ref Ti, p1, p2, p3);
//Вращаем вокруг оси z,
//пока нормаль не будет в y-z плоскости:
MatrixIdentity(ref R1);
D = (float)Math.Sqrt(n1 * n1 + n2 * n2);
R1[1, 1] = n2 / D; R1[1, 2] = n1 / D;
R1[2, 1] = -R1[1, 2]; R1[2, 2] = R1[1, 1];