С кодом ниже вы можете использовать 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)