Функция рисования в Pygame - детализация пикселей - PullRequest
0 голосов
/ 22 июня 2019
  1. Как определения геометрии Rects в Pygame (слева, справа, сверху, снизу, ширине, высоте) работают с точки зрения рисования пикселей на экране?

  2. Как ширина влияет на pygame.draw.rect ()

1 Ответ

0 голосов
/ 22 июня 2019

С кодом ниже вы можете использовать pygame.draw и анализировать результат попиксельно.Поэтому вы рисуете на небольшой поверхности, которая масштабируется, а затем перетаскивается на экран.

Вопрос 1:

Rect определяется своими координатами left, top и его измерениями width, length,При использовании pygame.draw.rect (Surface, color, Rect, width = 0) верхний левый пиксель чертежа будет иметь координаты (левый, верхний).Количество пикселей в направлении ширины чертежа равно ширине прямоугольника, поэтому координата ширины последнего пикселя равна (слева + ширина - 1).То же самое относится и к высоте.Следовательно, координата нижнего правого пикселя (слева + ширина - 1, сверху + высота - 1)

TLDR:

  • Rect.left возвращает координату xлевый столбец пикселей нарисованного прямоугольника
  • Rect.top возвращает координату y верхней строки пикселей нарисованного прямоугольника
  • Rect.right возвращает координату x столбца пикселей следующимсправа от нарисованного прямоугольника
  • Rect.bottom возвращает координату x строки пикселей, следующей под нарисованным прямоугольником
#draw onto the small surface here

    #=================================================
    rect = pg.Rect(6, 6, 6, 6)
    pg.draw.rect(surface_small, orange, rect, 0)

    rect = pg.Rect(18, 6, 7, 7)
    pg.draw.rect(surface_small, orange, rect, 0)
    #=================================================

Пример изображения прямоугольника

Вопрос 2:

Ширина нарисованного прямоугольника определяет ширину нарисованной линии.Ширина 1 (пиксель) приводит к линиям, которые точно соответствуют контуру того же прямоугольника, нарисованного с шириной = 0 (закрашенный прямоугольник).Ширина> 1 делает эти линии толще.Нарисованный прямоугольник становится больше исходного прямоугольника, и появляется «недостающий угол».

Неравномерная ширина:


    #draw onto the small surface here
    #=================================================
    rect = pg.Rect(6, 6, 12, 12)

    pg.draw.rect(surface_small, orange, rect, 5)
    pg.draw.rect(surface_small, black, rect, 1)
    #=================================================

Пример неравномерной ширины

Четная ширина:


    #draw onto the small surface here
    #=================================================
    rect = pg.Rect(6, 6, 12, 12)

    pg.draw.rect(surface_small, orange, rect,4 )
    pg.draw.rect(surface_small, black, rect, 1)
    #=================================================

Пример четной ширины

Полный код:


    import sys, pygame as pg

    pg.init()
    SCREEN = pg.display.set_mode((800, 600))
    pg.display.set_caption('getRect.squareHead')
    CLOCK  = pg.time.Clock()

    white =     (255,   255,    255 )
    black =     (0,     0,      0   )
    grey_light =(200,   200,    200 )
    grey_dark = (127,   127,    127 )

    orange =    (255,   96,     0   )

    #fill a surface pixel by pixel with alternating colours
    def fill_alternating (surface, width, height):
        counter = None

        for i in range(width):

            if i%2 == 0: counter = False
            else: counter = True

            for j in range(height):
                if counter: colour = white
                else: colour = grey_light
                if i%6 == 0 and j%6 == 0: colour = grey_dark
                pg.draw.circle(surface, colour, (i,j), 0, 0)
                counter = not counter            

    #big surface to blit onto the screen
    width_main, height_main = 700, 500
    surface_main = pg.Surface((width_main, height_main))
    surface_main.fill(orange)
    rect_main = surface_main.get_rect(center = (399, 299))

    #small surface to enlarge onto the big surface
    scale = 20
    width_small, height_small = int(width_main/scale), int(height_main/scale)
    surface_small = pg.Surface((width_small, height_small))
    surface_small.fill(white)
    fill_alternating(surface_small, width_small, height_small)

    #draw onto the small surface here
    #=================================================



    #=================================================

    #scale the small surface onto the main surface
    pg.transform.scale(surface_small, (width_main, height_main), surface_main)

    SCREEN.fill((255, 255, 255))

    #blit main surface onto the screen
    SCREEN.blit(surface_main, (rect_main.x, rect_main.y))

    pg.display.update()

    while True:
        for event in pg.event.get():
            if event.type == QUIT:
                pg.quit()
                sys.exit()
        CLOCK.tick(30)

...