Составное аффинное преобразование, совмещающее произвольный вектор с осью абсцисс
Аффинные преобразования в Maple.
(с) Корольков Олег Геннадьевич
(с) Воронежский государственный университет
Базовые аффинные преобразования на плоскости
> restart;
Translation := (x, y) ->
<
< 1 | 0 | x > ,
< 0 | 1 | y > ,
< 0 | 0 | 1 >
>:
Rotation := phi ->
<
< cos(phi) | -sin(phi) | 0 > ,
< sin(phi) | cos(phi) | 0 > ,
< 0 | 0 | 1 >
>:
RotationCS := (c,s) ->
<
< c | -s | 0 > ,
< s | c | 0 > ,
< 0 | 0 | sqrt(c^2+s^2) >
> / sqrt(c^2+s^2) :
Scaling := (kx, ky) ->
<
< kx | 0 | 0 > ,
< 0 | ky | 0 > ,
< 0 | 0 | 1 >
>:
> T[x,y] = Translation(x, y);
R[phi] = Rotation(phi);
R[c,s] = RotationCS(c,s);
S[k[x], k[y]] = Scaling(k[x], k[y]);
Пример применения АП поворота к произвольному вектору однородных координат:
> u := Vector(3, [x, y, 1]):
Rotation(phi) . u;
> u := <5, 7, 1>:
(Translation(1,2) . Rotation(Pi/2)) . u;
>
Составные аффинные преобразования на плоскости
Поворот вокруг точки (x[0], y[0])
> R[P[0], phi] := Translation(x[0], y[0]) . Rotation(phi) . Translation(-x[0], -y[0]):
R[P[0], phi] := LinearAlgebra[Map](collect, R[P[0], phi], [x[0], y[0]]);
Отражение относительно точки (x[0], y[0])
> M[P[0]] := Translation(x[0], y[0]) . Scaling(-1,-1) . Translation(-x[0], -y[0]);
Отражение относительно прямой
A x + B y = 0
> M[L[0]] := RotationCS(A, B) . Scaling(-1, 1) . RotationCS(A, -B):
M[L[0]] := simplify(M[L[0]]) * (A^2+B^2);
Отражение относительно прямой
A x + B y + C = 0
> M[L] := Translation(x[0], y[0]) . M[L[0]] . Translation(-x[0], -y[0]):
M[L] := simplify(M[L]):
M[L] := LinearAlgebra[Map][(i, j) -> evalb(j = 3)](factor, M[L]);
M[L] := subs(A*x[0] + B*y[0] = -C, M[L]);
Восстановление АП по трём точкам
A(2,-1,1); B(2,2,1); C(6,-1,1)
A'(1, 2,1); B'(-2,3,1); C'(0,-1,1)
> U := < <2,-1,1> | < 2,2,1> | <6,-1,1> >:
|
|
U1 := < <1, 2,1> | <-2,3,1> | <0,-1,1> >:
Первый способ. Метод парных точек
> U1 . U^(-1);
Второй способ. Композиция базовых АП
> A := Translation(1,2) . RotationCS(1,3) . Scaling(sqrt(10)/4, sqrt(10)/3) . Scaling(-1,1) . Translation(-2,1);
U2 := A . U:
F := [seq([seq(U[i,j], i=1..2)], j=1..3)]:
F1 := [seq([seq(U1[i,j], i=1..2)], j=1..3)]:
F2 := [seq([seq(U2[i,j], i=1..2)], j=1..3)]:
P := plottools[polygon](F, color=red):
P1 := plottools[polygon](F1, color=green):
P2 := plottools[polygon](F2, color=blue):
plots[display](P2, P, P1, scaling=constrained);
Базовые аффинные преобразования в трёхмерном пространстве
> restart;
Translation3d := (x, y, z) ->
<
< 1 | 0 | 0 | x > ,
< 0 | 1 | 0 | y > ,
< 0 | 0 | 1 | z > ,
< 0 | 0 | 0 | 1 >
>:
RotationX := phi ->
<
< 1 | 0 | 0 | 0 > ,
< 0 | cos(phi) | -sin(phi) | 0 > ,
< 0 | sin(phi) | cos(phi) | 0 > ,
< 0 | 0 | 0 | 1 >
>:
RotationY := phi ->
<
< cos(phi) | 0 | sin(phi) | 0 > ,
< 0 | 1 | 0 | 0 > ,
< -sin(phi) | 0 | cos(phi) | 0 > ,
< 0 | 0 | 0 | 1 >
>:
RotationZ := phi ->
<
< cos(phi) | -sin(phi) | 0 | 0 > ,
< sin(phi) | cos(phi) | 0 | 0 > ,
< 0 | 0 | 1 | 0 > ,
< 0 | 0 | 0 | 1 >
>:
RotationXCS := (c,s) ->
<
< sqrt(c^2+s^2) | 0 | 0 | 0 > ,
< 0 | c | -s | 0 > ,
< 0 | s | c | 0 > ,
< 0 | 0 | 0 | sqrt(c^2+s^2) >
> / sqrt(c^2+s^2) :
RotationYCS := (c,s) ->
<
< c | 0 | s | 0 > ,
< 0 | sqrt(c^2+s^2) | 0 | 0 > ,
< -s | 0 | c | 0 > ,
< 0 | 0 | 0 | sqrt(c^2+s^2) >
> / sqrt(c^2+s^2) :
RotationZCS := (c,s) ->
|
|
<
< c | -s | 0 | 0 > ,
< s | c | 0 | 0 > ,
< 0 | 0 | sqrt(c^2+s^2) | 0 > ,
< 0 | 0 | 0 | sqrt(c^2+s^2) >
> / sqrt(c^2+s^2) :
Scaling3d := (kx, ky, kz) ->
<
< kx | 0 | 0 | 0 > ,
< 0 | ky | 0 | 0 > ,
< 0 | 0 | kz | 0 > ,
< 0 | 0 | 0 | 1 >
>:
> T[x,y,z] = Translation3d(x, y, z);
R[x,phi] = RotationX(phi);
R[y,phi] = RotationY(phi);
R[z,phi] = RotationZ(phi);
R[x,c,s] = RotationXCS(c,s);
R[y,c,s] = RotationYCS(c,s);
R[z,c,s] = RotationZCS(c,s);
S[k[x], k[y], k[z]] = Scaling3d(k[x], k[y], k[z]);
>
Составные аффинные преобразования в трёхмерном пространстве
АП составного поворота, совмещающего:
• вектор, направленный по оси абсцисс, с вектором (A, B, C);
• вектор (A, B, C) с осью абсцисс.
> RotationV := (A,B,C) -> RotationXCS(B, C) . RotationZCS(A, sqrt(B^2+C^2)):
RotationV1 := (A,B,C) -> RotationZCS(A, -sqrt(B^2+C^2)) . RotationXCS(B, -C):
Отражение относительно точки (x[0], y[0], z[0])
> M[P[0]] := Translation3d(x[0],y[0],z[0]) . Scaling3d(-1,-1,-1) . Translation3d(-x[0],-y[0],-z[0]);
Отражение относительно плоскости
A x + B y + C z = 0
> M[pi[0]] := RotationV(A,B,C) . Scaling3d(-1,1,1) . RotationV1(A,B,C):
M[pi[0]] := simplify(M[pi[0]] * (A^2+B^2+C^2));
Отражение относительно плоскости
A x + B y + C z + D = 0
> unprotect(D):
M[pi] := Translation3d(x[0],y[0],z[0]) . M[pi[0]] . Translation3d(-x[0],-y[0],-z[0]):
M[pi] := LinearAlgebra[Map](factor, M[pi]);
M[pi] := subs(A*x[0] + B*y[0] + C*z[0] = -D, M[pi]);
Отражение относительно прямой, проходящей через начало координат в направлении вектора (A, B, C)
> M[L[0]] := RotationV(A,B,C) . Scaling3d(1,-1,-1) . RotationV1(A,B,C):
|
|
M[L[0]] := simplify(M[L[0]] * (A^2+B^2+C^2));
Отражение относительно прямой, проходящей через точку (x[0], y[0], z[0]) в направлении вектора (A, B, C)
> M[L] := Translation3d(x[0],y[0],z[0]) . M[L[0]] . Translation3d(-x[0],-y[0],-z[0]):
M[L] := simplify(M[L]);
Поворот вокруг оси, проходящей через начало координат в направлении вектора (A, B, C)
> R[L[0],phi] := RotationV(A,B,C) . RotationX(phi) . RotationV1(A,B,C):
R[L[0],phi] := map(sort, map(collect, map(combine, map(collect, map(expand, simplify(R[L[0],phi]) * (A^2+B^2+C^2)), sin(phi))), [A, B, C])):
R[L[0],phi] := LinearAlgebra[Map][(i,j)->evalb(i=j)](collect, R[L[0],phi], cos(phi));
R[L[0],phi] := (subs(A^2+B^2+C^2=1, R[L[0],phi]));
>
Составное аффинное преобразование, совмещающее произвольный вектор с осью абсцисс
> restart;
with(plots):
with(plottools):
with(LinearAlgebra):
A := 3:
B := 4:
C := 5:
V := <A,B,C>:
radBeta := sqrt(B^2+C^2):
cosBeta := B/radBeta:
sinBeta := C/radBeta:
radAlpha := sqrt(A^2+B^2+C^2):
cosAlpha := A/radAlpha:
sinAlpha := radBeta/radAlpha:
Angle := proc(c,s)
local
res := arccos(c):
if signum(s) < 0 then
res := 2*Pi-res:
end if:
res;
end proc:
beta := Angle(cosBeta, sinBeta):
alpha := Angle(cosAlpha, sinAlpha):
RotateBeta := <<1|0|0>,<0|cosBeta|-sinBeta>,<0|sinBeta|cosBeta>>:
RotateAlpha := <<cosAlpha|-sinAlpha|0>,<sinAlpha|cosAlpha|0>,<0|0|1>>:
InvRotateBeta := MatrixInverse(RotateBeta):
InvRotateAlpha := MatrixInverse(RotateAlpha):
V1 := InvRotateBeta . V:
V0 := InvRotateAlpha . V1:
Origin := <0,0,0>:
RotateBetaOrigin := <A,0,0>:
Vyz := V - RotateBetaOrigin:
V1yz := V1 - RotateBetaOrigin:
VPlots := seq( arrow(Origin, U, .3, .6, .3, cylindrical_arrow, color=green, fringe=green), U in [V,V1,V0] ):
|
|
VPPlots := seq( arrow(RotateBetaOrigin, U, .1, .2, .2, cylindrical_arrow, color=blue, fringe=green), U in [Vyz,V1yz] ):
CircleBeta := spacecurve([A, radBeta*cos(t), radBeta*sin(t)], t = 0 .. beta, thickness=2, color=black):
CircleAlpha := spacecurve([radAlpha*cos(t), radAlpha*sin(t), 0], t = 0 .. alpha, thickness=2, color=black):
display([VPlots,VPPlots,CircleBeta,CircleAlpha], scaling=constrained, axes=normal, labels=[x,y,z], orientation=[-75,-15,-45]);
>
Дата добавления: 2021-01-21; просмотров: 85; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!