""" 本程序返回折线的拐点.py 这是研究在python turtle中实现bloodfill算法的一个副产品。 作者:李兴球,2022/12/3号 """ import random import turtle def draw_segments(points): turtle.penup() turtle.goto(points[0]) turtle.pendown() [turtle.goto(dot) for dot in points[1:] ] turtle.penup() def twopointoneline(p1,p2): """两点一线函数, p1,p2表示坐标点,用二元组表示,本函数根据两点返回一元一次方程一般式的A,B,C,k,b""" x1,y1 = p1 x2,y2 = p2 dx = x1 - x2 if dx==0: k = b = float('inf') else: k = (y1-y2)/dx b = (x1*y2-x2*y1)/dx A = y2 - y1 B = dx C = (x2*y1-x1*y2) return A,B,C,k,b twopaline = twopointoneline # 两点一线的别名 twodotaline = twopointoneline def point_is_on_line(point,line): """判断点是否在直线上,point:二元组表示的点,line:两个点表示的直线""" P,Q = line A,B,C,k,b = twopointoneline(P,Q) # 直线方程标准式,k斜率,b截距 #print("A,B,C,k,b",A,B,C,k,b) x,y = point #print("x y = ",x,y) return abs(A*x + B*y + C)<0.00000001 # 符合直线标准方程则返回真,否则假 dot_is_on_line = point_is_on_line def point_is_on_segment(point,segment): """判断点是否在线段上, point:二元组表示的点,segment:两个点表示的线段,如((10,10),(20,20))或[(0,0),(100,100)]""" P,Q = segment x,y = point if point_is_on_line(point,segment): # 如果在直线上,进一步判断是否在线段上 x1 = P[0];x2 = Q[0] # 线段1的两个x坐标 if x1>x2:x1,x2 = x2,x1 # 如果x1比x2大,则交换x1和x2的值 if x>x2 or xy2:y1,y2 = y2,y1 # 如果y1比y2大,则交换y1和y2的值 if y>y2 or y
李兴球
李兴球的博客是Python创意编程原创博客
要发表评论,您必须先登录。
发表评论