Python Turtle как нарисовать маркер внутри ячейки в сетке 7x7 - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок в использовании графики Turtle в Python 3, и я не знаю, что делать. Одна из моих проблем заключается в том, что я понятия не имею, с чего начать с создания функции, которая будет рисовать маркер внутри ячейки сетки на основе набора данных под названием «путь», содержащего 3 переменные. Сама сеточная карта имеет размер 7x7 и всего 5 маркеров (от 0 до 4). Каждый маркер рисует свой собственный логотип в социальных сетях и полностью отличается друг от друга.

grid_cell_size = 100 # px
num_squares = 7 # this for creating the 7x7 grid map

# for clarification: path = ['Start', location, marker_value]

path = [['Start', 'Centre', 4], ['North', 2, 3], 
         ['East', 2, 2], ['South', 4, 1], ['West', 2, 0]]

Моя главная цель - иметь возможность рисовать все 5 маркеров одновременно в их собственных координатах местоположения, используя вышеуказанный набор данных. Я не уверен, как я должен подходить с назначением этих маркеров для их собственного marker_value. Будет ли для этого работать оператор if / elif / else?

Попытка реализовать 5 маркеров одновременно слишком сложна для меня, поэтому я попытался использовать этот очень простой набор данных под названием 'path_var_3', который будет рисовать только 1 маркер.

path_var_3 = [['Start', 'Bottom left', 3]]

def follow_path(path_selection):

  # Draws YouTube logo marker
  if 3 in path_var_3[0]:
    penup()
    # !!!
    goto(0, -32)
    setheading(90)

    # Variables
    youtube_red = '#ff0000'
    youtube_white = 'White'

    radius = 10
    diameter = radius * 2

    # Prep to draw the superellipse
    pencolor(youtube_red)
    fillcolor(youtube_red)

    # Drawing the superellipse
    begin_fill()
    pendown()

    for superellipse in range(2):
      circle(radius, 90)
      forward(80)
      circle(radius, 90)
      forward(60 - diameter)

    # Finish up
    end_fill()
    penup()

    # Move turtle position towards the centre of the superellipse
    # !!!
    goto(-59)
    backward(16)
    setheading(90)

    fillcolor(youtube_white)

    # Drawing the white 'play icon' triangle
    begin_fill()
    pendown()

    for play_triangle in range(2):
      right(120)
      forward(28)
      right(120)
      forward(28)

    # Finish up
    endfill()
    penup()
  else: return print('ERROR')

follow_path(path_var_3)

Пока мне удалось нарисовать маркер в программе, но я сразу же столкнулся с моей первой проблемой: я понял, что жестко закодировал координаты, где начнут рисовать суперэллипс и треугольник, как указано с '!!!' Комментарии. Поэтому, когда я запускаю программу, маркер рисуется вне ячейки сетки. Как получить маркер для рисования ВНУТРИ ячейки, независимо от того, где находится ячейка на карте сетки 7x7?

Если у кого-то есть идеи или они могут помочь, я буду очень признателен.

TL; DR

  1. Как нарисовать маркер, состоящий из различных фигур, внутри ячейки 100x100 на карте сетки 7x7?
  2. Как нарисовать маркер в любой ячейке на основе переменной местоположения из набора данных?
  3. Как мне подходить с назначением маркеров целым числам в диапазоне 0-4? Если / elif / else операторы?

1 Ответ

0 голосов
/ 06 сентября 2018

Код, который вы указали, не может быть запущен из-за того, что goto(-59) и endfill() не являются допустимыми вызовами функций. В целом в вашем коде отсутствует слой для организации проблемы, которую вы пытаетесь решить. (Например, вам нужно определить по коду, что означают «Слева внизу» или «Восток».) В малом, ваш логотип YouTube использует абсолютные координаты, а не относительные, предотвращая его отрисовку в любом месте.

Ниже приведена скелетная реализация того, что вы описываете. Он рисует сетку для целей отладки, чтобы показать, что логотипы оказались в правильных местах. Он заменяет цветные круги на все, кроме логотипа YouTube:

from turtle import Turtle, Screen

path = [('Start', 'Centre', 4), ('North', 2, 3), ('East', 2, 2), ('South', 4, 1), ('West', 2, 0)]

GRID_CELL_SIZE = 100  # pixels
NUMBER_SQUARES = 7  # this for creating the 7x7 grid map

ABSOLUTE_OFFSETS = {
    'Centre': (NUMBER_SQUARES // 2, NUMBER_SQUARES // 2),
    'Bottom left': (0, NUMBER_SQUARES - 1),
    # etc.
}

COMPASS_OFFSETS = {
    'North': (0, 1),
    'East': (1, 0),
    'South': (0, -1),
    'West': (-1, 0),
    'Start': (1, 1),  # Special case, assumes absolute offset
}

# YouTube Variables
YOUTUBE_RED = '#ff0000'
YOUTUBE_WHITE = 'White'
YOUTUBE_RADIUS = 10
YOUTUBE_WIDTH = 80
YOUTUBE_HEIGHT = 60
YOUTUBE_TRIANGLE_EDGE = 28

def draw_grid():  # for debugging
    grid = Turtle(visible=False)
    grid.speed('fastest')
    grid.dot()  # visualize origin
    grid.penup()
    grid.goto(-GRID_CELL_SIZE * NUMBER_SQUARES / 2, GRID_CELL_SIZE * (NUMBER_SQUARES / 2 - 1))

    for _ in range(NUMBER_SQUARES - 1):
        grid.pendown()
        grid.forward(NUMBER_SQUARES * GRID_CELL_SIZE)
        grid.penup()
        grid.goto(-GRID_CELL_SIZE * NUMBER_SQUARES / 2, grid.ycor() - GRID_CELL_SIZE)

    grid.goto(-GRID_CELL_SIZE * (NUMBER_SQUARES / 2 - 1), GRID_CELL_SIZE * NUMBER_SQUARES / 2)

    grid.setheading(270)

    for _ in range(NUMBER_SQUARES - 1):
        grid.pendown()
        grid.forward(NUMBER_SQUARES * GRID_CELL_SIZE)
        grid.penup()
        grid.goto(grid.xcor() + GRID_CELL_SIZE, GRID_CELL_SIZE * NUMBER_SQUARES / 2)

def follow_path(path_selection):

    turtle = Turtle(visible=False)

    x, y = ABSOLUTE_OFFSETS['Centre']  # relative to grid, not screen!

    for direction, offset, marker in path_selection:
        if direction in COMPASS_OFFSETS:
            dx, dy = COMPASS_OFFSETS[direction]

            if offset in ABSOLUTE_OFFSETS:
                x, y = ABSOLUTE_OFFSETS[offset]
            else:
                x += dx * offset
                y += dy * offset

            turtle.penup()
            # new virtual drawing origin, convert to screen coordinates
            turtle.goto((x - NUMBER_SQUARES // 2) * GRID_CELL_SIZE, (y - NUMBER_SQUARES // 2) * GRID_CELL_SIZE)
            MARKERS[marker](turtle)
            turtle.penup()

def YouTube(turtle):
    diameter = YOUTUBE_RADIUS * 2

    x, y = turtle.position()

    # Draws YouTube logo marker
    turtle.goto(x + YOUTUBE_WIDTH/2 + YOUTUBE_RADIUS, y + YOUTUBE_HEIGHT/2 - YOUTUBE_RADIUS)
    turtle.setheading(90)

    # Draw the rounded rectangle (should really be a superellipse)
    turtle.color(YOUTUBE_RED)

    turtle.begin_fill()

    for _ in range(2):
        turtle.circle(YOUTUBE_RADIUS, 90)
        turtle.forward(YOUTUBE_WIDTH)
        turtle.circle(YOUTUBE_RADIUS, 90)
        turtle.forward(YOUTUBE_HEIGHT - diameter)

    # Finish up
    turtle.end_fill()

    # Return turtle position towards the centre of the rounded rectangle
    turtle.goto(x - YOUTUBE_TRIANGLE_EDGE/4, y + YOUTUBE_TRIANGLE_EDGE/2)
    turtle.setheading(90)

    # Drawing the white 'play icon' triangle
    turtle.fillcolor(YOUTUBE_WHITE)

    turtle.begin_fill()

    for _ in range(2):
        turtle.right(120)
        turtle.forward(YOUTUBE_TRIANGLE_EDGE)

    # Finish up
    turtle.end_fill()

def RedDot(turtle):
    turtle.dot(GRID_CELL_SIZE / 2, 'Red')

def BlueDot(turtle):
    turtle.dot(GRID_CELL_SIZE / 2, 'Blue')

def GreenDot(turtle):
    turtle.dot(GRID_CELL_SIZE / 2, 'Green')

def OrangeDot(turtle):
    turtle.dot(GRID_CELL_SIZE / 2, 'Orange')

MARKERS = [RedDot, BlueDot, GreenDot, YouTube, OrangeDot]

screen = Screen()

draw_grid()  # for debugging

follow_path(path)

screen.mainloop()

enter image description here

...