Similarity Transformation

25 08 2009

นั่งอ่านทำความเข้าใจ เลยจดไว้กันลืม

Coordinate transformation:
Plane transformation:
Similarity transformation:

Plane simarity transformation ใช้ในการแปลงค่าพิกัดบนระบบพิกัด Cartesian เป็นการแปลงค่าพิกัดใน 2 มิติ ประกอบไปด้วย สามส่วนคือ การย้ายแกน(Translation) การหมุนรอบแกนZ(Ratation) และการมีมาตราส่วน(Scaling)

เขียนแล้วก็อาจจะยังงง อธิภาพด้วยภาพดีกว่า

xy01

จากภาพมีแกนสองแกนแทนระบบพิกัดสองระบบ จุด P เป็นจุดใดๆบนระบบพิกัด เราสามารถมองได้ง่าย ๆ ว่าจุดไม่ได้เปลี่ยนไปเปลี่ยนแค่การอ้างอิงกับระบบพิกัดตัวอย่างแร
จะทำการแปลงค่าพิกัดจากระบบ xy (แกนสีน้ำเงิน) ไปอยู่ในระบบ XY (แกนสีดำ)
ที่จริงก็เป็นการคำนวณในแบบเวกเตอร์ก็ไม่ยากอะไรดูในจากในรูปข้างล่างนี้

xy02

กำหนด ให้ m เป็นมาตราส่วนในการย่อหรือขยาย

เขียนในรูปสมการได้ดังนี้

xy04

เขียนให้อยู่ในรูป แมตริกส์ ได้ดังนี้

xy05

ถ้าต้องการแปลงจากระบบพิกัด XY ไปอยู่ในระบบ xy
ทำกลับกัน สรุปเป็นแมตริกส์ได้ดังนี้

xy06

ลองเขียนตามซักรอบ สองรอบ จะเข้าใจมากขึ้นนะครับ

Similarity Equation in Python

เพื่อความเข้าใจ ก็จับใส่เข้าไปใน ไพธอนซะหน่อยเพื่อตรวจสอบ

import numpy
import scipy
# coordinate of point P in xy coordinage system
x,y = 350.,200.
print “x = “,x,” y = “,y
# Shift axes
a0,b0 = 150.,100.
print “a0,b0 = “,a0,b0
# Rotation angle
alpha = 35
alpha_r = numpy.radians(alpha)
print ‘alpha = ‘,alpha
# Scale
m = 1
print ‘scale m = ‘,m
#coordinage X,Y in XY coordinate system
X = a0 +m*(x*numpy.cos(alpha_r) -y*numpy.sin(alpha_r))
Y = b0 +m*(x*numpy.sin(alpha_r)+y*numpy.cos(alpha_r))
print ” *** 1. compute in equation method “
print ‘X = ‘,X
print ‘Y = ‘,Y
## Matrix method
## use matrix from as X=Ax+a
X0 = a0
Y0 = b0
mX = numpy.matrix([[X],[Y]])
mA = numpy.matrix([[numpy.cos(alpha_r),-numpy.sin(alpha_r)],[numpy.sin(alpha_r),numpy.cos(alpha_r)]])
mx = numpy.matrix([[x],[y]])
mX0= numpy.matrix([[X0],[Y0]])
mX = m*mA*mx+mX0
print ”       “
print ” *** 2. compute in Matrix method”
print “X = Ax +b”
print “A = “
print mA
print “x = “
print mx
print “b = “
print mX0
print “X = “
print mX
>>

import numpy
import scipy

# coordinate of point P in xy coordinage system

x,y = 350.,200.
print "x = ",x," y = ",y

# Shift axes
a0,b0 = 150.,100.
print "a0,b0 = ",a0,b0

# Rotation angle
alpha = 35
alpha_r = numpy.radians(alpha)
print 'alpha = ',alpha

# Scale
m = 1
print 'scale m = ',m

#coordinage X,Y in XY coordinate system
X = a0 +m*(x*numpy.cos(alpha_r) -y*numpy.sin(alpha_r))
Y = b0 +m*(x*numpy.sin(alpha_r)+y*numpy.cos(alpha_r))

print " *** 1. compute in equation method "
print 'X = ',X
print 'Y = ',Y

## Matrix method
## use matrix from as X=Ax+a
X0 = a0
Y0 = b0

mX = numpy.matrix([[X],[Y]])
mA = numpy.matrix([[numpy.cos(alpha_r),-numpy.sin(alpha_r)],[numpy.sin(alpha_r),numpy.cos(alpha_r)]])
mx = numpy.matrix([[x],[y]])
mX0= numpy.matrix([[X0],[Y0]])
mX = m*mA*mx+mX0

print "       "
print " *** 2. compute in Matrix method"
print "X = Ax +b"
print "A = "
print mA
print "x = "
print mx
print "b = "
print mX0
print "X = "
print mX
ผลลัพทธ์
>>>
x =  350.0  y =  200.0
a0,b0 =  150.0 100.0
alpha =  35
scale m =  1
 *** 1. compute in equation method
X =  321.987928231
Y =  464.582161581
 *** 2. compute in Matrix method
X = Ax +b
A =
[[ 0.81915204 -0.57357644]
 [ 0.57357644  0.81915204]]
x =
[[ 350.]
 [ 200.]]
b =
[[ 150.]
 [ 100.]]
X =
[[ 321.98792823] = X
 [ 464.58216158]] = Y
>>>
เห็นได้ว่า ทั้งสองวิธีได้ผลลัพทธ์เท่ากันครับ
เช็คซ้ำกลับด้วยการเอาค่าที่ได้ ของ X,Y มาแทนค่ากลับ xy06 เพิ่มโค้ดเข้าไปอีกนิดหน่อย ## Inverse transformation ## in matrix from mxx = (1/m)*numpy.linalg.inv(mA)*(mX-mX0) print " " print " ****** inverse transformation " print ' x = ',mxx ผลลัพทธ์ ****** inverse transformation x = [[ 350.] = x [ 200.]] = y >>> ได้ค่า x,y เท่าเดิมเลย เหลือเชื่อจริงๆ การคำนวณแปลงค่าพิกัดแบบนี้ ใช้มากในงานวิศวกรรมสำรวจบนพื้นระนาบ และมีชื่อเรียกอีกหลายอย่างเช่น การแปลงค่าพิกัดแบบเฮลเมิร์ต(Helmert transformation) Euclidian Transformation หรือ Two-dimension conformal transformation

Actions

Information

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s




%d bloggers like this: