de Castelijau算法的python实现

Beizer曲线的阶数

在不考虑分段的情况下,给定n个初始控制点,Beizer曲线的阶数是n-1

de Castelijau算法的关键

关键在于初始控制点和下一级控制点的递推公式

P i k ( t ) = ( 1 − t ) P i k − 1 ( t ) + t P i + 1 k − 1 ( t ) P_{i}^{k}(t) = (1-t)P_{i}^{k-1}(t)+tP_{i+1}^{k-1}(t) Pik(t)=(1t)Pik1(t)+tPi+1k1(t)

注意 i i i k k k的取值范围

python代码

代码输出给定点的Beizer曲线的参数方程,并画出每一级控制多边形。

第一次用python写科学计算,欢迎交流。

import numpy as np
import matplotlib.pyplot as plt
import sympy as sym

###########确定Beizer曲线的次数,de Castelijau算法的参数,n+1个点i=0-n
t = eval(input("请输入平面Beizer曲线de castelijau算法的参数t:"))
###########给出初始控制点,并用数组储存
def cmul(*b):
    count = []
    for i in [*b]:
        count.append(i)
    return count
p = eval("cmul({})".format(input("请按照格式[x,y]输入初始控制顶点P并用逗号隔开:")))
p0 = np.array(p).T
p0 = p0.tolist()
#############给出顶点所确定的曲线的次数
n = len(p)-1
############都是列表类型的
x = p0[0]
y = p0[1]


###########计算阶乘
def jc(n):
    if n ==1 or n ==0:
        return 1
    else:
        return jc(n-1)*n
###########Berstein基函数列
u =sym.symbols('u') #定义符号变量x,即算法的t
def Bernstein(n,u):
    list = []
    for i in range(n+1):
        list.append(jc(n)*(u**i)*((1-u)**(n-i))/(jc(i)*jc(n-i)))
    return list
###########输出参数方程
sumx = 0
sumy = 0

for i in range(len(x)):
    sumx=sumx+(x[i]*Bernstein(n,u)[i])
    sumy=sumy+(y[i]*Bernstein(n,u)[i])

s=(sumx.evalf(subs = {u:0.4}),sumy.evalf(subs = {u:0.4}))
sum = [sumx,sumy]
print("曲线的参数方程为:p(u)={}".format(sum))
print("参数方程求得曲线上一点 p({})为{}".format(t,s))


################下一级控制顶点坐标函数
def nextpoint(p):
    d = len(p)#当前级控制顶点个数
    q = []#把下一级的储存在空列表中
    for i in range(d-1):#下一次控制顶点要减一
        q.append((1-t)*p[i] + t*p[i+1])
    return q

#输出每一级控制顶点坐标
a=[]
b=[]
a.append(x)
b.append(y)
while len(x)>1:
    x = nextpoint(x)
    y = nextpoint(y)
    a.append(x)
    b.append(y)
print("每一级控制顶点的横坐标依次为:{}".format(a))
print("每一级控制顶点的纵坐标依次为:{}".format(b))
print("de Castelijau求得曲线上一点 p({})为({},{})".format(t,a[n][0],b[n][0]))

################绘制曲线和控制多边形
def plot():
    c = []
    z = []
    for j in range(0,10000,1):
        j=j/10000
        c.append(sumx.evalf(subs = {u:j}))
        z.append(sumy.evalf(subs = {u:j}))
    plt.plot(c,z,'.',markersize=0.5)
    
    for k in range(n+1):
        x= np.array(a[k])
        y =np.array(b[k])
        plt.plot(x,y)
        plt.plot(x, y, '*')
plot()

结果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DES(Data Encryption Standard)是一种对称加密算法,使用Python可以实现DES算法实现DES算法需要使用Python的加密库,如pycryptodome或cryptography。这里以pycryptodome库为例进行讲解。 首先,需要安装pycryptodome库。可以使用pip install pycryptodome命令进行安装。 接下来,通过导入所需的库进行DES算法实现。 ```python from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes ``` 接下来,定义一个DES函数,用于进行加密和解密。 ```python def des_encrypt(key, plaintext): cipher = DES.new(key, DES.MODE_ECB) padded_plaintext = pad(plaintext, DES.block_size) ciphertext = cipher.encrypt(padded_plaintext) return ciphertext def des_decrypt(key, ciphertext): cipher = DES.new(key, DES.MODE_ECB) plaintext = cipher.decrypt(ciphertext) unpadded_plaintext = unpad(plaintext, DES.block_size) return unpadded_plaintext ``` 在上述代码中,`des_encrypt`函数接收两个参数:密钥(key)和明文(plaintext),使用ECB模式进行加密,并返回密文(ciphertext)。 `des_decrypt`函数接收两个参数:密钥(key)和密文(ciphertext),同样使用ECB模式进行解密,并返回明文(plaintext)。 需要注意的是,DES算法要求密钥长度为8字节(64位),所以在调用这两个函数时,需要保证密钥的长度为8字节。 最后,可以调用上述函数进行加密和解密的操作: ```python key = get_random_bytes(8) # 生成随机密钥 plaintext = "Hello, world!" ciphertext = des_encrypt(key, plaintext) decrypted_plaintext = des_decrypt(key, ciphertext) print("密钥:", key) print("明文:", plaintext) print("密文:", ciphertext) print("解密后的明文:", decrypted_plaintext) ``` 以上代码生成一个随机密钥,加密明文,并将生成的密文和解密后的明文输出。 需要注意的是,DES算法已经被认为不够安全,推荐使用更加安全的算法,如AES等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值