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 ์ขŒํ‘œ๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ๋˜์š”