math - 尝试旋转坐标时出现错误的图形
问题描述
考虑以下玩具数据:
clear
input double x1 float y1
0 0
.0013440860215053765 .02503477
.0013440860215053765 .05006954
.005376344086021506 .0751043
.009408602150537635 .10013908
.01747311827956989 .12482615
.03225806451612903 .1498609
.056451612903225805 .1748957
.07661290322580645 .19993046
.09946236559139784 .22496523
.15725806451612903 .25
.2110215053763441 .2750348
.32661290322580644 .3000695
.3803763440860215 .3251043
.4986559139784946 .3497914
.603494623655914 .3748261
.706989247311828 .3998609
.7661290322580645 .4248957
.8064516129032258 .4499305
.885752688172043 .4749652
.9099462365591398 .5
1 .5250348
.9811827956989247 .5500696
.8870967741935484 .5751043
.7661290322580645 .5997913
.6599462365591398 .6248261
.5873655913978495 .6498609
.5282258064516129 .6748957
.40053763440860213 .6999304
.3279569892473118 .7249652
.2163978494623656 .75
.15053763440860216 .7750348
.09408602150537634 .8000696
.06586021505376344 .8247566
.04973118279569892 .8497913
.024193548387096774 .8748261
.025537634408602152 .8998609
.006720430107526882 .9248957
.002688172043010753 .9499304
.004032258064516129 .9749652
0 1
end
twoway scatter y1 x1
当我尝试将整个图形逆时针旋转度数20
时:
local theta = 0.349066
generate x2 = (x1 * cos(`theta') ) - (y1 * sin(`theta') )
generate y2 = (x1 * sin(`theta') ) - (y1 * cos(`theta') )
坐标变换如下:
clear
input float(x2 y2)
0 0
-.007299372 -.023065284
-.01586177 -.04659027
-.020635087 -.06873614
-.025408404 -.09088202
-.026273714 -.11132205
-.02094281 -.12979028
-.006770712 -.14504059
.0036123034 -.16167
.016521374 -.17738
.06226916 -.1811377
.10422786 -.1862745
.20428585 -.1702649
.24624455 -.1754017
.3489475 -.1581459
.4389013 -.14581393
.527592 -.13394167
.57460284 -.13723963
.6039312 -.1469735
.6698875 -.1433759
.6840596 -.1586262
.76012 -.151351
.7338752 -.18131188
.6369009 -.23701614
.51478493 -.3015878
.4064434 -.3614295
.3296775 -.4097785
.26554185 -.45353055
.13699183 -.52072746
.06022594 -.5690765
-.05316776 -.630757
-.12361852 -.6768075
-.1852281 -.7196401
-.22019514 -.7524921
-.24391386 -.7815335
-.2764738 -.8137929
-.28377315 -.8368582
-.3100179 -.8668191
-.3223694 -.8917232
-.3296688 -.9147884
-.3420203 -.9396926
end
twoway scatter y2 x2
我错过了什么?
请注意,我还尝试将值首先围绕特定点居中。
此外,我还希望解决方案能够考虑不同的轴比例和图形纵横比。
例如:
clear
input float y double x
-2013 .001
-1941 .0010053763440860215
-1869 .0010053763440860215
-1797 .0010215053763440861
-1725 .0010376344086021505
-1654 .0010698924731182796
-1582 .0011290322580645162
-1510 .0012258064516129032
-1438 .0013064516129032257
-1366 .0013978494623655914
-1294 .0016290322580645162
-1222 .0018440860215053765
-1150 .0023064516129032257
-1078 .0025215053763440864
-1007 .0029946236559139786
-935 .003413978494623656
-863 .003827956989247312
-791 .004064516129032258
-719 .004225806451612904
-647 .004543010752688172
-575 .004639784946236559
-503 .005
-431 .0049247311827956995
-359 .004548387096774194
-288 .004064516129032258
-216 .0036397849462365592
-144 .003349462365591398
-72 .0031129032258064514
0 .0026021505376344085
72 .002311827956989247
144 .0018655913978494624
216 .0016021505376344087
288 .0013763440860215053
359 .0012634408602150537
431 .0011989247311827958
503 .0010967741935483872
575 .0011021505376344087
647 .0010268817204301076
719 .001010752688172043
791 .0010161290322580644
863 .001
end
twoway scatter y x
该y-xis
图的 是4
英寸,而x-axis
是5.5
英寸(的纵横比1.375
)。
我查阅了许多帖子,包括以下内容:
我希望我想要做的事情很清楚,但我很乐意进一步澄清。
解决方案
旋转公式如下:
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
-column乘以1.5
,旋转20
角度,然后除以1.5
。如果轴保持它们的长度,我们应该会看到相同的图按20
度数旋转。但是,数据范围已更改,并且绘图已调整大小!角度不20
完全是度数。在第二个具有巨大轴比例差异的示例中,这种效果将更加明显。
如果旋转后范围保持不变,我希望所描述的方法应该给出正确的角度。可以用简单的像素绘图来检查它,但我担心这个模拟不会重现你的绘图系统的行为。使用自动轴范围,精确的角度是不可能的。
推荐阅读
- scala - scala - scalatest - 最终特征胜过失败断言?
- angular - latest @angular-cli 不会创建具有最新 angular 的项目
- ios - 无法向我的应用添加新的 iOS 捆绑标识符 - LinkedIn
- sql-server - SQL Management Studio:请求组到多个文件
- regex - 正则表达式删除特定的查询参数
- python - 邮递 | 如何使用文本部分中的变量使用 Python 发送邮件?
- dart - 如何清除块中的数据?
- android - 构建到 Android 时解决 gradle 依赖项的问题
- sql-server - 从 JSON API 请求数据并使用 SSIS 存储在 SQL Server 中
- python - Maximo - 自动化脚本 - 小数点