Формулы вращения следующие:
generate x2 = (x1 * cos(`theta') ) - (y1 * sin(`theta') )
generate y2 = (x1 * sin(`theta') ) + (y1 * cos(`theta') )
Они выполняют вращение вокруг точки (0,0)
.
Чтобы сделать поворот вокруг определенной центральной точки (cx, cy)
, можно применить следующий подход:
generate x2 = cx + ((x1 - cx) * cos(`theta') ) - ((y1 - cy) * sin(`theta') )
generate y2 = cy + ((x1 - cx) * sin(`theta') ) + ((y1 - cy) * cos(`theta') )
Приведенные выше формулы представляют собой матрицу аффинного преобразования. Чтобы учесть масштаб осей, вы должны умножить матрицу результатов путем масштабирования матрицы - это очень просто, просто умножьте x
или y
на коэффициент в соответствии с отношением ось / ось.
Но, похоже, вы хотите повернуть уже растянутое визуальное представление. Скажем, ваш участок растянут вдоль OX
в 5
раз. В этом случае сначала умножьте x-координаты внутренних данных на 5
, сделайте вращение (обратите внимание - масштабируйте центр вращения тоже), затем разделите на 5
.
Для вашего первого примера x-axis
в ~ 1.5
раз длиннее. Таким образом, мы можем умножить x
-колонку на 1.5
, повернуть на 20
градусов и разделить на 1.5
. Если оси сохраняют свою длину, мы должны увидеть тот же график, повернутый на 20
градусов. Однако диапазоны данных изменились, а график изменился! Угол не 20
градусов точно. Этот эффект будет более очевиден во втором примере с огромной разницей в масштабе осей.
Если диапазоны остаются неизменными после вращения, я ожидаю, что описанный подход должен давать правильные углы. Это можно проверить с помощью простой пиксельной прорисовки, но я боюсь, что это моделирование не будет воспроизводить поведение вашей системы прорисовки. С автоматическим диапазоном осей точные углы невозможны.