Math 尝试旋转坐标时出现错误的图形
考虑以下玩具数据:Math 尝试旋转坐标时出现错误的图形,math,graph,rotation,coordinates,stata,Math,Graph,Rotation,Coordinates,Stata,考虑以下玩具数据: clear input double x1 float y1 0 0 .0013440860215053765 .02503477 .0013440860215053765 .05006954 .005376344086021506 .0751043 .009408602150537635 .10013908 .01747311827956989 .12482615 .03225806451612903 .
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
我错过了什么
请注意,我还尝试将值首先集中在特定点周围
此外,我还希望解决方案考虑不同的轴比例和图形纵横比
例如:
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轴为4英寸,而x轴为5.5英寸,纵横比为1.375
我曾咨询过多个职位,包括:
generate x2 = (x1 * cos(`theta') ) - (y1 * sin(`theta') )
generate y2 = (x1 * sin(`theta') ) + (y1 * cos(`theta') )
我希望我想说的很清楚,但我很乐意进一步澄清。旋转公式如下:
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乘以系数即可
但似乎要旋转已拉伸的视觉表示。假设你的地块沿着牛的方向延伸了5倍。在这种情况下,首先将内部数据x坐标乘以5,将“旋转注释-缩放旋转中心”,然后除以5
对于第一个示例,x轴约长1.5倍。所以我们可以将x柱乘以1.5,旋转20度,再除以1.5。如果轴保持其长度,我们将看到相同的绘图旋转20度。但是,数据范围已更改,绘图的大小已调整!角度不完全是20度。在第二个具有巨大轴比例差异的示例中,这种影响将更加明显
如果旋转后范围保持不变,我希望所描述的方法应该给出正确的角度。它可能会被简单的像素打印检查,但我担心这个模拟不会再现您的打印系统的行为。对于自动轴范围,精确的角度是不可能的。@PearlySpiner:占位符5是我在你的链接问题中定义的“斜率系数”。请注意,由于物理打印区域是矩形的,因此很有可能会将数据旋转出帧。如果你以不对称的方式扩展绘图区域,你当然会扭曲旋转后的形状。如果旋转后的范围保持不变,我希望所描述的方法会给出正确的角度。它可能会被简单的像素打印检查,但我担心这个模拟不会再现您的打印系统的行为。我会尝试它,如果必要的话会再次给您带来错误。谢谢。@DavisHerring如果你有时间的话,请随意回答这个问题。@PearlySpencer:除了在旋转之前你应该用我的v来放大y,在旋转之后用v来调整中心时,我匆忙地认为它是x,我认为这个答案和评论中没有遗漏任何东西。我确实注意到比这个答案更明确的是,您可以将所有三个矩阵相乘,得到一个有效应用的转换。