本程序返回折线的拐点.py

本程序返回折线的拐点.py

"""
  本程序返回折线的拐点.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创意编程原创博客