首页 > 编程 > Python > 正文

python 解决凸包问题

2019-11-10 17:21:33
字体:
来源:转载
供稿:网友

           最近在看python的算法书,之前在年前买的书,一直在工作间隙的时候,学习充电,终于看到这本书,但是确实又有点难,感觉作者写的代码太炫技 了,有时候注释也不怎么能看懂,终于想到一个方法,就是里面说的算法问题,我就百度python解决他,觉得这个挺好。下面是凸包问题的一个代码。

    

# -*- coding: utf-8 -*-import turtleimport randomimport timef=open('point.txt','w')for i in range(100):    x=random.randrange(-250,250,10)    y=random.randrange(-200,200,10)    f.write(str(x)+','+str(y)+'/n')f.close()point=[]f=open('point.txt')for i in f:    try:        temp=i.split(',')        x=float(temp[0]); y=float(temp[1])        point.append((x,y))    except :        PRint 'a err'f.close()point=list(set(point))#去除重复的点n=0for i in range(len(point)):    if point[n][1]>point[i][1]:        n=ip0=point[n]point.pop(n)def compare(a,b):    x=[a[0]-p0[0],a[1]-p0[1]]    y=[b[0]-p0[0],b[1]-p0[1]]    dx=(x[0]**2+x[1]**2)**0.5    dy=(y[0]**2+y[1]**2)**0.5    cosa=x[0]/dx    cosb=y[0]/dy    if cosa < cosb:        return 1    elif cosa > cosb:        return -1    else:        if dx<dy:            return -1        elif dx>dy:            return 1        else:            return 0point.sort(compare)point.insert(0,p0)ep=point[:]#复制元素,操作ep不会对point产生影响tag=0while tag==0:    tag=1    l=len(ep)    for i in range(l):        i1,i2,i3=(i,(i+1)%l,(i+2)%l)        x,y,z=(ep[i1],ep[i2],ep[i3])        a1,a2=((y[0]-x[0],y[1]-x[1]),(z[0]-y[0],z[1]-y[1]))        if a1[0]*a2[1]-a1[1]*a2[0] < 0:            tag=0            ep.pop(i2)            break        elif a1[0]*a2[1]-a1[1]*a2[0]==0 and a1[0]*a2[0]<0:            #==0应改写,360度的情况            tag=0            ep.pop(i2)            breakdef drawpoint(point,color,line):    p=turtle.getturtle()    p.hideturtle()    turtle.delay(1)    if(line=='p'):        p.speed(0)        for i in point:            p.pu()            p.color(color)            p.goto(i)            p.pd()            p.dot()    elif(line=='l'):        p.pu()        p.speed(1)        for i in point:            p.color(color)            p.goto(i)            p.pd()            p.dot()        p.goto(point[0])drawpoint(point,'black','p')drawpoint(ep,'red','l')time.sleep(1)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表