栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python】四点插值细分法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python】四点插值细分法

1. 数学原理

知识来源:Nira DYN, David LEVJN:A 4-point interpolatory subdivision scheme for curve design 论文

  • 最左边的 p − 1 = p n , p − 2 = p n − 1 p_{-1} = p_n,p_{-2} = p_{n-1} p−1​=pn​,p−2​=pn−1​可以在代码中使用列表的倒序下标 p − 1 p_{-1} p−1​ = p[-1], p − 2 p_{-2} p−2​=p[-2];
  • 最右边的 p n + 1 = p 0 , p n + 2 = p 1 p_{n+1} = p_0,p_{n+2}=p_1 pn+1​=p0​,pn+2​=p1​可以在代码中对超出n的记为m-n;
  • 故每个点列都需要增加3个末端点;
  • 注意再添加控制点的时候需要输入float浮点数数据类型,int整数数据类型可能会产生计算错误,详情可见最后一张图。
2. python程序
# 导入相关包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import xticks,yticks
import math
import random

plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
x = [-0.5,1,3,5,4,5,3,1,-0.5,0,-0.5]
y = [2,1,2.4,1,0,-1,-2.4,-1,-2,0,2]
def point_cp(points,w):  # points 包含了连续的四个点,且下标取i时,连续的四个点为i-1, i, i+1, i+2
    p = (1/2+w)*(points[1]+points[2])-w*(points[0]+points[3])
    return p

def add_points(P,w):
    n = len(P)
    for k in range(10):
        n = len(P)
        p_new = []  # 存储新增节点
        for i in range(n):
            if i==n-2:
                points = []
                for j in range(3):
                    points.append(P[i+j-1])
                points.append(P[0])
                p = point_cp(points,w)
                p_new.append(p)
            elif i==n-1:
                points = []
                for j in range(2):
                    points.append(P[i+j-1])
                points.append(P[0])
                points.append(P[1])
                p = point_cp(points,w)
                p_new.append(p)
            else:
                points = []
                for j in range(4):
                    points.append(P[i+j-1])
                p = point_cp(points,w)
                p_new.append(p)
        for m in range(n,0,-1):
            P = np.insert(P,m,p_new[m-1])
        
    return P
x = [-0.5,1,3,5,4,5,3,1,-0.5,0]
y = [2,1,2.4,1,0,-1,-2.4,-1,-2,0]
P_x = [-0.5,1,3,5,4,5,3,1,-0.5,0]
P_y = [2,1,2.4,1,0,-1,-2.4,-1,-2,0]
Px = add_points(P_x,1/16)
Py = add_points(P_y,1/16)

x = [0,3.0,6.0,6.0,4.0,4.0,3.0,2.0,2.0,0.0,0]
y = [1,1.4,1,0,0,0.3,0.5,0.3,0,0,1]
P_x = [0,3.0,6.0,6.0,4.0,4.0,3.0,2.0,2.0,0.0]
P_y = [1,1.4,1,0,0,0.3,0.5,0.3,0,0]
# x = [-0.5,1,3,5,4,5,3,1,-0.5,0]
# y = [2,1,2.4,1,0,-1,-2.4,-1,-2,0]
fig = plt.figure()
plt.plot(x,y,'-.')
plt.plot(Px,Py)


2.1 整型数据图像会出错,原因是python中的整数计算可能不产生浮点型数据,返回值仍为整型。
x = [0,3.0,6.0,6.0,4.0,4.0,3.0,2.0,2.0,0.0,0]
y = [1,1.4,1,0,0,0.3,0.5,0.3,0,0,1]
# P_x = [0,3.0,6.0,6.0,4.0,4.0,3.0,2.0,2.0,0.0]
P_x = [0,3,6,6,4,4,3,2,2,0]
P_y = [1,1.4,1,0,0,0.3,0.5,0.3,0,0]

Px = add_points(P_x,1/15)
Py = add_points(P_y,1/15)
fig = plt.figure()
plt.plot(x,y,'-.')
plt.plot(Px,Py)
plt.show()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/958336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号