博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bezier曲线
阅读量:5905 次
发布时间:2019-06-19

本文共 3805 字,大约阅读时间需要 12 分钟。

一。实现Bezier曲线的升阶,降阶和拖动。

#!/usr/bin/env python# -*- coding: utf-8 -*-'My Bezier'import numpy as npfrom scipy.special import comb, permfrom matplotlib import pyplot as pltclass MyBezier:    def __init__(self, line):        self.line = line        self.index_02 = None #保存拖动的这个点的索引        self.press = None # 状态标识,1为按下,None为没按下        self.pick = None # 状态标识,1为选中点并按下,None为没选中        self.motion = None #状态标识,1为进入拖动,None为不拖动        self.xs = list() # 保存点的x坐标        self.ys = list() # 保存点的y坐标        self.cidpress = line.figure.canvas.mpl_connect('button_press_event', self.on_press) # 鼠标按下事件        self.cidrelease = line.figure.canvas.mpl_connect('button_release_event', self.on_release) # 鼠标放开事件        self.cidmotion = line.figure.canvas.mpl_connect('motion_notify_event', self.on_motion) # 鼠标拖动事件        self.cidpick = line.figure.canvas.mpl_connect('pick_event', self.on_picker) # 鼠标选中事件    def on_press(self, event): # 鼠标按下调用        if event.inaxes!=self.line.axes: return        self.press = 1            def on_motion(self, event): # 鼠标拖动调用        if event.inaxes!=self.line.axes: return        if self.press is None: return        if self.pick is None: return        if self.motion is None: # 整个if获取鼠标选中的点是哪个点            self.motion = 1            x = self.xs            xdata = event.xdata            ydata = event.ydata            index_01 = 0            for i in x:                if abs(i - xdata) < 0.02: # 0.02 为点的半径                    if abs(self.ys[index_01] - ydata) < 0.02:break                index_01 = index_01 + 1            self.index_02 = index_01        if self.index_02 is None: return        self.xs[self.index_02] = event.xdata # 鼠标的坐标覆盖选中的点的坐标        self.ys[self.index_02] = event.ydata        self.draw_01()    def on_release(self, event): # 鼠标按下调用        if event.inaxes!=self.line.axes: return        if self.pick == None: # 如果不是选中点,那就添加点            self.xs.append(event.xdata)            self.ys.append(event.ydata)        if self.pick == 1 and self.motion != 1: # 如果是选中点,但不是拖动点,那就降阶            x = self.xs            xdata = event.xdata            ydata = event.ydata            index_01 = 0            for i in x:                if abs(i - xdata) < 0.02:                    if abs(self.ys[index_01] - ydata) < 0.02:break                index_01 = index_01 + 1            self.xs.pop(index_01)            self.ys.pop(index_01)        self.draw_01()        self.pick = None # 所有状态恢复,鼠标按下到稀放为一个周期        self.motion = None        self.press = None        self.index_02 = None    def on_picker(self, event): # 选中调用        self.pick = 1    def draw_01(self): # 绘图        self.line.clear() # 不清除的话会保留原有的图        self.line.axis([0,1,0,1]) # x和y范围0到1        self.bezier(self.xs,self.ys) # Bezier曲线        self.line.scatter(self.xs, self.ys,color='b',s=200, marker="o",picker=5) # 画点        self.line.plot(self.xs, self.ys,color='r') # 画线        self.line.figure.canvas.draw() # 重构子图    def bezier(self,*args): # Bezier曲线公式转换,获取x和y        t=np.linspace(0,1) # t 范围0到1        le = len(args[0]) - 1        le_1 = 0        b_x,b_y = 0,0        for x in args[0]:            b_x = b_x + x*(t**le_1)*((1-t)**le)*comb(len(args[0]) - 1,le_1) # comb 组合,perm 排列            le = le - 1            le_1 = le_1 + 1        le = len(args[0]) - 1        le_1 = 0        for y in args[1]:            b_y = b_y + y*(t**le_1)*((1-t)**le)*comb(len(args[0]) - 1,le_1)            le = le - 1            le_1 = le_1 + 1        self.line.plot(b_x,b_y)fig = plt.figure(2,figsize=(12,6)) #创建第2个绘图对象,1200*600像素ax = fig.add_subplot(111) #一行一列第一个子图ax.set_title('My Bezier')myBezier = MyBezier(ax)plt.xlabel('X')plt.ylabel('Y')plt.show()

二。运行结果

 

 

三。参考

http://blog.csdn.net/joogle/article/details/7975118

http://blog.csdn.net/wizardforcel/article/details/54782688

转载于:https://www.cnblogs.com/GH-123/p/7898774.html

你可能感兴趣的文章
Firewall之iptables篇
查看>>
sed 语法
查看>>
bash编程之:case语句、read与用户交互
查看>>
RHEL6入门系列之二十二,quota磁盘配额管理
查看>>
费用登记系统(小结)
查看>>
Windows Group Policy Startup script is not executed at startup
查看>>
智能指针
查看>>
AIX修改用户密码登录不成功案例分享
查看>>
【Java例题】7.3 线程题3-素数线程
查看>>
openstack组件使用的默认端口
查看>>
c语言简单版坦克大战(AllenEnemyTrank文件)
查看>>
Java私塾: 研磨设计之备忘录模式(Memento)
查看>>
理解call和apply方法
查看>>
异步加载(延迟加载)与同步加载
查看>>
机器学习瓶颈 - 从黑盒白盒之争说起
查看>>
小程序图片上传七牛
查看>>
java交换两个变量值a,b的多钟方法
查看>>
Python中被双下划线包围的魔法方法
查看>>
JAVA核心编程教学
查看>>
Oracle:数据类型对应表
查看>>