首页 > 解决方案 > 基于其他小部件位置的 Kivy 位置线

问题描述

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

为了弄清楚线的位置,我尝试使用以下代码(减去额外的小部件)从地图的左下角到右上角画一条线:

#: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 坐标在图像下方并且右上角的坐标都不足?感谢您的任何帮助。我真的以为我了解小部件定位,但我想不是。

标签: kivykivy-language

解决方案


OrbitMap缩放和翻译以满足您pos_hintsize您的kv. 假设您的轨道线坐标相对于原始地图以像素为单位,那么您将需要平移和缩放这些坐标以匹配应用于地图图像的比例和平移。我相信你可以在你的kvfor中使用它来实现Widget 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 ScaleTranslate矩阵来转换线坐标。我已经用一些测试线替换了你的轨道线,以确保该方案有效。


推荐阅读