我正在使用Kivy框架用Python开发GUI。我的GUI包含一个windrose,其中一个箭头(包含在png图像中)围绕一个圆圈旋转,以指示当前的风向。windrose是圆形的,但是因为我使用的屏幕是非方形像素,所以windrose的实际大小是134像素宽145.940594像素高。需要在垂直方向上应用以说明非正方形像素的系数为220/202=1.089108
以下是我必须旋转png文件中包含的箭头(尺寸为134像素×134像素)的代码片段:
<WindSpeedPanel>: # This WindSpeedPanel has dimensions of 262 pixels wide by 220 pixels high
AnchorLayout:
pos_hint: {'x': 65/262, 'y': 26/202}
size_hint: (134/262, 134/202)
anchor_x: 'center'
anchor_y: 'center'
Image:
source: 'icons/windRose/arrow.png'
size_hint: (1, 1)
keep_ratio: 0
allow_stretch: 1
canvas.before:
PushMatrix
Rotate:
angle: -app.windDir
axis: 0, 0, 1
origin: self.parent.center
canvas.after:
PopMatrix
我面临的问题是,当图像旋转(例如旋转90度)时,它会变为椭圆形,因为考虑到非方形像素需要进行宽度/高度缩放:
我可以解决两个简单的情况,其中旋转是
然而,目前我无法解决所有中间角度所需的缩放。我尝试了各种带有正弦/余弦的方程来计算必要的宽度/高度比例因子,但似乎什么都不起作用。我总是以旋转后的png图像被压缩/拉伸成椭圆而告终。例如,在45度且未应用缩放时,我看到:
有人知道我应该如何计算必要的宽度/高度比例因子,以确保png图像无论旋转角度如何都保持圆形吗
我有预感,解决办法是按
(220/202)*abs(sin(angle))
缩放宽度,按(202/220)*abs(sin(angle))
缩放高度角度是保持角度的变量(0到360度)
sin()表示正弦,abs()表示绝对值
编辑:
也许更准确的解决方案是将圆(windrose)视为椭圆
因此,圆上的每个点(x,y)实际上是(假设圆以点(0,0)为中心):
相关问题 更多 >
编程相关推荐