资源简介

贝塞尔曲线拟合多边形,本来以为是很标准的算法,必然有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

评论

共有 条评论