基于其他小部件位置的Kivy位置线

时间:2019-12-06 05:07:17

标签: kivy kivy-language

我正在尝试在地图上绘制国际空间站的轨道地面轨迹,我想我一知道弄清楚如何在地图上定位直线,便会做到这一点。

要弄清线的位置,我尝试使用以下代码(减去多余的小部件)从地图的左下方到右上方绘制一条线:

#: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"

产生以下图像: enter image description here

有人可以帮助我理解为什么起始x坐标与地图匹配但y坐标在图像下方并且右上角坐标均不足吗?感谢您的协助。我真的以为我了解小部件的位置,但我想不是。

1 个答案:

答案 0 :(得分:1)

OrbitMap进行缩放和转换,使其符合pos_hintsizekv的规范。假设您的轨道线坐标相对于原始地图以像素为单位,那么您将需要平移和缩放这些坐标以匹配应用于地图图像的比例和平移。我相信您可以在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: canvasScale矩阵来转换线坐标。我已用一些测试线替换了您的轨道线,以确保该方案有效。