我正在尝试在地图上绘制国际空间站的轨道地面轨迹,我想我一知道弄清楚如何在地图上定位直线,便会做到这一点。
要弄清线的位置,我尝试使用以下代码(减去多余的小部件)从地图的左下方到右上方绘制一条线:
#:import kivy kivy
#:import win kivy.core.window
<Orbit_Screen>:
name: 'orbit'
FloatLayout:
id: orbit_layout
Image:
id: OrbitMap
source: 'C:/Users/Sam/PycharmProjects/Mimic-Development/Pi/imgs/orbit/map.jpg'
pos_hint: {"center_x": 0.5, "center_y": 0.56}
size: (500,300)
#size_hint_y: 0.598
size_hint: (None,None)
allow_stretch: False
keep_ratio: True
Widget:
id: TDRS10
col: (1,1,1,1)
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
size_hint: '0.01dp', '0.02dp'
canvas:
Color:
rgba: self.col
Ellipse:
pos: self.pos
size: self.size
Line:
points: (OrbitMap.x,OrbitMap.y,OrbitMap.width,OrbitMap.height)
joint: "round"
有人可以帮助我理解为什么起始x坐标与地图匹配但y坐标在图像下方并且右上角坐标均不足吗?感谢您的协助。我真的以为我了解小部件的位置,但我想不是。
答案 0 :(得分:1)
对OrbitMap
进行缩放和转换,使其符合pos_hint
中size
和kv
的规范。假设您的轨道线坐标相对于原始地图以像素为单位,那么您将需要平移和缩放这些坐标以匹配应用于地图图像的比例和平移。我相信您可以在kv
Widget
的{{1}}中使用它来实现:
canvas
上面的方法使用Widget:
id: TDRS10
col: (1,1,1,1)
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
size_hint: '0.01dp', '0.02dp'
canvas:
PushMatrix:
Translate:
xy: (OrbitMap.x + (OrbitMap.width - OrbitMap.norm_image_size[0])/2, OrbitMap.y + (OrbitMap.height - OrbitMap.norm_image_size[1])/2)
Scale:
origin: 0,0
x: OrbitMap.norm_image_size[0] / OrbitMap.texture_size[0] if OrbitMap.texture_size[0] > 0 else 1
y: OrbitMap.norm_image_size[1] / OrbitMap.texture_size[1] if OrbitMap.texture_size[1] > 0 else 1
Color:
rgba: self.col
Ellipse:
pos: self.pos
size: self.size
Line: # test diagonal line 1
points: (0, 0, OrbitMap.texture_size[0], OrbitMap.texture_size[1])
joint: "round"
Line: # test diagonal line 2
points: (0, OrbitMap.texture_size[1], OrbitMap.texture_size[0], 0)
joint: "round"
Line: # test norizontal line
points: (0, OrbitMap.texture_size[1]/2, OrbitMap.texture_size[0], OrbitMap.texture_size[1]/2)
joint: "round"
Line: # test vertical line
points: (OrbitMap.texture_size[0]/2, 0, OrbitMap.texture_size[0]/2, OrbitMap.texture_size[1])
joint: "round"
PopMatrix:
canvas
和Scale
矩阵来转换线坐标。我已用一些测试线替换了您的轨道线,以确保该方案有效。