資源簡介
貝塞爾曲線擬合多邊形,本來以為是很標準的算法,必然有Python的現成庫存在,但搜了幾天下來,竟然沒有一個。
csdn上有一個版本,是基于某篇文章修改的python版本,但算法有錯。
該文章的地址在此:https://blog.csdn.net/sky_pjf/article/details/52816750
我下載了此版本,并做了修改,現在上傳的是正確的版本。
控制點的選取和實現思路,都是從該文章來的。
效果還比較好,希望對大家有幫助。
代碼片段和文件信息
import?numpy?as?np
import?pylab?as?pl
import?math
from?functools?import?reduce
scale?=?0.5??#控制點收縮系數
midpoints?=?[]?#存放中點坐標
semipoints?=?[]
extrapoints?=?[]?#存放控制點
controlPoint?=?[]?#存放產生貝塞爾曲線的4個控制點
point?=?[]?#存放貝塞爾曲線上的點
nn?=?3?#三次貝塞爾曲線
hand?=?np.array([[1.64516129?1.16145833]
?????????????????[1.64516129?1.59375]
?????????????????[1.35080645?1.921875]
?????????????????[1.375?2.18229167]
?????????????????[1.68548387?1.9375]
?????????????????[1.60887097?2.55208333]
?????????????????[1.68548387?2.69791667]
?????????????????[1.76209677?2.56770833]
?????????????????[1.83064516?1.97395833]
?????????????????[1.89516129?2.75]
?????????????????[1.9516129?2.84895833]
?????????????????[2.01209677?2.76041667]
?????????????????[1.99193548?1.99479167]
?????????????????[2.11290323?2.63020833]
?????????????????[2.2016129?2.734375]
?????????????????[2.25403226?2.60416667]
?????????????????[2.14919355?1.953125]
?????????????????[2.30645161?2.36979167]
?????????????????[2.39112903?2.36979167]
?????????????????[2.41532258?2.1875]
?????????????????[2.1733871?1.703125]
?????????????????[2.07782258?1.16666667]])
#f?=?open(“xy.txt“)
def?getOriginPoint():
????global?f
????line=f.readline()
????while?line:
????????list?=?line.split(“?“)
????????list1?=?[]
????????for?i?in?range(len(list)):
????????????list1.append(float(list[i]))
????????originPoint.append(list1)
????????line=f.readline()
????return?originPoint
def?getOriginPoint2():
????for?a?in?hand:
????????la=?list(a)
????????#?originPoint.append(la)
????#?originPoint=?np.rot90(hand1)
????originPoint=?hand
????#return?originPoint
def?getControlPoint():
????originPoint?=?hand
????originCount?=?len(originPoint)
????print(originCount)
##????originPoint.sort(key?=?lambda?x:x[0])
##????controlPoint.append(originPoint[0])
##????keyPoint=[]
##????originPoint.sort(key?=?lambda?x:x[1]reverse=TRUE)
##????keyPoint.append(originPoint[0])
????
????#---------生成中點---------------
????for?i?in?range(0originCount):
????????nexti?=?(i?+?1)?%?originCount
????????templist?=?[]
????????templist.append((originPoint[i][0]?+?originPoint[nexti][0])/2.0)
????????templist.append((originPoint[i][1]?+?originPoint[nexti][1])/2.0)
????????midpoints.append(templist)
????print(len(midpoints))
????#?print(midpoints)
????#---------平移中點---------------
????for?i?in?range(0originCount):
????????#?print(i)
????????nexti?=?(i?+?1)?%?originCount
????????backi?=?(i+?originCount?-?1)?%?originCount
????????ln1=?math.sqrt((originPoint[i][0]?-?originPoint[nexti][0])**2?+?(originPoint[i][1]?-?originPoint[nexti][1])**2)
????????ln2=?math.sqrt((originPoint[backi][0]?-?originPoint[i][0])**2?+?(originPoint[backi][1]?-?originPoint[i][1])**2)
????????t1=?(ln1+?ln2)/?ln1
????????#?print(t1)
????????midinmid?=?[]?#存放中點的中點
????????x1=?midpoints[i][0]?-?(midpoints[i][0]?-?midpoints[nexti][0])/t1
????????y1=?midpoints[i][1]?-?(midpoi
評論
共有 條評論