Форум сайта python.su
Имеется такой вот код:
def draw_pixel(position): global SIZE global COLOR SCREEN.fill(COLOR, (position, SIZE)) while True: # main loop pos = pygame.mouse.get_pos() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == MOUSEBUTTONDOWN: FLAG = True if event.type == MOUSEBUTTONUP: FLAG = False if FLAG: draw_pixel(pos) change_brush_size_button.draw_button() pygame.display.update()
Отредактировано philimonix (Июль 16, 2017 13:57:25)
Офлайн
Проще всего вести линию от предыдущей точки.
Офлайн
ShamanДа, так действительно проще. Но пока я не уверен, что в моём случае это будет правильным решением. В конечном итоге это должно стать редактором пиксельной графики. Думаю, тут мне всё равно придётся иметь массив пикселей для каждого слоя. И тогда возникает вопрос: каждый проход основного цикла проверять попиксельно всю поверхность на предмет изменений, внесённых функцией отрисовки линии? Или всё же как-то сделать плавным процесс рисования отдельними пикселями с занесением каждого из них в массив сразу же после отрисовки? У меня изначально была именно такая задумка, но я упёрся в то, что рисование получается не плавным.
Проще всего вести линию от предыдущей точки.
Офлайн
Более правильным решением может быть только отрисовка кривых.
Офлайн
ShamanНе понял, о чём Вы.
Более правильным решением может быть только отрисовка кривых.
Офлайн
Короче, решение нашёл сам. Может, это топорно и велосипедно, но работает так, как мне было нужно изначально. Нагуглил алгоритм рисования линии, перепилил его на Python. Теперь я рисую линиями, но имею контроль над отрисовкой каждого отдельного пикселя. Алгоритм называется “Алгоритм Брезенхэма”, если кому будет интересно или нужно.
def draw_line(x1, y1, x2, y2): delta_x = abs(x2 - x1) delta_y = abs(y2 - y1) if x1 < x2: sign_x = 1 else: sign_x = -1 if y1 < y2: sign_y = 1 else: sign_y = -1 error = delta_x - delta_y draw_pixel([x2, y2]) while (x1 != x2 or y1 != y2): draw_pixel([x1, y1]) error_2 = error * 2 if error_2 > -delta_y: error -= delta_y x1 += sign_x if error_2 < delta_x: error += delta_x y1 += sign_y
while True: # main loop pos = pygame.mouse.get_pos() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == MOUSEBUTTONDOWN: flag = True if event.type == MOUSEBUTTONUP: flag = False if flag: new_pos = pygame.mouse.get_pos() draw_line(pos[0], pos[1], new_pos[0], new_pos[1]) pygame.display.flip()
Отредактировано philimonix (Июль 18, 2017 07:13:01)
Офлайн
philimonix
FLAG = True
Офлайн
FishHookДа в питоне вроде как нету констант же
Если FLAG - константа, то она не должна изменяться, если не константа, то не называйте её как константу
Офлайн
philimonixВот именно поэтому в том числе и придумывают соглашения об именованиях и прочую стилистику, чтобы компенсировать скудность инструментария
Да в питоне вроде как нету констант же
Офлайн