【问题标题】:Plot /draw maze-like lines with Python?用 Python 绘制/绘制迷宫般的线?
【发布时间】:2018-07-23 22:34:44
【问题描述】:

编程新手,我正在尝试绘制类似道路边界的线。基本上,我正在创建类似于路线图的东西,并且我希望一个矩形始终在轨迹中移动(我的意思是,矩形的 x、y 坐标随着线条的增加而增加)。

思路如下图。

谁能帮帮我?如何创建和绘制红线以及沿箭头方向移动的黑色矩形?

更新:我需要每次检查矩形到线条的距离是否低于某个阈值。我想我可能需要使用某种数组/元素。但我不清楚如何使用它。谁能帮我?谢谢。

【问题讨论】:

  • Python 本身没有任何图形功能;有像 matplotlib 这样的东西,但你的答案将取决于你决定使用哪个。

标签: python plot draw lines


【解决方案1】:

您可以使用 pygames 并从字面上绘制任何东西。既然你还没有开始,试试这个教程here

或者你可以试试turtle.

【讨论】:

    【解决方案2】:

    或者你可以试试乌龟。

    下面是我用 Python turtle 实现的一个极简地图跟随器。 (不是迷宫追随者,因为它不进行任何回溯。)这应该让您大致了解如何使用包含迷宫结构的数组来绘制迷宫和移动穿过它的对象:

    from turtle import Turtle, Screen
    
    MAP = '''
    XXXXXXXXOX
    XOOOOOOOOX
    XOXXXXXXXX
    XOOOOXXXXX
    XXXXOXXXXX
    XXXXOXXXXX
    XXXXOOOOOX
    XXXXXXXXOX
    XOOOOOOOOX
    XOXXXXXXXX
    '''
    
    MAP_ARRAY = [list(row) for row in MAP.strip().split('\n')]
    MAP_ARRAY.reverse()  # put 0, 0 in lower left corner
    
    ADJACENT = [
                  (0,  1),
        (-1,  0),          (1,  0),
                  (0, -1),
    ]
    
    SCALE = 3
    
    STAMP_SIZE = 20
    
    WIDTH, HEIGHT = len(MAP_ARRAY[0]), len(MAP_ARRAY)
    
    def any_adjacent(x, y):
        return [(x + dx, y + dy) for dx, dy in ADJACENT if 0 <= x + dx < WIDTH and 0 <= y + dy < HEIGHT and MAP_ARRAY[y + dy][x + dx] == 'O']
    
    def move():  # slowly navigate the MAP, quit when no where new to go
        x, y = turtle.position()
        adjacent_squares = any_adjacent(int(x), int(y))
    
        # always moves to first valid adjacent square, need to consider
        # how to deal with forks in the road (e.g. shuffle adjacent_squares)
        for adjacent in adjacent_squares:
            if adjacent not in been_there:
                turtle.goto(adjacent)
                been_there.append(adjacent)
                screen.ontimer(move, 1000)  # one second per move, adjust as needed
                break
    
    screen = Screen()  # recast the screen into MAP coordinates
    screen.setup(WIDTH * STAMP_SIZE * SCALE, HEIGHT * STAMP_SIZE * SCALE)
    screen.setworldcoordinates(-0.5, -0.5, WIDTH - 0.5, HEIGHT - 0.5)
    
    turtle = Turtle('square', visible=False)
    turtle.shapesize(SCALE)
    turtle.speed('fastest')
    turtle.penup()
    
    for y, row in enumerate(MAP_ARRAY):  # draw the MAP
        for x, character in enumerate(row):
            if character == 'X':
                turtle.goto(x, y)
                turtle.stamp()
    
    turtle.color('red')
    turtle.shapesize(SCALE / 2)
    turtle.goto(1, 0)  # should use unique character in MAP to indicate start & end points
    turtle.showturtle()
    
    been_there = []  # prevent doubling back
    
    move()
    
    screen.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多