biquaternions

рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА quaternions рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирддреЗ рд╣реИрдВ, рдФрд░ рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдЙрдардиреЗ рдХрд╛ рд╕рдордп рд╣реИ - рджреНрд╡рд┐рднрд╛рдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд▓реЗрдЦ рдЙрдирдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзреЛрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛ рджреЗрддрд╛ рд╣реИред рджреНрд╡рд┐рднрд╛рдЬрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдХреИрдирд╡рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирд┐рд░реНрдзрд╛рд░рдг biquaternion


Biquaternion рдПрдХ рд╣рд╛рдЗрдкрд░рдХрдореНрдкрд▓реЗрдХреНрд╕ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдпрд╛рдо 8. рд╣реИред рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ рд▓реЗрдЦреЛрдВ рдФрд░ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдЙрдиреНрд╣реЗрдВ "рджреЛрд╣рд░реА рдЪрддреБрд░реНрднреБрдЬ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░реВрд╕реА-рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ "рджреЛрд╣рд░реА рдЪрддреБрд░реНрднреБрдЬ" рдпрд╛ "рдЬрдЯрд┐рд▓ рдкреИрддреГрдХ" рдирд╛рдо рднреА рд╣реИрдВред

рдЪрддреБрд░реНрднреБрдЬ рд╕реЗ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЪрддреБрд░реНрдзрд╛рддреБрдХ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреЗ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреНрд╡рд┐рдЕрд░реНрдереА рднреА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

Bateraternion рдХреЛ рджреЛ рдЙрджреНрдзрд░рдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 рдбрдмреНрд▓реНрдпреВ рдореИрдВ d рдИ рдЯреА рдореИрдВ рдПрд▓ рдбреА рдИ рдЯреА рдИ рдПрдХреНрд╕ рдЯреА рдЦ рдЪ q = рд░реЛрдВ рдЯреА рдПрдХ рдЖрд░ рдЯреА рдмреА рдПрдо рдПрдХ рдЯреА рдЖрд░ рдореИрдВ рдПрдХреНрд╕ рдЯреА рдИ рдПрдХреНрд╕ рдЯреА рдЦ рдЪ рдХреНрд╖ 1    t e x t b f q q 2 e n d b m a t r i x , 


 рдЯреА рдИ рдПрдХреНрд╕ рдЯреА рдЦ рдЪ рдХреНрд╖ 1 - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рдЧ, рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреЗ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ;
 textbfq2 - рджреЛрд╣рд░реЗ рднрд╛рдЧ, рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рджреНрд╡рд┐рд╡рдЪрди рдХреЛ рдЬрдЯрд┐рд▓ рдЪрддреБрд░реНрднреБрдЬ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдЪрддреБрд░реНрднреБрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдПрдХ рджреЛрд╣рд░реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рдЬрдЯрд┐рд▓ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛)ред рджреЛрд╣рд░реА рд╕рдВрдЦреНрдпрд╛ A=a1+ epsilona2 рдЬрд╣рд╛рдБ a1 рдФрд░ a2 рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИрдВ, рдФрд░  epsilon - рдХреНрд▓рд┐рдлрд░реНрдб рдкреНрд░рддреАрдХ (рдЬрдЯрд┐рд▓рддрд╛), рд╕рдВрдкрддреНрддрд┐ рд░рдЦрдиреЗ  epsilon2=0 ред рд╣рдо рдЧрдгрд┐рдд рдореЗрдВ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд▓рд╛рдЧреВ рднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЖрдЧреЗ рд╣рдо рджреНрд╡рд┐рднреБрдЬ рдХреЛ рджреЛ рдЪрддреБрд░реНрднреБрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВрдЧреЗред

рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдХреА рдЬреНрдпрд╛рдорд┐рддреАрдп рд╡реНрдпрд╛рдЦреНрдпрд╛


рдЪрддреБрд░реНрдзрд╛рддреБрдХ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдХреЛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╛рдЗрдХреЗрдЯрд░рд┐рдпрди рднреА рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдиреА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ - рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ред рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЧрддрд┐рдХреА рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рджреНрд╡рд┐рднрд╛рдЬрди рджреЛ рдорд╛рддреНрд░рд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ - рдЧрддрд┐ рдХрд╛ рд░реИрдЦрд┐рдХ рд╡реЗрдЧ рдФрд░ рд╡рд╕реНрддреБ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХрд╛ рдХреЛрдгреАрдп рд╡реЗрдЧред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдВрдХрдбрд╝рд╛ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдХреЗ рдЬреНрдпрд╛рдорд┐рддреАрдп рдЕрд░реНрде рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред



рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдкреНрд▓реЗрдЗрдВрдЧ рд╕реНрдкреЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реЛрдЯреЗрд╢рди рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдФрд░ рд╡рд┐рд╕реНрдерд╛рдкрди рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░, рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдВрджреЛрд▓рди рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВ, рд╡реЗ рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдШреБрдорд╛рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдЗрди рджреЛ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдПрдХ рдЬрдЯрд┐рд▓ рд╣рд╛рдЗрдкрд░рдкреНрд▓реЛрдордХреНрд╕ рд╣реЛред

рд╕реНрдХреЗрд▓рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ


рдореБрдЦреНрдп рдЕрджрд┐рд╢ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡реЗ рд╕рд╛рдзрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдирд╣реАрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рджреЛрд╣рд░реЗред

1. рдмрд╛рдЗрдХрд░рдиреЗрд╢рди рдХрд╛ рдорд╛рдирджрдВрдб

 ред nрдЪреМрдбрд╝реА textbfq |= | textbfq1 |+ epsilon(q10q20+ textbfqT1 textbfq2)



2. рджреНрд╡рд┐рднрд╛рдЬрди рдореЙрдбреНрдпреВрд▓

| widetilde textbfq|=| textbfq1|+ epsilon fracq10q20+ textbfqT1 textbfq2| textbfq1



рдореВрд▓ рд╕рдВрдЪрд╛рд▓рди


рд╡рд┐рдЪрд┐рддреНрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ quaternions рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рдорд╛рди рд╣реИрдВред

1. рджреНрд╡рд┐рдЕрд░реНрдереА рдпреБрдЧреНрдорди

 wideetilde textbfqтИЧ= startbmatrix textbfqтИЧ1 textbfqтИЧ2 endbmatrix



2. рджреНрд╡рд┐рднрд╛рдЬрди рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛рд╡

\ widetilde {\ textbf {q}} \ pm \ widetilde {\ textbf {p}} = \ start {bmatrix} \ textbf {q} _1 \ pm \ textbf {p} _1 \\ \ textbf {q} _2 \ _ \ _ pm \ textbf {p} _2 \ end {bmatrix}



рдЬреБрджрд╛рдИ рдФрд░ рдЬреЛрдбрд╝-рдШрдЯрд╛рд╡ рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рд╣реИ (рд╢рдмреНрджреЛрдВ рдХреЛ рдЖрдкрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

3. рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдмрд╣реБрд╡рдЪрди рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛

a widetilde textbfq= widetilde textbfqa= startbmatrixa textbfq1a textbfq2 endbmatrix



4. рджреНрд╡рд┐рдЕрд░реНрдереА рдЧреБрдгрди

\ wideetilde {\ textbf {q}} \ otimes \ widetilde {\ textbf {p}} = \ start {bmatrix} \ textbf {q} _1 \ otimes \ textbf (p) _1 \\ \ textbf {q} _1 \ _ \ _ otimes \ textbf {p} _2 + \ textbf {q} _2 \ otimes \ textbf {p} _1 \ end {bmatrix}


Biquaternion рдЧреБрдгрд╛ рдЧреИрд░-рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рд╣реИ (рдХрд╛рд░рдХреЛрдВ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, biquaternion рдЧреБрдгрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ рд╣реИ)ред

рдпрд╣ рдСрдкрд░реЗрд╢рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реИ рдЬрдм рдмрд╛рдЗрдХреЗрдЯрд░рдирд┐рдпрдиреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рднреМрддрд┐рдХ рдЕрд░реНрде рдХреЛ рд╡рд╣рди рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рджреНрд╡рд┐рднрд╛рдЬрдХ рдЧреБрдгрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЛ рджреНрд╡рд┐рднрд╛рдЬрдиреЛрдВ рдХреЗ рдШреБрдорд╛рд╡ рдФрд░ рд░реИрдЦрд┐рдХ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реИред

5. рд╡рд┐рдЪрд┐рддреНрд░рддрд╛ рдХрд╛ рдЙрд▓рдЯрд╛

\ Widetilde {\ textbf {q}} ^ {- 1} = \ frac {\ widetilde {\ textbf {q}} ^ *}} \ {| \ wideetilde {\ textbf {q}}



рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛрдгреЛрдВ рдФрд░ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреНрд╡рд┐рдмреАрдЬрдкрддреНрд░реА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреЗ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рджреНрд╡рд┐рднреБрдЬ (рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдХреНрд╡рд╛рдЯрд░реНрдиреЗрд╢рди) рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд░реЛрдЯреЗрд╢рди рдХреНрд░рдо рдЬрд┐рд╕рдореЗрдВ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛрдгреЛрдВ рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рдЪрддреБрд░реНрдзрд╛рддреБрдХрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдо рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдХреЗ рдХреЛрдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛрдВрдЧреЗ - рдЬрдореН  psi , рдкрд┐рдЪ  рд╡рд░реНрддрддреЗ рдФрд░ рд░реЛрд▓ рдХрд░реЗрдВ рдЧрд╛рдорд╛ ред

рдЖрдзрд╛рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдк рдкреГрдереНрд╡реА рдХреА рд╕рддрд╣ рдкрд░ рдЦрдбрд╝реЗ рд╣реИрдВ рдФрд░ рдЙрддреНрддрд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред

рдмрд┐рдВрджреБ O o - рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдЙрддреНрдкрддреНрддрд┐, рд╡рд╕реНрддреБ рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред
рдзреБрд░реА O o Y g - рдЙрд░реНрдзреНрд╡рд╛рдзрд░ рдКрдкрд░ рдХреА рдУрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИ, рдФрд░ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рд╡реЗрдХреНрдЯрд░ рдХреА рджрд┐рд╢рд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред
рдЕрдХреНрд╖ O o X g - рд╕реНрдерд╛рдиреАрдп рдореЗрд░рд┐рдбрд┐рдпрди рдХреЗ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рдХреА рдУрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИред
рдПрдХреНрд╕рд┐рд╕ рдУ рдУ рдЬреЗрдб рдЬреА - рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджрд╛рдИрдВ рдУрд░ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрд╡ рдХреА рдУрд░ рджрд╛рдИрдВ рдУрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдпрд╛ рдЕрдиреНрдп рд╡рд╕реНрддреБ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред
рдмрд┐рдВрджреБ рдУ - рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдЙрддреНрдкрддреНрддрд┐, рд╡рд╕реНрддреБ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред
рдУрдП рдЕрдХреНрд╖ - рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реИрддрд┐рдЬ рддрд▓ рдкрд░ рд▓рдВрдмрд╡рдд рдКрдкрд░ рдХреА рдУрд░ рдФрд░ рд▓рдВрдмрд╡рдд рдирд┐рд░реНрджреЗрд╢рд┐рддред
рдПрдХреНрд╕рд┐рд╕ рдУрдПрдХреНрд╕ - рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рдордиреЗ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдирд┐рд░реНрджреЗрд╢рд┐рддред
рдУрдЬреЗрдб рдЕрдХреНрд╖ - рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджрд╛рдИрдВ рдУрд░ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред

рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрдзрд╛рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдВрдмрджреНрдз рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдЙрддреНрдкрддреНрддрд┐ (рдмрд┐рдВрджреБ O ) рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рддреАрди рдХреНрд░рдорд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдпрд╡ рдХреЛрдг  psi - рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрд░реНрдгрди рдУрдП ,
рдкрд┐рдЪ рдХреЛрдг  рд╡рд░реНрддрддреЗ - рдзреБрд░реА OZ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд░реЛрдЯреЗрд╢рди,
рд░реЛрд▓ рдХреЛрдг рдЧрд╛рдорд╛ - рдЕрдХреНрд╖ OX рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордирд╛ред

рдмрд╛рдЗрдХрд░рдиреЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╛рдЗрдХреЗрдЯрд░рд┐рдпрди рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рджреЛрд╣рд░реЗ рднрд╛рдЧреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╕реНрдерд┐рддрд┐ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдзрд╛рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ  psi, vartheta, gamma рдФрд░ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ r=(rx,ry,rz)T ред

рдЕрд╕рд▓реА рд╣рд┐рд╕реНрд╕рд╛  textbfq1 рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

\ textbf {q} _1 = \ start {bmatrix} \ cos \ frac {\ psi} {2} \ cos \ frac {\ _ vartheta} {2} \ cos \ frac {\ _ \ _ рдЧрд╛рдорд╛} [2} & - & \ _ sin \ frac {\ psi} {2} \ sin \ frac {\ vartheta} {2} \ sin \ frac {\ gamma} {2} \\ \ cos \ frac {\ psi} {2} / cos \ frac { \ vartheta} {2} \ sin \ frac {\ gamma} {2} рдФрд░ + рдФрд░ \ sin \ frac {\ psi} {2} \ sin \ frac {\ vartheta} {2} \ cos \ frac {\ _ gma} {2} \\ \ cos \ frac {\ psi} {2} \ sin \ frac {\ vartheta} {2} \ sin \ frac {\ _ рдЧрд╛рдорд╛} {2} & + \ _ \ _ рдкрд╛рдк \ _ \ _} {psi} { 2} \ cos \ frac {\ vartheta} {2} \ cos \ frac {\ gamma} {2} \\ \ cos \ frac {\ psi} {2} \ sin \ frac {\ _ vartheta {2} \ cos \ frac {\ gamma} {2} & - & \ sin \ frac {\ _ psi} {2} \ cos \ frac {\ vartheta} {2} \ sin \ frac {\ gamma} {2} рдЕрдВрдд {bmatrix}


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд░реЛрдЯреЗрд╢рди рдЕрдиреБрдХреНрд░рдо рд╣реИ, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдВ рднреА рдЕрд▓рдЧ рд╣реЛрдВрдЧреАред

рджреЛрд╣рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛  textbfq2 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд:

 textbfq2= frac12 textbfr otimes textbfq1



рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛрдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдФрд░ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕реЗ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ред рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди


рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдХреЛрдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдЬреАрд╡рдордВрдбрд▓ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рдЧ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ  textbfq1 :

 psi= arctan frac2(q0q2тИТq1q3)q20+q21тИТq22тИТq23


\ vartheta = \ arcsin {(2 (q_1 q_2 + q_0 q_3)) 2


 Gamma= arctan frac2(q0q1тИТq2q3)q20тИТq21+q22тИТq23



рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:

 textbfr=2 textbfq2 otimes textbfqтИТ11


рдкрд░рд┐рдгрд╛рдо рдЪрддреБрд░реНрдзрд╛рддреБрдХ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ  textbfr=(0,rx,ry,rz)$

рд╕рджрд┐рд╢ рджреНрд╡рд┐рдЕрд░реНрдереА рдШреБрдорд╛рдПрдБ рдФрд░ рдШреБрдорд╛рдПрдБ


рджреНрд╡рд┐рдмреАрдЬрдкрддреНрд░реА рдХреЗ рдорд╣рд╛рди рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдФрд░ рдПрдХ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдШреБрдорд╛рд╡ рдФрд░ рдЖрдВрджреЛрд▓рди рд╣реИред O o X X G Y G Z рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдзрд╛рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рдФрд░ OXYZ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХрдиреЗрдХреНрдЯреЗрдб рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рд╣реИред рддрдм рдЖрдзрд╛рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд╕реНрддреБ рдХрд╛ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╕реНрдерд┐рддрд┐ рджреНрд╡рд┐рднреБрдЬ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ  widetilde textbfq ред рдпрджрд┐ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ  textbfr рдПрдХ рдЬреБрдбрд╝реЗ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ, рдлрд┐рд░ рдЖрдк рдПрдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ  textbfr0 рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрдзрд╛рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ:

\ textbf {r} _0 = \ widetilde {\ textbf {q}} \ otimes \ textbf {r} \ otimes \ widetilde {\ textbf {q}} ^ {- 1 -


рдФрд░ рдкреАрдЫреЗ:

\ textbf {r} = \ widetilde {\ textbf {q}} ^ {- 1} \ otimes \ textbf {r} _0 \ otimes \ widetilde {\ textbf {q}:


рдЬрд╣рд╛рдБ  textbfr рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ,  textbfr=(1,0,0,0,0,0,rx,ry,rz)

Biquaternion рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА


рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде biquaternions рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕реЗ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреАрд╡рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп:
рд╕рдорд╛рд░реЛрд╣рд╡рд┐рд╡рд░рдг
DualQuaternion.dq8 рдирдВрдмрд░ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ Biquaternion рд╢рд░реАрд░
DualQuaternion(dq0, dq1, dq2, dq3, dq4, dq5, dq6, dq7)рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛ рд╕рднреА рдЖрда рдирдВрдмрд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдПрдХ biquaternion рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
DualQuaternion.fromEulerVector(psi, theta, gamma, v)рдпреВрд▓рд░ рдПрдВрдЧрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреЛрдЬреАрд╢рди рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рдмрд╛рдЗрдХреЗрдЯрд░рдирд┐рдпрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
DualQuaternion.getEulerVector()рдИрдпреВрд▓рд░ рдПрдВрдЧрд▓ рдФрд░ рдкреЛрдЬрд╝рд┐рд╢рди рд╡реЗрдХреНрдЯрд░ рдХреЛ рдмрд╛рдЗрдХреЗрдЯрд░рд┐рдпрди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
DualQuaternion.getVector()рдмрд╛рдЗрдХрд░рдиреЗрд╢рди рд╕реЗ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
DualQuaternion.getReal()рдмрд╛рдЗрдХреЗрдЯрд░рд┐рдпрди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреЗ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ)
DualQuaternion.getDual()рджреНрд╡рд┐рд╡рд┐рднрд╛рдЬрди рдХрд╛ рджреЛрд╣рд░рд╛ рднрд╛рдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ)
DualQuaternion.norm()рджреНрд╡рд┐рдЕрд░реНрдереА рдорд╛рдирджрдВрдб рдХреЛ рдПрдХ рджреЛрд╣рд░реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
DualQuaternion.mod()рджреНрд╡рд┐рдЕрд░реНрдереА рдореЙрдбреНрдпреВрд▓ рдХреЛ рджреЛрд╣рд░реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
DualQuaternion.conjugate()рд╕рдВрдпреБрдЧреНрдорд┐рдд рджреНрд╡рд┐рд╡рд┐рднрд╛рдЬрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
DualQuaternion.inverse()рдЙрд▓реНрдЯрд╛ Biquaternion рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
DualQuaternion.mul(DQ2)рджреНрд╡рд┐рдмреАрдЬрдкрддреНрд░реА рдЧреБрдгрди
DualQuaternion.toString()рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рдмрдЧ рдХрдВрд╕реЛрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдХрд░рдиреЗрдЯрд┐рдпрди рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓реЗрдВ

рдлрд╝рд╛рдЗрд▓ dual_quaternion.js
 /** * * Author 2017, Akhramovich A. Sergey (akhramovichsa@gmail.com) * see https://github.com/infusion/Quaternion.js */ // 'use strict'; /** * Dual Quaternion constructor * * @constructor * @returns {DualQuaternion} */ function DualQuaternion(dq0, dq1, dq2, dq3, dq4, dq5, dq6, dq7) { if (dq0 === undefined) { this.dq = [1, 0, 0, 0, 0, 0, 0, 0]; } else { this.dq = [dq0, dq1, dq2, dq3, dq4, dq5, dq6, dq7]; } return this; }; //         DualQuaternion['fromEulerVector'] = function(psi, theta, gamma, v) { var q_real = new Quaternion.fromEuler(psi, theta, gamma); var q_v = new Quaternion(0, v[0], v[1], v[2]); var q_dual = q_v.mul(q_real); return new DualQuaternion( q_real.q[0], q_real.q[1], q_real.q[2], q_real.q[3], q_dual.q[0]*0.5, q_dual.q[1]*0.5, q_dual.q[2]*0.5, q_dual.q[3]*0.5); }; DualQuaternion.prototype = { 'dq': [1, 0, 0, 0, 0, 0, 0, 0], /** *    (psi, theta, gamma)      */ 'getEulerVector': function() { var euler_angles = this.getReal().getEuler(); var q_dual = this.getDual(); var q_dual_2 = new Quaternion(2.0*q_dual.q[0], 2.0*q_dual.q[1], 2.0*q_dual.q[2], 2.0*q_dual.q[3]); var q_vector = q_dual_2.mul(this.getReal().conjugate()); return [euler_angles[0], euler_angles[1], euler_angles[2], q_vector.q[1], q_vector.q[2], q_vector.q[3]]; }, /** *       */ 'getVector': function() { var euler_vector = this.getEulerVector(); return [euler_vector[3], euler_vector[4], euler_vector[5]]; }, /** *     * @returns {Quaternion} */ 'getReal': function() { return new Quaternion(this.dq[0], this.dq[1], this.dq[2], this.dq[3]); }, /** *     * @returns {Quaternion} */ 'getDual': function() { return new Quaternion(this.dq[4], this.dq[5], this.dq[6], this.dq[7]); }, /** *   * !   ! */ 'norm': function() { return [Math.pow(this.dq[0], 2) + Math.pow(this.dq[1], 2) + Math.pow(this.dq[2], 2) + Math.pow(this.dq[3], 2), this.dq[0]*this.dq[4] + this.dq[1]*this.dq[5] + this.dq[2]*this.dq[6] + this.dq[3]*this.dq[7]]; }, /** *   * !   ! */ 'mod': function() { var q_real_mod = Math.sqrt(Math.pow(this.dq[0], 2) + Math.pow(this.dq[1], 2) + Math.pow(this.dq[2], 2) + Math.pow(this.dq[3], 2)); return [q_real_mod, (this.dq[0]*this.dq[4] + this.dq[1]*this.dq[5] + this.dq[2]*this.dq[6] + this.dq[3]*this.dq[7])/q_real_mod]; }, /** *   * DQ' := (dq0, -dq1, -dq2, -dq3, dq4, -dq5, -dq6, -dq7) */ 'conjugate': function() { return new DualQuaternion(this.dq[0], -this.dq[1], -this.dq[2], -this.dq[3], this.dq[4], -this.dq[5], -this.dq[6], -this.dq[7]); }, //    'inverse': function() { var q_real_norm = new Quaternion(this.dq[0], this.dq[1], this.dq[2], this.dq[3]).norm(); var dq_norm_inv = [q_real_norm, - (this.dq[0]*this.dq[4] + this.dq[1]*this.dq[5] + this.dq[2]*this.dq[6] + this.dq[3]*this.dq[7])/q_real_norm]; var dq_conj = this.conjugate(); //      return new DualQuaternion( dq_norm_inv[0] * dq_conj.dq[0], dq_norm_inv[0] * dq_conj.dq[1], dq_norm_inv[0] * dq_conj.dq[2], dq_norm_inv[0] * dq_conj.dq[3], dq_norm_inv[0] * dq_conj.dq[4] + dq_norm_inv[1] * dq_conj.dq[0], dq_norm_inv[0] * dq_conj.dq[5] + dq_norm_inv[1] * dq_conj.dq[1], dq_norm_inv[0] * dq_conj.dq[6] + dq_norm_inv[1] * dq_conj.dq[2], dq_norm_inv[0] * dq_conj.dq[7] + dq_norm_inv[1] * dq_conj.dq[3]); }, /** *   * q1_real*q2_real, q1_real*q2_dual + q1_dual*q2_real */ 'mul': function(DQ2) { var q1_real = this.getReal(); var q1_dual = this.getDual(); var q2_real = DQ2.getReal(); var q2_dual = DQ2.getDual(); var q_res_real = q1_real.mul(q2_real); var q_res_dual_1 = q1_real.mul(q2_dual); var q_res_dual_2 = q1_dual.mul(q2_real); return new DualQuaternion( q_res_real.q[0], q_res_real.q[1], q_res_real.q[2], q_res_real.q[3], q_res_dual_1.q[0] + q_res_dual_2.q[0], q_res_dual_1.q[1] + q_res_dual_2.q[1], q_res_dual_1.q[2] + q_res_dual_2.q[2], q_res_dual_1.q[3] + q_res_dual_2.q[3]); }, /** *    */ 'transformVector': function (v) { var dq_res = this.mul(new DualQuaternion(1, 0, 0, 0, 0, v[0], v[1], v[2])).mul(this.conjugate()); return [dq_res.dq[5], dq_res.dq[6], dq_res.dq[7]]; }, /** *   ,   */ 'toString': function() { return '[' + this.dq[0].toString() + ', ' + this.dq[1].toString() + ', ' + this.dq[2].toString() + ', ' + this.dq[3].toString() + ', ' + this.dq[4].toString() + ', ' + this.dq[5].toString() + ', ' + this.dq[6].toString() + ', ' + this.dq[7].toString() + ']'; } } /* // TEST: var dq1 = new DualQuaternion.fromEulerVector(0 * Math.PI/180.0, 0 * Math.PI/180, 0 * Math.PI/180, [10, 20, 30]); console.log(dq1.toString()); console.log('getEulerVector = ', dq1.getEulerVector()); console.log('norm = ', dq1.norm()); console.log('mod = ', dq1.mod()); console.log('conjugate = ', dq1.conjugate().dq); console.log('inverse = ', dq1.inverse().dq); var dq2 = new DualQuaternion.fromEulerVector(0 * Math.PI/180.0, 0 * Math.PI/180, 0 * Math.PI/180, [10, 0, 0]); console.log('mul = ', dq1.mul(dq2).dq); console.log('transformVector ??? = ', dq1.transformVector([0, 0, 0])); */ 


рджреНрд╡рд┐рд╡рд┐рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ biquaternions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯреЗ рдЦреЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рд╕реЗрдЯ рд╣реИ - рдирдХреНрд╢рд╛ред рдирдХреНрд╢реЗ рдкрд░ рддреИрд░рдиреЗ рд╡рд╛рд▓реА рд░реЛрдЯрд░реА рдмрдВрджреВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╣рд╛рдЬ рддреИрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдЬ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдирдХреНрд╢реЗ рдХреА рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рдФрд░ рдмрдВрджреВрдХ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдЬрд╣рд╛рдЬ рд╣реИред рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдк рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдмреИрдХреБрдВрда рдЧреБрдгрди рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрди рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдореИрдк рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд╣рд╛рдЬ рдХреА рдЪрд╛рд▓ рдХреЛ рдбрдмреНрд▓реНрдпреВ, рдП, рдПрд╕, рдбреА рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдВрджреВрдХ рдХреА рджрд┐рд╢рд╛ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред



рдЬрд╣рд╛рдЬ рдФрд░ рдмрдВрджреВрдХ рджреЛ рд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ: Ship рдФрд░ Gun ред рд╢рд┐рдк рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдмрд╛рдЗрдХреЗрдЯрд░рдирд┐рдпрди рдкреЙрдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░, рдЗрд╕. this.dq_pos рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдк рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдФрд░ рд╕реНрдерд┐рддрд┐ this.dq_pos ред

рдЬрд╣рд╛рдЬ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рджреНрд╡рд┐рдЕрд░реНрдереА рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рднреА рджреА рдЬрд╛рддреА рд╣реИред рдЬрдм рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдХреА (рдХреАрдЬрд╝ W, S) рдЪрд▓рддреА рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рджреНрд╡рд┐рднреБрдЬ рдХрд╛ рджреЛрд╣рд░рд╛ рднрд╛рдЧ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЬрдм рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ (рдХреБрдВрдЬрд┐рдпрд╛рдБ A, D) рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рджреНрд╡рд┐рднреБрдЬ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рджреЛрд╣рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдШреВрд░реНрдгрди рдХреЛрдг рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

 function Ship(ctx, v) { this.ctx = ctx; this.dq_pos = new DualQuaternion.fromEulerVector(0*Math.PI/180, 0, 0, v); //   this.dq_forward_left = new DualQuaternion.fromEulerVector(0, 0, 0, [ 15, 0, -10]); this.dq_forward_right = new DualQuaternion.fromEulerVector(0, 0, 0, [ 15, 0, 10]); this.dq_backward_left = new DualQuaternion.fromEulerVector(0, 0, 0, [-15, 0, -10]); this.dq_backward_right = new DualQuaternion.fromEulerVector(0, 0, 0, [-15, 0, 10]); this.dq_forward_forward = new DualQuaternion.fromEulerVector(0, 0, 0, [ 30, 0, 0]); //      this.dq_dx_left = new DualQuaternion.fromEulerVector( 1*Math.PI/180, 0, 0, [0, 0, 0]); this.dq_dx_right = new DualQuaternion.fromEulerVector(-1*Math.PI/180, 0, 0, [0, 0, 0]); this.dq_dx_forward = new DualQuaternion.fromEulerVector(0, 0, 0, [ 1, 0, 0]); this.dq_dx_backward = new DualQuaternion.fromEulerVector(0, 0, 0, [-1, 0, 0]); return this; }; 

рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реА, Ship.draw() рдЬрд╣рд╛рдЬ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░реНрдп рд╣реИред рдЬрд╣рд╛рдЬ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ biquaternion рдФрд░ рдЬрд╣рд╛рдЬ рдХреЗ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ biquaternion рдСрдкрд░реЗрд╢рди рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

 Ship.prototype = { 'ctx': 0, 'dq_pos': new DualQuaternion.fromEulerVector(0, 0, 0, 0, 0, 0), /** *   */ 'draw': function() { //         v_pos = this.dq_pos.getVector(); v_forward_left = this.dq_pos.mul(this.dq_forward_left).getVector(); v_forward_right = this.dq_pos.mul(this.dq_forward_right).getVector(); v_backward_left = this.dq_pos.mul(this.dq_backward_left).getVector(); v_backward_right = this.dq_pos.mul(this.dq_backward_right).getVector(); v_forward_forward = this.dq_pos.mul(this.dq_forward_forward).getVector(); //   ctx.beginPath(); ctx.moveTo(v_backward_left[0], v_backward_left[2]); ctx.lineTo(v_forward_left[0], v_forward_left[2]); ctx.lineTo(v_forward_left[0], v_forward_left[2]); ctx.lineTo(v_forward_forward[0], v_forward_forward[2]); ctx.lineTo(v_forward_right[0], v_forward_right[2]); ctx.lineTo(v_backward_right[0], v_backward_right[2]); ctx.lineTo(v_backward_left[0], v_backward_left[2]); ctx.stroke(); ctx.closePath(); } }; 

рдЧрди рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдмрд╛рдЗрдХреЗрдЯрд░рдирд┐рдпрди рдкреЙрдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред рдмрдВрджреВрдХ рдХреЛ рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрд╣рд╛рдЬ рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╕реНрдерд┐рддрд┐ рдЗрд╕. this.dq_pos рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд┐рд╕ рдЬрд╣рд╛рдЬ рдкрд░ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рднреА рд╕реЗрдЯ рд╣реИред рдЬрд╣рд╛рдЬ рдкрд░ рд▓рдЧреА рдмрдВрджреВрдХ рдХреЗрд╡рд▓ рдШреВрдо рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрдВрджреВрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рджреНрд╡рд┐рднрд╛рдЬрд┐рдд рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЗрд╡рд▓ рдмрд╛рдЗрдХреЗрдЯрд░рдирд┐рдпрди рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмрджрд▓ рджреЗрдЧреА, рдЬреЛ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХреЛрдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрдВрджреВрдХ рдХрд╛ рд░реЛрдЯреЗрд╢рди рддреБрд░рдиреНрдд рд╣реЛрдЧрд╛ред

 function Gun(ctx, ship, v) { this.ctx = ctx; this.ship = ship; //     this.dq_pos = new DualQuaternion.fromEulerVector(0, 0, 0, v); //   this.dq_forward = new DualQuaternion.fromEulerVector(0, 0, 0, [20, 0, 0]); this.dq_backward = new DualQuaternion.fromEulerVector(0, 0, 0, [ 0, 0, 0]); //     this.dq_dx_left = new DualQuaternion.fromEulerVector( 1*Math.PI/180, 0, 0, [0, 0, 0]); this.dq_dx_right = new DualQuaternion.fromEulerVector(-1*Math.PI/180, 0, 0, [0, 0, 0]); return this; }; 

рдмрдВрджреВрдХ рд╡рд░реНрдЧ рдореЗрдВ, рдЗрд╕рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░реНрдп Ship.draw() рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдВрджреВрдХ рдХреЛ рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рджреЛ рдмрд┐рдВрджреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ this.dq_backward рдФрд░ this.dq_forward ред рдмрдВрджреВрдХ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреНрд╡рд┐рдмреАрдЬрдкрддреНрд░реА рдЧреБрдгрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 Gun.prototype = { 'ctx': 0, 'ship': 0, 'dq_pos': new DualQuaternion.fromEulerVector(0, 0, 0, [0, 0, 0]), /** *   */ 'draw': function() { //     v_pos = this.ship.dq_pos.getVector(); v_forward = this.ship.dq_pos.mul(this.dq_backward).mul(this.dq_forward).getVector(); v_backward = this.ship.dq_pos.mul(this.dq_backward).getVector(); //   ctx.beginPath(); ctx.moveTo(v_backward[0], v_backward[2]); ctx.lineTo(v_forward[0], v_forward[2]); ctx.stroke(); ctx.closePath(); } }; 

рдШрдЯрдирд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╣рд╛рдЬ рдФрд░ рдмрдВрджреВрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд╛рд░ рдЪрд░ leftPressed, upPressed, rightPressed, downPressed , рдЬреЛ рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдЬ рдирд┐рдпрдВрддреНрд░рдг рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдиреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред

 leftPressed = false; rightPressed = false; upPressed = false; downPressed = false; dq_mouse_pos = new DualQuaternion.fromEulerVector(0, 0, 0, [0, 0, 0]); document.addEventListener("keydown", keyDownHandler, false); document.addEventListener("keyup", keyUpHandler, false); document.addEventListener("mousemove", mouseMoveHandler, false); //     function keyDownHandler(e) { if (e.keyCode == 37 || e.keyCode == 65 || e.keyCode == 97) { leftPressed = true; } //  A else if (e.keyCode == 38 || e.keyCode == 87 || e.keyCode == 119) { upPressed = true; } //  W else if (e.keyCode == 39 || e.keyCode == 68 || e.keyCode == 100) { rightPressed = true; } //  D else if (e.keyCode == 40 || e.keyCode == 83 || e.keyCode == 115) { downPressed = true; } //  S } //     function keyUpHandler(e) { if (e.keyCode == 37 || e.keyCode == 65 || e.keyCode == 97) { leftPressed = false; } //  A else if (e.keyCode == 38 || e.keyCode == 87 || e.keyCode == 119) { upPressed = false; } //  W else if (e.keyCode == 39 || e.keyCode == 68 || e.keyCode == 100) { rightPressed = false; } //  D else if (e.keyCode == 40 || e.keyCode == 83 || e.keyCode == 115) { downPressed = false; } //  S } 

рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдмрд╛рдЗрдХреЗрдЯрд░рдирд┐рдпрди рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╣рд╛рдЬ рдХреА рдмрдВрджреВрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ dq_mouse_pos рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдлрд┐рд░, рдЬрд╣рд╛рдЬ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдорд╛рдЙрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рджреНрд╡рд┐рднрд╛рдЬрдХ рдХреА рдЧрдгрдирд╛ рджреНрд╡рд┐рднрд╛рдЬрди рдЧреБрдгрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред рдЬрд╣рд╛рдЬ рдХрд╛ dq_mouse_pos_about_ship = ship_1.dq_pos.inverse().mul(dq_mouse_pos); рдорд╛рдЙрд╕ dq_mouse_pos_about_ship = ship_1.dq_pos.inverse().mul(dq_mouse_pos);
(рдиреЛрдЯ: рдЕрдиреБрдХреНрд░рдорд┐рдХ рджреНрд╡рд┐рдмреАрдЬрдкрддреНрд░реА рдЧреБрдгрди рд╕рдВрдЪрд╛рд▓рдиреЛрдВ рдХреЛ рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдкрдврд╝рд╛ рдЧрдпрд╛)ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЙрдкрдХрд░рдг рдФрд░ рдорд╛рдЙрд╕ рдХреЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдХрд╛ рдХреЛрдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрдВрджреВрдХ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ gun_1.dq_backward рдкреНрд░рд╛рдкреНрдд рдорд╛рди рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред

 function mouseMoveHandler(e) { var relativeX = e.clientX - canvas.offsetLeft; var relativeY = e.clientY - canvas.offsetTop; //           if (relativeX > 0 && relativeX < canvas.width && relativeY > 0 && relativeY < canvas.height) { //    dq_mouse_pos = new DualQuaternion.fromEulerVector(0, 0, 0, [relativeX, 0, relativeY]); //      //  .       //     // DQ_ship^(-1) * DQ_mouse dq_mouse_pos_about_ship = ship_1.dq_pos.inverse().mul(dq_mouse_pos); //       q_gun_mouse = new Quaternion.fromBetweenVectors(gun_1.dq_forward.getVector(), dq_mouse_pos_about_ship.getVector()); dq_gun_mouse = new DualQuaternion(q_gun_mouse.q[0], q_gun_mouse.q[1], q_gun_mouse.q[2], q_gun_mouse.q[3], 0, 0, 0, 0); gun_1.dq_backward = dq_gun_mouse; // console.log(dq_gun_mouse.getEulerVector()); // console.log(relativeX + ' ' + relativeY + ' ' + gun_1.dq_forward.toString()); } } 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдореБрдЦреНрдп рдирд┐рдХрд╛рдп рдореЗрдВ, рдЬрд╣рд╛рдЬ рдФрд░ рдмрдВрджреВрдХреЗрдВ ship_1 рдФрд░ gun_1 , рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬрд╣рд╛рдЬ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); ship_1 = new Ship(ctx, [100, 0, 100]); gun_1 = new Gun(ctx, ship_1, [0, 0, 0]); function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); ship_1.draw(); gun_1.draw(); // Debug info ship_euler_vector = ship_1.dq_pos.getEulerVector(); ship_euler_vector[0] = ship_euler_vector[0]*180/Math.PI; ship_euler_vector[1] = ship_euler_vector[1]*180/Math.PI; ship_euler_vector[2] = ship_euler_vector[2]*180/Math.PI; ship_euler_vector = ship_euler_vector.map(function(each_element){ return each_element.toFixed(2); }); ship_dq = ship_1.dq_pos.dq.map(function(each_element){ return each_element.toFixed(2); }); gun_dq = ship_1.dq_pos.mul(gun_1.dq_backward).dq.map(function(each_element){ return each_element.toFixed(2); }); ctx.font = "8pt Courier"; ctx.fillText("Ship: " + ship_dq + " | psi, theta, gamma, vector:" + ship_euler_vector, 10, 20); ctx.fillText("Gun: " + gun_dq, 10, 40); //   if (leftPressed) { ship_1.dq_pos = ship_1.dq_pos.mul(ship_1.dq_dx_left); } if (rightPressed) { ship_1.dq_pos = ship_1.dq_pos.mul(ship_1.dq_dx_right); } if (upPressed) { ship_1.dq_pos = ship_1.dq_pos.mul(ship_1.dq_dx_forward); } if (downPressed) { ship_1.dq_pos = ship_1.dq_pos.mul(ship_1.dq_dx_backward); } requestAnimationFrame(draw); } draw(); 

рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдВрдХ рдореЗрдВ quaternions рдФрд░ biquaternions, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реА рдФрд░ index.html рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рд╣реИ, рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджреНрд╡рд┐рд╡рд┐рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рдирд┐рд╖реНрдХрд░реНрд╖


рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢реНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдЬрдм рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рд┐рд▓рд╛рдиреЗ рдФрд░ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдРрд╕реЗ рдЬрдЯрд┐рд▓ рдЧрдгрд┐рддреАрдп рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ? рдореБрдЦреНрдп рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд▓реЗрдЦрди рдХрд╛ рджреНрд╡рд┐рднрд╛рдЬрд┐рдд рд░реВрдк рдЕрдзрд┐рдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рдХреБрд╢рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╡реЛрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреЗ рд╡рд┐рднрд╛рдЬрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рд╕рдВрдЪрд╛рд▓рди рд░реИрдЦрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рд╡реАрдбрд┐рдпреЛ, рдЬрд┐рдпреЛрдореЗрдЯреНрд░рд┐рдХ рд╕реНрдХрд┐рдирд┐рдВрдЧ рд╡рд┐рде рдПрдкреНрд░реЛрдХреНрд╕рд┐рдореЗрдЯ рдбреНрдпреВрд▓ рдХреНрд╡рд╛рдЯрд░реНрдирд┐рдпрди рдмреНрд▓реЗрдВрдбрд┐рдВрдЧ, рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ рджреНрд╡рд┐рднрд╛рдЬрди рдЧрдгрдирд╛ред

рдореИрдВрдиреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрд░реЛрддреЛрдВ рд╕реЗ biquaternions рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реАред
рдШрд░реЗрд▓реВ рд╕рд╛рд╣рд┐рддреНрдп рд╕реЗ, рдореИрдВ рджреЛ рдкреБрд╕реНрддрдХреЛрдВ рдХреА рд╕рд▓рд╛рд╣ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ:

  1. рдЪреЗрд▓рдиреЛрдХреЛрд╡ рдпреВрд░реА рдирд┐рдХреЛрд▓рд╛рдЗрд╡рд┐рдЪред рдЪрддреБрд░реНрдзрд╛рддреБрдХ рдФрд░ рджреНрд╡рд┐рд╡рд╛рд░реНрд╖рд┐рдХ рдореЙрдбрд▓ рдФрд░ рдареЛрд╕ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧред рдЧрддрд┐ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдФрд░ рдХреАрдиреЗрдореЗрдЯреАрдХреНрд╕ред - рд╕реНрдорд╛рд░рдХреАрдп рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдХрд╛рд░реНрдпред
  2. рдЧреЛрд░реНрдбреАрд╡ рд╡рд╛рджрд┐рдо рдирд┐рдХреЛрд▓рд╛рдЗрд╡рд┐рдЪред рдЬреНрдпрд╛рдорд┐рддрд┐ рдФрд░ рдпрд╛рдВрддреНрд░рд┐рдХреА рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЪрддреБрд░реНрдзрд╛рддреБрдХ рдФрд░ рджреНрд╡рд┐рд╡рдЪрдиред - рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдШреБрдорд╛рд╡рджрд╛рд░ рд╕реНрдерд╛рдирд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi436210/


All Articles