WinRT, Математически изчисления на трансформации

WinRT --- Преобразуване на математически изчисления

По-рано казах, че преобразуването е резултат от прилагането на математическа формула, която превежда точка (x, y) в (x ', y'), към всички точки на елемент. Време е да се запознаете с математическите изчисления, лежащи в основата на трансформациите.

Да приемем, че свойствата X и Y на обекта TranslateTransform са зададени на TX и TY. Формулата за трансформация на смени добавя тези стойности към x и y:

Когато свойствата ScaleX и ScaleY на ScaleTransform са зададени на SX и SY, формулите за преобразуване също са доста очевидни:

Така че, след като разберете основите, можете да започнете да комбинирате трансформации - например в TransformGroups. Ако ScaleTransform се преобразува първо, последвано от TranslateTransform, формулите ще изглеждат така:

Ако обаче преводът се приложи първо и мащабирането се извърши след него, резултатът е малко по-различен:

Сумата на смяната се умножава по коефициента на мащабиране. Класът ScaleTransform дефинира не само свойствата ScaleX и ScaleY, но и свойствата CenterX и CenterY. По-рано говорих за това как централната точка се използва за изчертаване на две отмествания. Първата смяна се извършва с отрицателна сума, след това се извършва мащабиране или завъртане, последвана от положителна смяна. Да приемем, че свойствата CenterX и CenterY са зададени на CX и CY. Формулите за мащабиране имат формата:

Както можете лесно да проверите, точката (CX, CY) се трансформира в точката (CX, CY) и тази характеристика се притежава от центъра на въртене: точката, която трансформацията оставя непроменена.

Във всички разгледани случаи точката x 'се изчислява чрез умножаване и добавяне на константи с x, а точката y' чрез умножаване и добавяне на константи с y. С завои нещата стават по-сложни, тъй като х и у започват да зависят от х и у. Ако свойството Angle на обекта RotateTransform е A, формулите за преобразуване изглеждат така:

Формулите са лесни за проверка за прости случаи. Ако A е равно на нула, тогава формулите остават:

Ако A е 90 °, тогава синусът е 1, косинусът е 0, съответно:

Например точка (1,0) се преобразува в (0,1), а точка (0,1) се преобразува в (-1,0). Трансформацията е отражение на произхода и същият ефект може да бъде постигнат със ScaleTransform, който има ScaleX и ScaleY равен на -1. За A = 270 °:

Първата фаза на горната трансформация на отклонение изглежда така:

изчисления

Формулите за тази конкретна трансформация (свойството AngleX е 45 °):

За y стойности от 0 (горния ръб на фигурата) стойността x 'е просто x, а стойността y' е y. Но докато се движите надолу по фигурата, стойностите на y се увеличават, така че стойностите на x 'стават по-големи от x. Обобщените формули за преобразуване за SkewTransform с AngleX, равна на AX и AngleY, равна на AY, изглеждат така:

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

Нека точката (x, y) се изрази с матрица 2x1:

Преобразуването се описва с матрица 2x2:

Приложението за преобразуване в този случай може да бъде изразено чрез умножение на матрица. Резултатът от умножението е преобразуваната точка:

Умножението на матрицата се извършва по следните формули:

Формулата работи и за мащабиране, ако свойството ScaleX е M11, свойството ScaleY е M22, а M21 и M12 са нула. Също така е подходящ за завои с отклонения, тъй като и двете операции използват коефициенти, умножени по x и y.

Но не е подходящ за смяна. Позволете ми да ви напомня как изглеждат формулите за смяна:

Сумата на смяната се добавя сама, без да се умножава по x или y. Как да представим генерализирана трансформация като матрица, ако тя не поддържа превод - може би най-простата от всички видове трансформации?

Интересно решение на проблема се основава на въвеждането на третото измерение. В допълнение към осите X и Y се добавя концептуална ос Z в равнината на екрана на монитора, излизаща от екрана. Да предположим, че нанасянето се извършва на 2D равнина, но тази равнина съществува в 3D пространство с постоянна координата Z от 1. По този начин точката (x, y) всъщност е точка (x, y, 1) и за нейното представяне може да използва матрица 3x1: