"""
本程序返回折线的拐点.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