Python 如果两点之间的距离小于指定值,则生成直线而不是贝塞尔曲线

Python 如果两点之间的距离小于指定值,则生成直线而不是贝塞尔曲线,python,math,pygame,line,bezier,Python,Math,Pygame,Line,Bezier,如果两点之间的距离小于我指定的像素量(即圆的大小),我想生成一条线 除了它不做我想做的,而是创建了不相连的奇怪线路 正如您所看到的,它并没有如您所希望的那样工作(不说是故意的,因为可能是我的代码出错导致了此问题),下面是我的代码rn: 导入pygame 从pygame导入gfxdraw 从随机导入randint 从win32api导入GetSystemMetrics 从时间导入时间 输入数学 类圆(pygame.sprite.sprite): 定义初始(自、表面、x、y、cs): pygame

如果两点之间的距离小于我指定的像素量(即圆的大小),我想生成一条线 除了它不做我想做的,而是创建了不相连的奇怪线路

正如您所看到的,它并没有如您所希望的那样工作(不说是故意的,因为可能是我的代码出错导致了此问题),下面是我的代码rn:

导入pygame
从pygame导入gfxdraw
从随机导入randint
从win32api导入GetSystemMetrics
从时间导入时间
输入数学
类圆(pygame.sprite.sprite):
定义初始(自、表面、x、y、cs):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“./assets/circle.png”).convert_alpha()
尺寸=(圆形(2.25*(109-(9*cs))),圆形(2.25*(109-(9*cs)))
self.image=pygame.transform.scale(self.image,size)
self.draw=surface.blit(self.image,(x-((大小[0])/2),y-((大小[1])/2)))
宽度=GetSystemMetrics(0)
高度=GetSystemMetrics(1)
def生成原始点坐标()
points.append([randint(0,宽度),randint(0,高度)])
def生成点坐标(计数、间距、圆大小):
对于范围内的i(0,计数):
生成=真
生成时:
x=点[0][0]+randint(-spating,spating)
y=点[0][1]+randint(-spacing,spacing)
如果y<高度-圆圈大小\u px和y>圆圈大小\u px和x<宽度-圆圈大小\u px和x>圆圈大小\u px:
生成=假
点。追加([x,y])
def生成_原始_和_p(计数、间距、圆大小_px):
生成原始点坐标()
生成点坐标(计数、间距、圆大小)
返回点
def绘制圆(曲面、x、y、r、rgb_代码):
gfxdraw.填充圆(曲面、x、y、r、rgb_代码)
运行=真
运行时:
开始=时间()
点数=[]
生成点=生成原始点和原始点(10800234)
大小=[宽度、高度]
screen=pygame.display.set_模式(大小,0,32)
屏幕填充((255255))
圆圈列表=[圆圈(屏幕,gen_点[i][0],gen_点[i][1],4)范围内的i(0,len(gen_点))]
#从列表中的点绘制贝塞尔曲线
对于范围内的i(2,len(gen_点)):
如果math.sqrt(math.pow(gen_points[i-1][0]-gen_points[i-2][0],2)+math.pow(gen_points[i-1][1]-gen_points[i-2][1],2))>234:
gfxdraw.line(屏幕,gen_points[i-2][0]、gen_points[i-2][1]、gen_points[i-1][1]、gen_points[i-1][1]、(0,0255))
[gfxdraw.bezier(屏幕,[gen_points[i-2],gen_points[i-1],gen_points[i]],4500,(255,0,0))用于范围(2,len(gen_points))]
#在这些曲线和直线上放置点
pygame.display.flip()
打印(gen_点数)
结束=时间()
打印(结束-开始)
i=输入(“退出:”)
pygame.display.quit()
如果i==“退出”:
运行=错误

我也尝试了math.hypo,但那给了我同样的结果,所以我缺乏想法

我的实现有几个问题,现在我已经全部修改了,现在应该可以工作了。这是我想要并制作的一个示例案例

如果两个非控制点距离<234:

其他:

正如您现在看到的,使用这段代码,我可能会以某种方式缩短和优化它

导入pygame
从pygame导入gfxdraw
从随机导入randint
从win32api导入GetSystemMetrics
从时间导入时间
输入数学
类圆(pygame.sprite.sprite):
定义初始(自、表面、x、y、cs):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“./assets/circle.png”).convert_alpha()
尺寸=(圆形(2.25*(109-(9*cs))),圆形(2.25*(109-(9*cs)))
self.image=pygame.transform.scale(self.image,size)
self.draw=surface.blit(self.image,(x-((大小[0])/2),y-((大小[1])/2)))
宽度=GetSystemMetrics(0)
高度=GetSystemMetrics(1)
def生成原始点坐标(圆大小):
生成=真
生成时:
x=randint(0,宽度)
y=randint(0,高度)
如果y<高度-圆圈大小\u px和y>圆圈大小\u px和x<宽度-圆圈大小\u px和x>圆圈大小\u px:
点。追加([x,y])
生成=假
def生成点坐标(计数、间距、圆大小):
对于范围内的i(0,计数-1):
生成=真
生成时:
x=点[-1][0]+randint(-spacation,spacation)
y=点[-1][1]+randint(-spating,spating)
如果y<高度-圆圈大小\u px和y>圆圈大小\u px和x<宽度-圆圈大小\u px和x>圆圈大小\u px:
生成=假
点。追加([x,y])
def生成_原始_和_p(计数、间距、圆大小_px):
生成原始点坐标(圆大小)
生成点坐标(计数、间距、圆大小)
返回点
def绘制圆(曲面、x、y、r、rgb_代码):
gfxdraw.填充圆(曲面、x、y、r、rgb_代码)
从时间上导入睡眠
prompt=True
提示时:
循环计数=输入(“计数:”)
如果圆_count.isdigit():
循环计数=整数(循环计数)
prompt=False
运行=真
运行时:
pygame.font.init()
font=pygame.font.SysFont('freesansbold.ttf',32)
text=font.render('NotBezier',True,(0,0255))
开始=时间()
点数=[]
生成点=生成原始点和点(圆计数,800234)
大小=[宽度、高度]
screen=pygame.display.set_模式(大小,0,32)
筛选填充((33,33,33))
#圆圈列表=[圆圈(屏幕,gen_点[i][0],gen_点[i][1],4)范围内的i(0,len(gen_点))]
圆圈\u列表=[]
#从列表中的点绘制贝塞尔曲线
跳过=0
对于范围内的i(0,len(gen_点)-2):
dist_s=math.sqrt(math.pow(gen_points[i+2][0]-gen_points[i][0],2)+math.pow(gen_points[i+2][1]-gen_points[i][1],2))
如果跳过: