Friday, August 14, 2015

Параллель хамааралт шилжүүлэг /Affine transformation/

Аффин шилжүүлэг – Параллель хамаарлын шилжүүлэг

Аффин буюу хамааралтай орон дахь геометрийн биет цэг, шулуун, хэрчим гэх мэтийг өөрчлөлтийн дараа хадгалж үлдээхэд зориулсан шугаман шилжүүлгийн функцыг аффин шилжүүлэг буюу параллель хамаарлын шилжүүлэг гэнэ. Энэ шилжүүлгээр хамааралтай орон дахь газрын зураг дээр хөрвүүлэг (translation), масштаблалт (scaling), эргүүлэх (rotating), тайрах (trimming), сунгах (shear map), нэгтгэх (composition) гэх мэт олон үйлдлийг хийх боломжтой.
Хэрэв Х ба Y нар нь хамааралтай орон (координат болон өндрийн систем ижил) бол параллель хамаарлын шилжүүлэг бүр f: X --> Y нь x --> Mx+b гэсэн хэлбэрээр илэрхийлэгдэнэ. Энд М нь Х дээрх шугаман шилжүүлэг ба b нь Y дахь вектор юм. Өөрөөр хэлбэл хоёр газрын зураг хамааралтай бол тэдгээрийн координатыг дараах байдлаар хамааруулж болно.
Энд y ба x нь өөр өөр зургуудын байрлалын векторууд гэж үзэж болно. Энэ шилжүүлгийг хэрхэн газрын зургыг эргүүлж тасдаж авах жишээгээр ашиглая. Энэхүү шилжүүлгийг семинар дээр Хосояамада багш хийж үзүүлсэн юм.
Figure 1. Жишээ шилжүүлэг (ногоон зургийг бид тооцоонд ашиглана.)
Том хэмжээтэй газрын зургийн өндөржилтийн мэдээлэл 540x503 хэмжээтэй торон дээр өгөгдсөн байна. Нэг торны алхам нь delta x=5.0м байна. Энэ том өндрийн тоон загвараас (Digital Elevation Model-DEM) судалгаанд ашиглагдах хэсэг газрыг тасдан авах шаарлагатай болсон гэж үзье. Тооцон бодох үйл ажиллагаа компьютерийн багтаамжаас гадна цаг хугацааны асуудлууд зөндөө байдаг учир хий дэмий том зурган дээр нүсэр тооцоолол хийх нь ашиггүй бөгөөд үр дүнгүй. Энэхүү DEM дотор тэрхүү судалгаанд ашиглагдах 250x432 хэмжээтэй зураг оршин байна. Иймээс параллель хамаарлын шилжүүлгийг ашиглан хүсээд байгаа зургаа тасдан авч болохнээ.
Үүний тулд уг том зурган дээр өнөөх жижиг зургын хөдлөшгүй, тодорхойломж болох гурван цэгийг сонгон авч дээр дурьдсан A болон b нарыг тодорхойлно. Тэгш өнцөгт хэлбэртэй жижиг зураг тасдан авах учир бидэнд булангийн гурван цэг байхад хангалттай. Ингээд гурван цэгээр аффин шугаман хамаарлын матрицуудыг бичвэл:

Энэ гурван матрицаас a, b, c, d, e, f нарыг тодорхойлчихвол шилжүүлгийг хийж зургийг эргүүлж тасдах боломж бүрдэнэ. Дээрх матрицуудад эхний том үсгээр бичигдсэн координатын тэмдэглэгээ Yn, Xn нар нь том (цаашид хуучин гэе) зургийн координат, жижиг yn, xn нь жижиг цаашид шинэ зургийн координат болно. Дээрхээс e ба f ийг алга хийж а-гаас d хүртэлхийг тодорхойлохын тулд (3)-(1) хасаж, мөн (2)-(1) хасаж хооронд нь хольж бодъёо. (3)-(1) хасвал:
(2)-(1) хасвал:
Эмхэтгэвэл:
Хялбарчилж тэмдэглэгээг сольж бичье,
(7) тэгшитгэлээс a, b, c, d-г олоход маш хялбар болж байна. A=B*C учир B=A*C-1 болно. С – ийн урвуу матриц бол:
b1b4-b2b3 нь С матрицийн тодорхойлогч учир det гэж тэмдэглэе.
(10)-аас эдгээрийг олсоны дараа эхний гурван тэгшитгэлийн аль нэгэнд нь орлуулж e ба f нарыг олох боломжтой болно. Ингээд (1)-ээс олъё.
Шинэ зургийн координат нь хуучин зургийн өндөржилттэй кооринат дээр давхцахгүй нь ойлгомжтой. Энэ тохиолдолд жинлэж өндрийг авах шаардлагатай.

Figure 2. Зургийн координатын тусгалууд, Торны жинлэх талбайнууд
Энэ тохиолдолд z(i,j) цэгийн өндрийг дараах хамаарлаар тодорхойлно.

Үр дүнг харвал:
Figure 4. Хуучин өндрийн тоон загвар
Figure 5. Шинэ өндрийн тоон загвар. Голын адаг далайд цутгах хэсгийн өндөржилтийн мэдээ.

Фортран код by Prof Hosoyamada Tokuzo

1:     dimension x(3), y(3), xx(3), yy(3)  
2:     dimension ix(3),iy(3),ixx(3),iyy(3)  
3:     dimension zz(1000,1000),zzz(1000,1000) ! max 1000  
4:     parameter(nx1=540,ny1=503)  ! 2014dem2.txt  
5:     data x/172,415,269/ ! old 2014  Том зураг дээрх тусгал
6:     data y/ 70, 9,491/   
7:     data xx/1,250,1 / ! new 2014 Жижиг зургийн координат
8:     data yy/1,1 ,432/   
9:     disx= sqrt( (x(2)-x(1))**2+(y(2)-y(1))**2 )  
10:     disy= sqrt( (x(3)-x(1))**2+(y(3)-y(1))**2 )  
11:     ix=x  
12:     iy=y  
13:     ixx=xx  
14:     iyy=yy  
15:     nx2=ixx(2)  
16:     ny2=iyy(3)  
17:     a1= y(3) - y(1)   ! үүнээс дооших тэгшитгэл 6 ба 7-оос
18:     a2= y(2) - y(1)  
19:     a3= x(3) - x(1)  
20:     a4= x(2) - x(1)  
21:     b1=yy(3) - yy(1)  
22:     b2=yy(2) - yy(1)  
23:     b3=xx(3) - xx(1)  
24:     b4=xx(2) - xx(1)  
25:     det=b1*b4-b2*b3          ! тодорхойлогч
26:     a= ( a1*b4-a2*b3 )/det   ! томъёо 10
27:     b= (-a1*b2+a2*b1 )/det   ! томъёо 10
28:     c= ( a3*b4-a4*b3 )/det   ! томъёо 10
29:     d= (-a3*b2+a4*b1 )/det   ! томъёо 10
30:     e=y(1)-a*yy(1)-b*xx(1)   ! томъёо 12
31:     f=x(1)-c*yy(1)-d*xx(1)   ! томъёо 12
32:     open(10,file='2014dem2.txt')  
33:     do j=ny1,1,-1  
34:     read(10,*) (zz(i,j),i=1,nx1)  
35:     enddo  
36:     close(10)  
37:     do i=1,nx2  
38:     do j=1,ny2  
39:     yyy=a*j+b*i+e  
40:     xxx=c*j+d*i+f  
41:     ixxx=int(xxx)  
42:     iyyy=int(yyy)  
43:     xxx=xxx-ixxx  
44:     yyy=yyy-iyyy  
45:     zzz(i,j)=(   xxx *  yyy )*zz(ixxx+1,iyyy+1)  
46:     +    +( (1.-xxx)*  yyy )*zz(ixxx ,iyyy+1)  
47:     +    +( (1.-xxx)*(1.-yyy) )*zz(ixxx ,iyyy )  
48:     +    +(   xxx *(1.-yyy) )*zz(ixxx+1,iyyy )  ! томъёо 13
49:     enddo  
50:     enddo  
51:     open(10,file='2014dem3.txt')  
52:     do j=ny2,1,-1  
53:     write(10,'(1000f8.3)') (zzz(i,j),i=1,nx2)  
54:     enddo  
55:     close(10)  
56:     stop  
57:     end  

Бидний мэдэх ArcGIS гэх мэт газарзүйн програмууд дээрх растер мэдээг тасдах, эргүүлэх гэх мэт үйлдлүүд энэхүү хувиргалтаар хийгддэг байна. 

No comments:

Post a Comment