2024-04-19 09:35:13 发布
网友
我试图使用pygame.draw.line(tela, (255, 255, 255), self.a, self.b, width=1)设置绘制线的透明度,其中:
pygame.draw.line(tela, (255, 255, 255), self.a, self.b, width=1)
tela
(255, 255, 255)
self.a
self.b
width
有没有一种简单直接的方法?有没有一个概念上的论点阻止我们轻易地去做?每件事都必须有一个复杂的答案吗
下面是@Yannis Assael的answer对我提到的他自己的问题Pygame draw anti-aliased thick line的改编。我已经转换成一个名为aaline()的函数,并对代码进行了优化,以使其更高效、更可读
aaline()
该函数被定义为具有一个调用序列,类似于现有的名为^{}的调用序列,用于绘制单像素宽的线,使得从on切换到另一个稍微容易一些
from math import atan2, cos, hypot, sin import pygame import pygame.gfxdraw from pygame.locals import * import sys def aaline(surface, color, start_pos, end_pos, width=1): """ Draws wide transparent anti-aliased lines. """ # ref https://stackoverflow.com/a/30599392/355230 x0, y0 = start_pos x1, y1 = end_pos midpnt_x, midpnt_y = (x0+x1)/2, (y0+y1)/2 # Center of line segment. length = hypot(x1-x0, y1-y0) angle = atan2(y0-y1, x0-x1) # Slope of line. width2, length2 = width/2, length/2 sin_ang, cos_ang = sin(angle), cos(angle) width2_sin_ang = width2*sin_ang width2_cos_ang = width2*cos_ang length2_sin_ang = length2*sin_ang length2_cos_ang = length2*cos_ang # Calculate box ends. ul = (midpnt_x + length2_cos_ang - width2_sin_ang, midpnt_y + width2_cos_ang + length2_sin_ang) ur = (midpnt_x - length2_cos_ang - width2_sin_ang, midpnt_y + width2_cos_ang - length2_sin_ang) bl = (midpnt_x + length2_cos_ang + width2_sin_ang, midpnt_y - width2_cos_ang + length2_sin_ang) br = (midpnt_x - length2_cos_ang + width2_sin_ang, midpnt_y - width2_cos_ang - length2_sin_ang) pygame.gfxdraw.aapolygon(surface, (ul, ur, br, bl), color) pygame.gfxdraw.filled_polygon(surface, (ul, ur, br, bl), color) if __name__ == '__main__': # Define some colors. BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) AQUA = (0, 255, 255) ORANGE = (255, 165, 0) YELLOW = (255, 255, 0) # Window size. WIDTH, HEIGHT = 800, 600 # Set up pygame. pygame.init() # Set up window for display. window = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32) pygame.display.set_caption('Wide Transparent Lines') # Set background color of window. window.fill(BLACK) a = (0, 0) b = (WIDTH, HEIGHT) LINE_COLOR = ORANGE fw = 255 / (WIDTH-1) fh = 255 / (HEIGHT-1) width = 3 # Draw an opaque diagonal line then those on either side with # ever-increasing transparency. color = LINE_COLOR + (255,) # Add transparency to color. aaline(window, color, (0, 0), (WIDTH, HEIGHT), width) for x in range(0, WIDTH, 25): color = LINE_COLOR + (int(fw*x),) # Add transparency to color. aaline(window, color, (0, 0), (x, HEIGHT), width) for y in range(0, HEIGHT, 25): color = LINE_COLOR + (int(fh*y),) # Add transparency to color. aaline(window, color, (0, 0), (WIDTH, y), width) # Copy window to screen. pygame.display.update() # Run the game loop. while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit()
出于测试和演示的目的,最后有一个驱动程序在一些循环中调用它。下面是显示内容的屏幕截图。当线条的一个端点越来越远离矩形的中心对角线时,线条逐渐变得更加透明
下面是@Yannis Assael的answer对我提到的他自己的问题Pygame draw anti-aliased thick line的改编。我已经转换成一个名为
aaline()
的函数,并对代码进行了优化,以使其更高效、更可读该函数被定义为具有一个调用序列,类似于现有的名为^{} 的调用序列,用于绘制单像素宽的线,使得从on切换到另一个稍微容易一些
出于测试和演示的目的,最后有一个驱动程序在一些循环中调用它。下面是显示内容的屏幕截图。当线条的一个端点越来越远离矩形的中心对角线时,线条逐渐变得更加透明
相关问题 更多 >
编程相关推荐