Завъртете самолета с мишката

Преди да преминете към доста сложна тема, а именно да зададете афинна трансформация в матрична форма, помислете за следния въпрос. Как да завъртите изображение (равнина) с мишка?

Има двойка точки M0 (x 0, y 0), M (x, y) - началната и крайната позиция на мишката. От тези точки трябва да определите ъгъла на въртене на равнината. Как да го направя. Можете да опитате да експериментирате с формулите, но скоро ще стане ясно, че е необходимо да се вземат предвид не само относителните промени в координатите Δ x, Δ y, но и техните абсолютни стойности. Така например, на изображението по-долу, промените x за движенията на мишката M0M и M0'M са еднакви, но интуитивно едно от тези движения завърта триъгълника по посока на часовниковата стрелка, а другото обратно на часовниковата стрелка.

вграден оператор

Същността на техниката е, че се изгражда въображаем единичен кръг с център в началото на координатите и върху него се измерват началният и крайният ъгъл. След това се прави обрат за разликата насочени ъгли.

CurrentMatrix CurrentMatrix

В този случай, за да получите точките M 0 'и M', просто трябва да нормализирате векторите OM 0 и OM. Сега нека завъртим равнината, така че векторът OM 0 'да се превърне в OM'. Оказва се, че това не е толкова лесно, колкото може да изглежда на пръв поглед.
Ъгъл между векторите

Нека да видим как да изчислим ъгъла между векторите в декартова координатна система. Първото нещо, което ви идва на ум, е да използвате точковия продукт.

завъртете

Проблемът е, че за точковото произведение векторите OM '' и OM '' ще бъдат неразличими. Можете да получите косинуса на ъгъла между тях. Но ако завъртите равнината от OM към OM ', тогава въртенето е по посока на часовниковата стрелка. В случая на OM “- обратно на часовниковата стрелка. Така По този начин, освен стойността на ъгъла, трябва да знаете и неговия знак. "Кръстосан продукт" може да помогне тук.

Приблизително Защото ние работим в двумерно пространство, тогава е невъзможно да се говори стриктно за векторния продукт. Но можете да използвате резултата, че тази операция разграничава реда на векторите.

Помислете за триизмерно пространство и нашето двумерно сечение е равнината z = 0. Това означава, че всички вектори в тази равнина имат третата координата, равна на 0. Векторът умножава векторите OM (x, y) и OM '(x ’, y’):

Функция от вектори f ( а, б ) = (x y ’- y x’) ще бъде равно на синуса на посоката на ъгъла от вектора и към вектор б, умножено по дължините на векторите а и б (| а || б | грях (α)).

Приблизително Можете да проверите дали (f ( а, б )) 2 + ( аб ) 2 = | а || б |.

Като се вземе предвид факта, че нашите вектори са единица (M 0 'и M' лежат върху единичната сфера), като се използва скаларното произведение и функцията f ( а, б ) получаваме косинуса и синуса на желания ъгъл, като вземаме предвид неговата посока. Остава да замести получените стойности в матрицата на въртене и ще се получи необходимия ефект.