Составное аффинное преобразование, совмещающее произвольный вектор с осью абсцисс

Аффинные преобразования в 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!