1.์ค์ผ๋ฌ ๊ฐ ํ์ ๊ณต์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def vector_turn(x1,y1,a)
x2=x1*Math.cos(a)-y1*Math.sin(a)
y2=x1*Math.sin(a)+y1*Math.cos(a)
return x2,y2
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์์ ๊ณต์์ด ๋ฒกํฐ์ ํ์ ๊ณต์์ด์์, ruby ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ๊ฑฐ์์
์ฆ ๋ฒกํฐ x1,y1์ ์์ (0,0)์ ๊ธฐ์ค์ผ๋ก a๋งํผ์ ๊ฐ๋๋ก ํ์ ์ํจ ๋ฒกํฐ x2,y2๋
x2=x1*cos(a)-y1*sin(a)
y2=x1*sin(a)+y1*cos(a)
๊ฐ ๋๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ์์ ๊ณต์์ ๊ฒฐ๊ตญ ์ x,y ๋ฅผ z์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ์ํจ๊ฑฐ๋ผ๊ณ ๋ฐ๋ผ๋ณผ์๋ ์์ด์
์ฆ, ์์ ๊ณต์์ xz๋ฅผ ๋์ ํ๋ฉด ๋์ผํ ๋ฐฉ์์ผ๋ก ์ x,z ๋ฅผ y์ถ์ผ๋ก ํ์ ์ํฌ์ ์๊ณ
yz๋ฅผ ๋์ ํ๋ฉด ์ yz๋ฅผ x์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ์ํฌ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ x y z์ ํน์ ํ ์ถ์ ๊ธฐ์ค์ผ๋ก ์ ์ ํ์ ์ํค๋ ๋ฐฉ์์ด ์ค์ผ๋ฌ ๊ฐ ํ์ ์ด์์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def turn_3d(x1,y1,z1,an,ax)
if ax == 1
y2,z2=vector_turn(y1,z1,an)
return x1,y2,z2
end
if ax == 2
x2,z2=vector_turn(x1,z1,an)
return x2,y1,z2
end
if ax == 3
x2,y2=vector_turn(x1,y1,an)
return x2,y2,z1
end
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์์ ํจ์๊ฐ ํด๋น ๋ฐฉ์์ผ๋ก ์ ์ ํ์ ์ํค๋ ํจ์์์
x1,y1,z1์ ํ์ ์ํค๋ ค๋ ์ ์ ์ขํ๋ฅผ ์ ๋ ฅํ๊ณ ,
an์ ํ์ ์ํค๋ ค๋ ๊ฐ๋๋ฅผ ์ ๋ ฅํ๊ณ
ax์ x์ถ์ด ๊ธฐ์ค์ด๋ฉด 1, y์ถ์ด ๊ธฐ์ค์ด๋ฉด 2, z์ถ์ด ๊ธฐ์ค์ด๋ฉด 3์ ์ ๋ ฅํ๋ฉด ๋์
๊ทธ๋ ๊ฒ ํ๋ฉด ํด๋น ์ถ์ ๊ธฐ์ค์ผ๋ก ํด๋น ๊ฐ๋๋งํผ ํ์ ์ํจ ์ ์ ์ขํ๋ฅผ ์ถ๋ ฅํด์ค์
2. ์ฌ์์ ํ์ ๊ณต์
์ฌ์์๋ a+b*i+c*j+d*k์ ํ์์ผ๋ก ํํ๋๋ ์์์
์ด๋ a๊ฐ ์ค์๋ถ๊ณ , ๋ค์ i j k ๋ถ๋ถ์ด ํ์๋ถ์์
๊ทธ๋ฆฌ๊ณ ์ x,y,z๋ฅผ, ํ์ ์ํค๋ ์ถ์ด ๋๋ ๊ธธ์ด๊ฐ 1์ธ ๋จ์๋ฒกํฐ์ธ ax, ay, az๋ฅผ ๊ธฐ์ค์ผ๋ก, t์ ๊ฐ๋๋งํผ ํ์ ์ํจ ์ ์ ๊ตฌํ๋ ค๋ฉด
์ฐ์
q = sin(t/2)+cos(t/2)*ax*i+cos(t/2)*ay*j+cos(t/2)*az*k
p= 0, x*i+y*j+z*k
์ด๋ ๊ฒ ๋๊ฐ์ ์ฌ์์๋ฅผ ๋ง๋ค์ด์ผ ํด์
์ด๋ q๋ ์ฌ์์์ ์ค์๋ถ๋ถ์ sin(t/2)๋ฅผ ๋ฃ๊ณ , ํ์๋ถ๋ถ์ i j k ์ ์ฒด์ cos(t/2)๋ฅผ ๊ณฑํ๊ณ , ๋ค์ ํ์๋ถ๋ถ์ i j k ์ ๊ฐ๊ฐ ์ถ์ด๋๋ ๊ธธ์ด๊ฐ 1์ธ ๋จ์๋ฒกํฐ์ ์ขํ์ธ ax ay az ๋ฅผ ๊ณฑํ ์์์
๊ทธ๋ฆฌ๊ณ p๋ ์ฌ์์์ ์ค์๋ถ๋ถ์ 0์ผ๋ก ๋๊ณ , ํ์๋ถ๋ถ์๋ ๊ฐ๊ฐ ํ์ ์ํค๋ ค๋ ์ ์ ์ขํ์ธ x,y,z์ ๊ณฑํ ์์์
๊ทธ๋ฆฌ๊ณ ์ฌ์์ q์ ์ผค๋ ์ฌ์์์ธ (-q)๋ฅผ ๋ง๋ค์ด์ผ ํด์
์ผค๋ ์ฌ์์๋ ์ค์๋ถ๋ถ์ ๋ถํธ๋ ๊ทธ๋๋ก๊ณ ํ์๋ถ๋ถ์ ๋ถํธ๋ง ๋ฐ๋๋ก ๋ฐ๊พผ ์ฌ์์์์
์ฆ
(-q) = sin(t/2)-cos(t/2)*ax*i-cos(t/2)*ay*j-cos(t/2)*az*k
๊ฐ ๋์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ๋ง๋ ์ธ๊ฐ์ ์ฌ์์๋ก
q*p*(-q)
์์ ์์๋๋ก ์ฌ์์์ ๊ณฑ์ ์ ์คํํ๋ฉด ๋์, ์ฆ ์ฌ์์ q์ p๋ฅผ ๊ณฑํ๊ณ , ๊ทธ๋ ๊ฒ ๋์จ ์ฌ์์์ ๋ค์ ์ฌ์์ q์ ์ผค๋ ์ฌ์์์ธ (-q)๋ฅผ ๊ณฑํ๋ฉด ๋์
์ด๋ ์๋ค์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ๊ฐ์ด ๋ฌ๋ผ์ ธ์ ๋ค๋ฅธ ๊ฐ์ด ๋์ค๊ฒ ๋์
๊ทธ๋ ๊ฒ ํ๋ฉด ์ต์ข ์ ์ผ๋ก ์ค์๋ถ๊ฐ 0์ธ (0+b*i+c*j+d*k)ํํ์ ์ฌ์์๊ฐ ๋์ค๊ฒ ๋๋๋ฐ
์ด๋ b c d ์ ๊ฐ์ด ๊ฐ๊ฐ ์ต์ข ์ ์ผ๋ก ํ์ ์์ผ์ ๋์จ ์ ์ x y z ์ขํ๊ฐ ๋๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ์ด๋ ์ฌ์์์ ๊ณฑ์ ์๋ ํด๋ฐํด ๊ณฑ์ (Hamilton product)์ด ์ด์ฉ๋์
ํด๋ฐํด ๊ณฑ์ ์, ๋ ์ฌ์์ (a1+b1*i+c1*j+d1*k) ์ (a2+b2*i+c2*j+d2*k)๋ฅผ ๊ณฑํ๋ฉด
๊ทธ ๊ฐ์
a1*a2-b1*b2-c1*c2-d1*d2+
(a1*b2+b1*a2+c1*d2-d1*c2)*i+
(a1*c2-b1*d2+c1*a2+d1*b2)*j+
(a1*d2+b1*c2-c1*b2+d1*a2)*k
๊ฐ ๋๋ค๋ ๊ฑฐ์์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def hp(a1,b1,c1,d1,a2,b2,c2,d2)
return a1*a2-b1*b2-c1*c2-d1*d2, a1*b2+b1*a2+c1*d2-d1*c2, a1*c2-b1*d2+c1*a2+d1*b2, a1*d2+b1*c2-c1*b2+d1*a2
end
def qturn(x,y,z,ax,ay,az,t)
n,m = Math.cos(t/2.0), Math.sin(t/2.0)
a1,b1,c1,d1 = n, m*ax, m*ay, m*az
a2,b2,c2,d2 = 0, x,y,z
a1,b1,c1,d1 = hp(a1,b1,c1,d1,a2,b2,c2,d2)
a2,b2,c2,d2 = n, -m*ax, -m*ay, -m*az
a1,b1,c1,d1 = hp(a1,b1,c1,d1,a2,b2,c2,d2)
return b1,c1,d1
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์์ ์ฝ๋๊ฐ ๊ทธ๋ ๊ฒ ์ฌ์์์ ํ์ ์ ์คํํ๋ ์ฝ๋์์
์ฒซ๋ฒ์งธ๋ ํค๋ฐํด ๊ณฑ์ ์ ํจ์๊ณ ๋๋ฒ์งธ๊ฐ ์ค์ ๋ก ์ ์ ํ์ ์ํค๋ ํจ์์์
๋๋ฒ์งธ ํจ์์ x,y,z์ ํ์ ์ํฌ ์ ์ ์ขํ๋ฅผ ์ ๋ ฅํ๊ณ , ax, ay, az์ ์ถ์ผ๋ก ํ ๊ธธ์ด๊ฐ 1์ธ ๋จ์๋ฒกํฐ์ ์ขํ๋ฅผ ์ ๋ ฅํ๊ณ , t์ ํ์ ์ํฌ ๊ฐ๋๋ฅผ ์ ๋ ฅํ๋ฉด ๋์
๊ทธ๋ ๊ฒํ๋ฉด ์ต์ข ์ ์ผ๋ก ์ ์ ํ์ ์์ผ์ ๋์จ x y z ์ขํ๊ฐ ์ถ๋ ฅ๋๊ฒ ๋์
์ ๊ฒ์๊ฐ๋ฐํ ๊ฑฐ๋ผ ์ํ๊ฐ์๊ฑด ์๋ฐฐ์๋ ๋ผ์!
์.. ์๋ฒฝํ ์ดํดํ์ด
์ด๋ฐ ์ํ๊ณต์ ๊ณต๋ถ์ ํ์์ฑ์ ๋๋ผ๋ฉด์๋, ๋ง์ ์์์ ๋ณด๋ฉด ๋์ด ๋๊ฐ๋จ ๋ง์ด์ง
์ค์ผ๋ฌ๋.. ๊ฒ์๊ฐ๋ฐ์์ ์น๊ตฌ..