微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用pygame绘制虚线曲线?

如何解决如何用pygame绘制虚线曲线?

我需要在与 this 图片完全相同的坐标系上绘制正弦波和余弦波。除了我没有用 pygame 表示虚线和曲线之外,我把所有的工作都做得很好。我有一些类似于我需要的东西,但我怎样才能让它弯曲?或者我如何改进它以使其像 pygame.draw.lines,而不是 pygame.draw.line

alias mongod="/c/Program\ Files/MongoDB/server/4.4/bin/mongod.exe"
alias mongo="/c/Program\ Files/MongoDB/server/4.4/bin/mongo.exe"

解决方法

编写一个函数,其操作与 pygame.draw.line() 类似,但绘制一条虚线。该函数有一个额外的参数 prev_line_len,它指示线段在连续曲线内的位置。计算点之间的 Euclidean distance 和从线段起点指向其终点的 Unit vector。沿线分布笔画:

def draw_dashed_line(surf,color,p1,p2,prev_line_len,dash_length=8):
    dx,dy = p2[0]-p1[0],p2[1]-p1[1]
    if dx == 0 and dy == 0:
        return 
    dist = math.hypot(dx,dy)
    dx /= dist
    dy /= dist

    step = dash_length*2
    start = (int(prev_line_len) // step) * step
    end = (int(prev_line_len + dist) // step + 1) * step
    for i in range(start,end,dash_length*2):
        s = max(0,start - prev_line_len)
        e = min(start - prev_line_len + dash_length,dist)
        if s < e:
            ps = p1[0] + dx * s,p1[1] + dy * s 
            pe = p1[0] + dx * e,p1[1] + dy * e 
            pygame.draw.line(surf,pe,ps

编写另一个函数,其行为类似于 pygame.draw.lines(),但使用前一个函数 (draw_dashed_line) 绘制虚线曲线。计算曲线起点到每条线段起点的长度,并传递给函数:

def draw_dashed_lines(surf,points,dash_length=8):
    line_len = 0
    for i in range(1,len(points)):
        p1,p2 = points[i-1],points[i]
        dist = math.hypot(p2[0]-p1[0],p2[1]-p1[1])
        draw_dashed_line(surf,line_len,dash_length)
        line_len += dist

最小示例:

repl.it/@Rabbid76/DashedLine

import pygame
import math

def draw_dashed_line(surf,ps)

def draw_dashed_lines(surf,dash_length)
        line_len += dist

pygame.init()
screen = pygame.display.set_mode((400,300))
done = False

line = [(i,150 + math.sin(math.radians(i*2)) * 100) for i in range(400)]

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    draw_dashed_lines(screen,(255,255,255),line)
    pygame.display.flip()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。