精华内容
下载资源
问答
  • 高等数学常见曲线

    2011-12-07 08:21:31
    常见的高等数学曲线,包括阿基米德螺线、三叶玫瑰线、摆线等等,很详细哦
  • 不规则曲线则是根据给定的离散数据点用曲线拟合逼近得到,常见的有参数样条曲线、Bezier曲线、B样条曲线等,这些曲线一般采用分段的参数方程表示。规则的曲面有柱面、锥面、球面等,可以用函数或参数方程表示;常见...
  • <div id="post_detail">... matlab学习笔记之五种常见图形绘制功能 分类: 离散数据图形绘制 函数图形绘制 网格图形绘制 曲面图形绘制 特殊图形绘制 本文重点介绍matlab五种图形绘制...

    转载:https://www.cnblogs.com/always-chang/p/5653105.html

        <div id="post_detail">
    

    matlab学习笔记之五种常见的图形绘制功能

    分类:

    • 离散数据图形绘制
    • 函数图形绘制
    • 网格图形绘制
    • 曲面图形绘制
    • 特殊图形绘制

    本文重点介绍matlab五种图形绘制方法的后三种。

     

    一、网格图形绘制

    以绘制函数z=f(x,y)三维网格图为例,下面为绘制步骤:

    1. 确定自变量x和y的取值范围和取值间隔

        x = x1:dx:x2; y = y1:dy:y2;

      2.构成xoy平面上的自变量采样格点矩阵

        1)  利用“格点”矩阵生成原理生成矩阵

          X = ones(size(y))*x; Y = y*ones(size(x));

        2)  利用meshgrid命令生成“格点”矩阵

          [X,Y] = meshgrid(x,y);

      3.计算在自变量采样“格点”上的函数值

        1)  mesh(X,Y,X)

        2)  mesh(Z)

        3)  mesh(X,Y,Z,C)

        4)  mesh(X,Y,Z,’PropertyName’,PropertyValue,...)

    实例:绘制的图像,并作定义域的裁剪。

    复制代码
    clear,clf,
    

    a = -1;b = 1;c = -15;d = 15;n = 20;eps1 = 0.01;

    x = linspace(a,b,n);y = linspace(c,d,n);

    [X,Y] = meshgrid(x,y);

    % 计算函数值z,并做函数的定义域剪裁

    for i = 1:n

    </span><span style="color: #0000ff;">for</span> j = <span style="color: #800000;">1</span>:<span style="color: #000000;">n
    
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800000;">1</span><span style="color: #0000ff;">-X</span>(i,j))&lt;eps1 || X(i,j) - Y(i,j) &lt;<span style="color: #000000;"> eps1
    
            Z(i</span>,j) =<span style="color: #000000;"> NaN;
    
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
    
            Z(i</span>,j) = <span style="color: #800000;">1000</span>*<span style="color: #0000ff;">sqrt</span>(<span style="color: #800000;">1</span> - X(i,j))^-<span style="color: #800000;">1</span>.*<span style="color: #0000ff;">log</span>(X(i,j)-Y(i,<span style="color: #000000;">j));
    
        end
    
    end
    

    end

    % 画定义域边界线

    zz = -20*ones(1,n);plot3(x,x,zz),grid on,hold on

    mesh(X,Y,Z)

    view([-56.5 38]);

    xlabel(‘x’),ylabel(‘y’),zlabel(‘z’),box on

    复制代码

    结果:

     

     

    二、曲面图形绘制

    曲面图形的绘制使用surf函数完成,与mesh函数类似。

    surf函数使用方式:

      1)surf(X,Y,X)

      2)surf(Z)

      3)surf(X,Y,Z,C)

      4)surf(X,Y,Z,’PropertyName’,PropertyValue,...)

    实例:绘制圆锥体曲面。

    复制代码
    clc,clear,close all
    

    X = -10:1:10;

    Y = -10:1:10;

    [X,Y] = meshgrid(X,Y);

    Z = sqrt(X.^2 + Y.^2);

    surf(X,Y,Z)

    xlabel(‘x’)

    ylabel(‘y’)

    zlabel(‘z’)

    box on

    axis tight

    colormap(lines)

    shading interp

    set(gca,‘Ydir’,‘reverse’);

    set(gcf,‘color’,‘w’);

    复制代码

    结果:

     

     

     三、特殊图形绘制

    Matlab对于不同的三维曲面的绘制提供了不同的画图函数,如slice切片函数、quiver3三维箭头标记函数、sphere等。下面以绘制空间曲线及其运动为例抛砖引玉:

    已知空间曲线的方程为:

    复制代码
    %   空间曲线的绘制
    

    clc,clear,close all

    t = 00:0.1:1.5; % 设置运动时间

    % 给定曲线方程

    x = t.^2;

    y = (2/3)*t.^3;

    z = (6/4)*t.^4-(1/3)*t.^3;

    plot3(x,y,x,‘r.-’),hold on,grid on

    % 计算各方向梯度

    Vx = gradient(x);

    Vy = gradient(y);

    Vz = gradient(z);

    % 绘制速度矢量图

    quiver3(x,y,z,Vx,Vy,Vz);

    xlabel(‘x’)

    ylabel(‘y’)

    zlabel(‘z’)

    复制代码

    结果:

     

     

     欢迎探讨。

     

    学到即赚到。
    分类: Matlab
    0
    0
    « 上一篇: matlab学习笔记之求解线性规划问题和二次型问题
    » 下一篇: 学到即赚到
    	</div>
    	<div class="postDesc">posted @ <span id="post-date">2016-07-08 13:26</span> <a href="https://www.cnblogs.com/always-chang/">Acelit</a> 阅读(<span id="post_view_count">2697</span>) 评论(<span id="post_comment_count">0</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=5653105" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(5653105);return false;">收藏</a></div>
    </div>
    <script type="text/javascript">var allowComments=true,cb_blogId=268187,cb_entryId=5653105,cb_blogApp=currentBlogApp,cb_blogUserGuid='ddd26d8b-dcda-e511-9fc1-ac853d9f53cc',cb_entryCreatedDate='2016/7/8 13:26:00';loadViewCount(cb_entryId);var cb_postType=1;var isMarkdown=false;</script>
    
    </div><!--end: forFlow -->
    </div><!--end: mainContent 主体内容容器-->
    
    <div id="sideBar">
    	<div id="sideBarMain">
    

    公告

    昵称: Acelit
    园龄: 3年
    粉丝: 22
    关注: 14
    +加关注
    		<div id="blog-calendar" style=""><table id="blogCalendar" class="Cal" cellspacing="0" cellpadding="0" title="Calendar">
    <tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0">
    	<tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar('2019/02/01');return false;">&lt;</a></td><td align="center">2019年3月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar('2019/04/01');return false;">&gt;</a></td></tr>
    </tbody></table></td></tr><tr><th class="CalDayHeader" align="center" abbr="日" scope="col">日</th><th class="CalDayHeader" align="center" abbr="一" scope="col">一</th><th class="CalDayHeader" align="center" abbr="二" scope="col">二</th><th class="CalDayHeader" align="center" abbr="三" scope="col">三</th><th class="CalDayHeader" align="center" abbr="四" scope="col">四</th><th class="CalDayHeader" align="center" abbr="五" scope="col">五</th><th class="CalDayHeader" align="center" abbr="六" scope="col">六</th></tr><tr><td class="CalOtherMonthDay" align="center">24</td><td class="CalOtherMonthDay" align="center">25</td><td class="CalOtherMonthDay" align="center">26</td><td class="CalOtherMonthDay" align="center">27</td><td class="CalOtherMonthDay" align="center">28</td><td align="center">1</td><td class="CalWeekendDay" align="center">2</td></tr><tr><td class="CalWeekendDay" align="center">3</td><td align="center">4</td><td align="center">5</td><td align="center">6</td><td align="center">7</td><td align="center">8</td><td class="CalWeekendDay" align="center">9</td></tr><tr><td class="CalWeekendDay" align="center">10</td><td align="center">11</td><td align="center">12</td><td align="center">13</td><td align="center">14</td><td align="center">15</td><td class="CalWeekendDay" align="center">16</td></tr><tr><td class="CalWeekendDay" align="center">17</td><td align="center">18</td><td align="center">19</td><td align="center">20</td><td align="center">21</td><td align="center">22</td><td class="CalTodayDay" align="center">23</td></tr><tr><td class="CalWeekendDay" align="center">24</td><td align="center">25</td><td align="center">26</td><td align="center">27</td><td align="center">28</td><td align="center">29</td><td class="CalWeekendDay" align="center">30</td></tr><tr><td class="CalWeekendDay" align="center">31</td><td class="CalOtherMonthDay" align="center">1</td><td class="CalOtherMonthDay" align="center">2</td><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td><td class="CalOtherMonthDay" align="center">5</td><td class="CalOtherMonthDay" align="center">6</td></tr>
    
    		<div id="leftcontentcontainer">
    			<div id="blog-sidecolumn"><div id="sidebar_search" class="sidebar-block">
    
      展开全文
    • 许多曲线函数在对象建模、动画轨迹的描述、数据和函数的图形化以及其他图形应用中是十分有用的。常见曲线包括圆锥曲线、三角和指数函数、概率分布、通用多项式和样条函数。这些曲线的显示可采用类似于前面讨论的圆...

      其他曲线

          许多曲线函数在对象建模、动画轨迹的描述、数据和函数的图形化以及其他图形应用中是十分有用的。常见的曲线包括圆锥曲线、三角和指数函数、概率分布、通用多项式和样条函数。这些曲线的显示可采用类似于前面讨论的圆和椭圆函数来生成。沿曲线轨迹的位置可直接从表达式y =f (x)或参数方程中得到。此外,还可以使用增量中点算法绘制用隐式函数f(x,y) = 0描述的曲线

          显示一指定的曲线函数的简单方法是使用直线段来逼近曲线。这时,对于要得到沿曲线轨迹的等距线段的端点位置,则可以使用参数表达式。也可以按曲线的斜率选择独立变量,而从显式表达式中生成等距位置。假如y = f(x)斜率的绝对值小于1,就选择x作为自变量并对相等的x增量计算y值;当斜率绝对值大于1时,要使用反函数x = f-1(Y)并在相同的y步长中计算x的值。

          使用直线或曲线逼近法可以图示离散坐标点的数据集,我们可以使用直线段来将离散点连结在一起,或采用线性回归(最小二乘法),从而通过单个直线来拟合数据集。非线性最小二乘法用来显示具有某些拟合函数(通常是多项式)的数据组。

          像圆和椭圆一样,许多函数具有对称性,从而可以减少曲线轨迹上坐标位置的计算量。例如,正态分布函数关于中心位置(均值)是对称的,沿正弦曲线一个循环的所有点可以从90°区间内的点生成

       

      圆锥曲线

      通常,我们可以使用二次方程来描述圆锥曲线(conic section):

       

      其中,参数A, B, C, D, E和F的值决定所要显示的曲线类型。给定这组系数,就可以通过对判别式B2 = -4AC求值来确定所要生成的特定圆锥曲线:

       

      例如,当A = B = 1, C=0, D = -2xc , E=-2yc和F=x2c+y2c-r2时,就得到圆方程(3.26 )方程(3.52)也能描述退化的圆锥曲线:点和直线。

             在有些应用中,圆弧和椭圆弧可以方便地用起始角和终止角表示,如图3.29所示。这些弧有时也用它们的端点坐标位置来定义。两种情况下我们都可以使用修改的中点方法来生成弧,或显示一组逼近直线段。

       

          椭圆、双曲线和抛物线在某些动画应用中有独特的用处。这些曲线可以描述受到地球引力、电磁场和原子力作用的物体的运行轨道和其他运动。例如:太阳系的平面轨迹是椭圆,进入均匀地球引力场的物体沿抛物线轨迹运动。对于负y方向作用的引力场,图3.30给出了标准位置上的抛物线轨迹。显示物体的抛物线轨迹方程可以写为:


      常数a和b由物体的初始速度v0和均匀引力引起的加速度g决定。我们也可利用以秒计量的时间参数t.根据初始发射点的参数方程来描述这种抛物线轨迹:

       

      其中,vx0和vy0是初始速度分量,g的值在地球表面约为980 cm/s2。沿抛物线轨迹的物体位置就可以按照选定的时间步长计算出来。

       

          双曲线运动(参见图3.31 )发生在有关带电粒子碰撞的问题以及某些引力问题中。例如,彗星或陨星绕太阳的运动是沿双曲线轨迹,并且向外层空间逃逸而从不返回。描述物体运动的特定分支(图3.31中的左边或右边曲线)取决于问题中涉及的力。我们可以将图3.31中双曲线(中心位于原点)的标准方程写为

       

      对于左分支,x =< -rx;对于右分支,x>=rx。由于这个方程与标准椭圆方程(3.39)之间的不同仅在于x2和y2项的符号,因此只需对椭圆算法进行细小的改动就可以产生双曲线轨迹上的点。

       

      抛物线和双曲线具有对徐轴。例如,由方程( 3.55)描述的抛物线关于下列轴是对称的:

       

      中点椭圆算法中的方法可直接用于在下面的两个区域内获得抛物线和双曲线轨迹上对称轴一侧的点:

      (1)曲线斜率的绝对值小于1; 

      (2)曲线斜率的绝对值大于1。为此,首先选择方程(3.52)的合适形式,然后利用所选的函数来建立两个区域内决策参数的表达式。

       

      多项式和样条曲线

      x的n次多边形函数可以定义为

       

      其中,n为非负整数,ak是常数且an != 0,当n = 2时得到二次曲线,n = 3时为三次多项式,n = 4时为四次曲线,等等;当n = 1时得到直线。多项式用于包括对象形状设计、动画轨迹的确定以及在离散数据点集合中数据趋向的图形化等许多图形应用中。

       

          对象形状或运动轨迹的设计中一般先通过指定少量的点来定义一个大概的曲线轮廓,然后利用多项式来拟合选定的点。曲线拟合的一种方法是在每对指定点之间构造三次多项式曲线段,每个曲线段可以通过参数形式描述:

       

           其中,参数u在0和1.0之间变化。参数方程中u的系数值根据曲线段的边界条件确定。边界条件之一是两个相邻曲线段具有公共端点,另一个条件是在边界上匹配两条曲线的斜率,以便得到连续的平滑曲线(参见图3.32)。利用多项式曲线段形成的这种连续曲线称为样条曲线(spline curve ),简称为样条。还有许多其他的建立样条曲线的方法,我们将在第8章研究各种样条的生成方法。

      展开全文
    • 贝塞尔曲线----有趣的图形学 贝塞尔曲线的数学基础是早在 1912 年就广为人知的伯恩斯坦多项式。但直到 1959 年,当时就职于雪铁龙的法国数学家 Paul de Casteljau 才开始对它进行图形化应用的尝试,并提出了一种...

      贝塞尔曲线----有趣的图形学

      贝塞尔曲线的数学基础是早在 1912 年就广为人知的伯恩斯坦多项式。但直到 1959 年,当时就职于雪铁龙的法国数学家 Paul de Casteljau 才开始对它进行图形化应用的尝试,并提出了一种数值稳定的 de Casteljau 算法。然而贝塞尔曲线的得名,却是由于 1962 年另一位就职于雷诺的法国工程师 Pierre Bézier 的广泛宣传。他使用这种只需要很少的控制点就能够生成复杂平滑曲线的方法,来辅助汽车车体的工业设计。

      正是因为控制简便却具有极强的描述能力,贝塞尔曲线在工业设计领域迅速得到了广泛的应用。不仅如此,在计算机图形学领域,尤其是矢量图形学,贝塞尔曲线也占有重要的地位。今天我们最常见的一些矢量绘图软件,如 Flash、Illustrator、CorelDraw 等,无一例外都提供了绘制贝塞尔曲线的功能。甚至像 Photoshop 这样的位图编辑软件,也把贝塞尔曲线作为仅有的矢量绘制工具(钢笔工具)包含其中。

      贝塞尔曲线在 web 开发领域同样占有一席之地。CSS3 新增了 transition-timing-function 属性,它的取值就可以设置为一个三次贝塞尔曲线方程。在此之前,也有不少 JavaScript 动画库使用贝塞尔曲线来实现美观逼真的缓动效果。

      下面我们就通过例子来了解一下如何用 de Casteljau 算法绘制一条贝塞尔曲线。

      在平面内任选 3 个不共线的点,依次用线段连接。enter image description here

      在第一条线段上任选一个点 D。计算该点到线段起点的距离 AD,与该线段总长 AB 的比例。enter image description here

      根据上一步得到的比例,从第二条线段上找出对应的点 E,使得 AD:AB= BE:BCenter image description here

      连接这两点 DE。enter image description here

      从新的线段 DE 上再次找出相同比例的点 F,使得 DF:DE= AD:AB= BE:BCenter image description here

      到这里,我们就确定了贝塞尔曲线上的一个点 F。接下来,请稍微回想一下中学所学的极限知识,让选取的点 D 在第一条线段上从起点 A 移动到终点 B,找出所有的贝塞尔曲线上的点 F。所有的点找出来之后,我们也得到了这条贝塞尔曲线。enter image description here

      如果你实在想象不出这个过程,没关系,看动画!enter image description here

      回过头来看这条贝塞尔曲线,为了确定曲线上的一个点,需要进行两轮取点的操作,因此我们称得到的贝塞尔曲线为二次曲线(这样记忆很直观,但曲线的次数其实是由前面提到的伯恩斯坦多项式决定的)。

      当控制点个数为 4 时,情况是怎样的?enter image description here

      步骤都是相同的,只不过我们每确定一个贝塞尔曲线上的点,要进行三轮取点操作。如图,AE:AB= BF:BC= CG:CD= EH:EF= FI:FG= HJ:HI,其中点 J 就是最终得到的贝塞尔曲线上的一个点。enter image description here

      这样我们得到的是一条三次贝塞尔曲线。enter image description here

      看过了二次和三次曲线,更高次的贝塞尔曲线大家应该也知道要怎么画了吧。那么比二次曲线更简单的一次(线性)贝塞尔曲线存在吗?长什么样?根据前面的介绍,只要稍作思考,想必你也能猜出来了。哈!就是一条直线~enter image description here

      能画曲线也能画直线,是不是很厉害?要绘制更复杂的曲线,控制点的增加也仅仅是线性的。这一特点使其不光在工业设计领域大展拳脚,就连数学基础不好的人也可以比较容易地掌握,比如大多数平面美术设计师们。enter image description here

      上面介绍的内容并不足以展示贝塞尔曲线的真正威力。推广到三维空间的贝塞尔曲面,以及更进一步的非均匀有理 B 样条(NURBS),早已成为当今计算机辅助设计(CAD)的行业标准,不论是我们平常用到的各种产品,还是在电影院看到的精彩大片,都少不了它们的功劳。enter image description here

      enter image description here

      动态绘制贝塞尔曲线的在线演示

      【转载】:http://blog.csdn.net/cdnight/article/details/48468653

      需要贝塞尔曲线实现代码的请留言(源码语言:C++版)

      展开全文
    • 计算机图形学:贝塞尔曲线和B样条

      千次阅读 2020-03-07 13:05:28
      贝塞尔曲线和B样条 1.Bézier curve贝塞尔曲线 一个连续函数都可以用一个多项式无限逼近 贝塞尔曲线于 1962 年,由法国工程师皮埃尔·贝济埃(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行...

      贝塞尔曲线和B样条

      1.Bézier curve贝塞尔曲线

      一个连续函数都可以用一个多项式无限逼近

      贝塞尔曲线于 1962 年,由法国工程师皮埃尔·贝济埃(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。

      1.1 一阶贝塞尔曲线

      image

      B 1 ( t ) = ( 1 − t ) P 0 + t P 1 , t ∈ [ 0 , 1 ] \mathbf{B_1(t)= (1-t)P_0 + tP_1, t\in[0, 1]} B1(t)=(1t)P0+tP1,t[0,1]

      1.2 二阶贝塞尔曲线

      image

      P 0 ′ = ( 1 − t ) P 0 + t P 1   P 1 ′ = ( 1 − t ) P 1 + t P 2   B 2 ( t ) = ( 1 − t ) P 0 ′ + t P 1 ′ = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 \mathbf{P_0'= (1-t)P_0 + tP_1} \\ \ \\ \mathbf{P_1'= (1-t)P_1 + tP_2} \\ \ \\ \mathbf{B_2(t)= (1-t)P_0' + tP_1'=(1-t)^2P_0+2t(1-t)P_1+t^2P_2} \\ P0=(1t)P0+tP1 P1=(1t)P1+tP2 B2(t)=(1t)P0+tP1=(1t)2P0+2t(1t)P1+t2P2

      1.3 三阶贝塞尔曲线

      image

      B 3 ( t ) = ( 1 − t ) 3 P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) 2 P 1 + t 3 P 3 \mathbf{B_3(t)= (1-t)^3P_0 + 3t(1-t)^2P_1 + 3t^2(1-t)^2P_1 + t^3P_3} B3(t)=(1t)3P0+3t(1t)2P1+3t2(1t)2P1+t3P3

      1.4 多阶贝塞尔曲线

      Bernstein polynomial(伯恩斯坦多项式)

      B n ( t ) = ∑ i = 0 n C n i P i ( 1 − t ) n − i t i = ∑ i = 0 n B i , n P i   C n i = n ! ( n − i ) ! ⋅ i !   B i , n = n ! ( n − i ) ! ⋅ i ! ( 1 − t ) n − i t i \mathbf{B_n(t)= \sum_{i=0}^{n} C_{n}^{i} P_i (1-t)^{n-i}t^i = \sum_{i=0}^{n} B_{i,n} P_i } \\ \ \\ \mathbf{C_{n}^{i} = \frac{n!}{(n-i)!\cdot i!}}\\ \ \\ \mathbf{B_{i,n} = \frac{n!}{(n-i)!\cdot i!}(1 - t)^{n-i}t^i}\\ Bn(t)=i=0nCniPi(1t)niti=i=0nBi,nPi Cni=(ni)!i!n! Bi,n=(ni)!i!n!(1t)niti

      1.5 de Casteljau

      在这里插入图片描述

      P i , j \bm{P_{i,j}} Pi,j表示第i列的第j个点
      P i , j = ( 1 − t ) P i − 1 , j + t P i − 1 , j + 1   i ∈ [ 1 , n ] , j ∈ [ 1 , n − i + 1 ] \mathbf{P_{i, j} = (1 - t)P_{i - 1, j} + tP_{i - 1, j + 1}}\\ \ \\ \mathbf{i \in [1, n], j \in [1, n - i + 1]}\\ Pi,j=(1t)Pi1,j+tPi1,j+1 i[1,n],j[1,ni+1]

      de Casteljau算法在Bézier曲线的光栅化阶段特别有用。

      Vector2 Render::CalculateBezierPoint(const std::vector<Vector2>& ctl_vecs, float t){
          std::vector<Vector2> points(ctl_vecs);
          for (int i = 0; i < points.size() - 1; ++i) {
              for (int j = 0; j < points.size() - i - 1; ++j) {
                  points[j] = interp(points[j], points[j + 1], t);
              }
          }
          return points[0];
      }
      

      1.6 升阶

      增加控制点却不改变原先曲线的表现

      Degree raising means that adding control points to raise the degree of the Bézier curves, but the shape and direction of the curve remain unchanged.

      推导过程:

      已知:
      B n ( t ) = ∑ i = 0 n B i , n P i \mathbf{B_n(t)= \sum_{i=0}^{n} B_{i,n} P_i } Bn(t)=i=0nBi,nPi
      则:
      B n ( t ) = ∑ i = 0 n B i , n P i = ∑ i = 0 n ( 1 − t + t ) B i , n P i \mathbf{B_n(t)= \sum_{i=0}^{n} B_{i,n} P_i = \sum_{i=0}^{n} (1-t + t) B_{i,n} P_i} Bn(t)=i=0nBi,nPi=i=0n(1t+t)Bi,nPi

      接下来看下相乘的两个式子

      式子1:

      ( 1 − t ) B i , n P i = n ! ( n − i ) ! ⋅ i ! ( 1 − t ) n + 1 − i t i P i   = n + 1 − i n + 1 ( n + 1 ) ! ( n + 1 − i ) ! ⋅ i ! ( 1 − t ) n + 1 − i t i P i = n + 1 − i n + 1 B i , n + 1 P i   ( 1 − t ) B i , n P i = n + 1 − i n + 1 B i , n + 1 P i \mathbf{(1 - t)B_{i, n}P_i = \frac{n!}{(n-i)!\cdot i!}(1 - t)^{n + 1 - i}t^i P_i }\\ \ \\ \mathbf{= \frac{n + 1 - i}{n + 1}\frac{(n+1)!}{(n + 1 - i)!\cdot i!}(1 - t)^{n + 1 - i}t^i P_i = \frac{n + 1 - i}{n + 1}B_{i, n + 1}P_i}\\ \ \\ \mathbf{(1 - t)B_{i, n} P_i = \frac{n + 1 - i}{n + 1}B_{i, n + 1}P_i }\\ (1t)Bi,nPi=(ni)!i!n!(1t)n+1itiPi =n+1n+1i(n+1i)!i!(n+1)!(1t)n+1itiPi=n+1n+1iBi,n+1Pi (1t)Bi,nPi=n+1n+1iBi,n+1Pi

      式子2:

      t B i , n P i = n ! ( n − i ) ! ⋅ i ! ( 1 − t ) n − i t i + 1 P i   = i + 1 n + 1 ( n + 1 ) ! ( n + 1 − i − 1 ) ! ⋅ ( i + 1 ) ! ( 1 − t ) n + 1 − i − 1 t i + 1 P i = i + 1 n + 1 B i + 1 , n + 1 P i   t B i , n P i = i + 1 n + 1 B i + 1 , n + 1 P i \mathbf{tB_{i, n}P_i = \frac{n!}{(n-i)!\cdot i!}(1 - t)^{n - i}t^{i + 1} P_i }\\ \ \\ \mathbf{= \frac{i + 1}{n + 1}\frac{(n+1)!}{(n + 1 - i - 1)!\cdot (i + 1)!}(1 - t)^{n + 1 - i - 1}t^{i + 1} P_i = \frac{i + 1}{n + 1}B_{i + 1, n + 1}P_i}\\ \ \\ \mathbf{tB_{i, n}P_i = \frac{i + 1}{n + 1}B_{i + 1, n + 1}P_i}\\ tBi,nPi=(ni)!i!n!(1t)niti+1Pi =n+1i+1(n+1i1)!(i+1)!(n+1)!(1t)n+1i1ti+1Pi=n+1i+1Bi+1,n+1Pi tBi,nPi=n+1i+1Bi+1,n+1Pi

      对于等式1,由于i = n + 1的时候等式为0,所以可以将等式变为

      ∑ i = 0 n n + 1 − i n + 1 B i , n + 1 P i = ∑ i = 0 n + 1 n + 1 − i n + 1 B i , n + 1 P i \mathbf{\sum_{i = 0}^{n}\frac{n + 1 - i}{n + 1}B_{i, n + 1}P_i = \sum_{i = 0}^{n + 1}\frac{n + 1 - i}{n + 1}B_{i, n + 1}P_i} i=0nn+1n+1iBi,n+1Pi=i=0n+1n+1n+1iBi,n+1Pi

      对于等式2我们可以将i用i-1替代,因为i=-1时等式为0,所以成立,所以

      ∑ i = 0 n i + 1 n + 1 B i + 1 , n + 1 P i = ∑ i = 0 n + 1 i n + 1 B i , n + 1 P i − 1 \mathbf{\sum_{i = 0}^{n}\frac{i + 1}{n + 1}B_{i + 1, n + 1}P_i = \sum_{i = 0}^{n + 1}\frac{i}{n + 1}B_{i, n + 1}P_{i - 1}} i=0nn+1i+1Bi+1,n+1Pi=i=0n+1n+1iBi,n+1Pi1

      将两式子合并最终结果为:

      B n ( t ) = ∑ i = 0 n B i , n P i = ∑ i = 0 n + 1 ( n + 1 − i n + 1 P i + i n + 1 P i − 1 ) B i , n + 1 \mathbf{B_n(t)= \sum_{i=0}^{n} B_{i,n} P_i = \sum_{i = 0}^{n + 1}(\frac{n + 1 - i}{n + 1}P_i + \frac{i}{n + 1}P_{i - 1}) B_{i, n + 1}} Bn(t)=i=0nBi,nPi=i=0n+1(n+1n+1iPi+n+1iPi1)Bi,n+1

      其中 P − 1 , P n + 1 \bm{P_{-1}},\bm{P_{n + 1}} P1,Pn+1值随意,毕竟最后乘以系数后均为0

      新的节点推导公式为:
      P i ∗ = ( n + 1 − i n + 1 P i + i n + 1 P i − 1 ) \mathbf{P_i^* = (\frac{n + 1 - i}{n + 1}P_i + \frac{i}{n + 1}P_{i - 1})} Pi=(n+1n+1iPi+n+1iPi1)

      CODE:

      std::vector<Vector2> Render::RaiseDegree(const std::vector<Vector2>& ctl_vecs){
          unsigned long new_degree = ctl_vecs.size();
          std::vector<Vector2> new_ctl_vecs(new_degree + 1);
          new_ctl_vecs[0] = ctl_vecs[0];
          new_ctl_vecs[new_degree] = ctl_vecs[new_degree - 1];
          for (int i = 1; i < new_degree; ++i) {
              float t = 1.0 - static_cast<float>(i) / new_degree;
              new_ctl_vecs[i] = interp(ctl_vecs[i - 1], ctl_vecs[i], t);
          }
          return new_ctl_vecs;
      }
      

      1.7 降阶

      减少控制点去逼近原先曲线的表现

      Degree reduction is the opposite of degree raising, is to find a curve defined by new control points with minimum error

      根据升阶公式

      P i ∗ = ( n − i n P i + i n P i − 1 ) \mathbf{P_i^* = (\frac{n - i}{n}P_i + \frac{i}{n}P_{i - 1})} Pi=(nniPi+niPi1)

      可以得到如下两个递推式

      P i ′ = n P i ∗ − i P i − 1 ′ n − i i = 0 , 1 , 2... n − 1   P i − 1 ′ ′ = n P i ∗ − ( n − i ) P i ′ ′ i i = n , n − 1 , . . . 1 \mathbf{P_i' = \frac{nP_i^* - iP_{i - 1}'}{n - i} \qquad i = 0, 1, 2...n-1}\\ \ \\ \mathbf{P_{i - 1}'' = \frac{nP_i^* - (n - i)P_{i}''}{i} \qquad i=n, n-1,...1}\\ Pi=ninPiiPi1i=0,1,2...n1 Pi1=inPi(ni)Pii=n,n1,...1

      一个与起点重合,然后逐渐偏离;一个与终点重合,然后逐渐偏离

      Then we have two kinds of degree reduction schemes

      1.7.1 Forrest (1972)

      P i ^ = { P i ′ , i = 0 , 1 , . . . , [ n − 1 2 ] P i ′ ′ , i = [ n − 1 2 ] + 1 , . . . n − 1 \mathbf{\hat{P_i} = \left\{\begin{matrix} P_i' , & i = 0,1,..., \left [ \frac{n - 1}{2} \right ] \\ P_i'', & i = \left[\frac{n - 1}{2} \right ] + 1,...n - 1 \end{matrix}\right.} Pi^={Pi,Pi,i=0,1,...,[2n1]i=[2n1]+1,...n1

      1.7.2 Farin (1983)

      P i ^ = ( 1 − i n − 1 ) P i ′ + i n − 1 P i ′ ′ \mathbf{\hat{P_i} = (1 - \frac{i}{n - 1})P_i' + \frac{i}{n - 1}P_i''} Pi^=(1n1i)Pi+n1iPi


      2 B-Spline

      P n ( t ) = ∑ i = 0 n P i N i , k ( t )   t ∈ [ 0 , 1 ] P_n(t) = \sum_{i=0}^{n}P_iN_{i, k}(t)\\ \ \\ t \in [0, 1]\\ Pn(t)=i=0nPiNi,k(t) t[0,1]

      2.1 样条

      样条(Spline)其实是一种在造船和工程制图时用来画出光滑形状的工具。样条是一根柔软但有弹性的长条物,有些像尺子。将两端和几个点用钉子固定之后,便可以产生顺滑的曲线。

      image

      2.2 Cox-de Boor recursion formula

      N i , 1 = { 1 t i < x < t i + 1 0 o t h e r w i s e   N i , k = t − t i t i + k − 1 − t i N i , k − 1 ( t ) + t i + k − t t i + k − t i + 1 N i + 1 , k − 1 ( t ) \mathbf{N_{i,1} = \left\{\begin{matrix} 1 & t_i < x < t_{i + 1}\\ 0 & otherwise \end{matrix}\right.}\\ \ \\ \mathbf{N_{i,k} = \frac{t - t_i}{t_{i+k-1} - t_i}N_{i, k-1}(t) + \frac{t_{i+k} - t}{t_{i+k} - t_{i+1}}N_{i+1, k-1}(t)}\\ Ni,1={10ti<x<ti+1otherwise Ni,k=ti+k1tittiNi,k1(t)+ti+kti+1ti+ktNi+1,k1(t)

      我们让 t 0 = 0 , t 1 = 1 , t 2 = 2 , t 3 = 3 t_0 = 0,t_1 = 1,t_2 = 2, t_3 = 3 t0=0,t1=1,t2=2,t3=3,则 N 0 , 1 , N 1 , 1 , N 2 , 1 N_{0, 1}, N_{1, 1}, N_{2, 1} N0,1,N1,1,N2,1如下图所示:

      在这里插入图片描述

      递推关系如下(此图为wiki上的,用的是次-degree,而上面的公式用的是阶-order,degree=order-1):

      image

      2.2.1 定义区间

      [ t k − 1 , t n + 1 ] [t_{k-1},t_{n+1}] [tk1,tn+1]区间内有相应数量的基函数,该区间才有意义:

      image

      2.3 分类

      2.3.1 均匀B样条(Uniform B-Spline)

      节点成等差数列均匀分布

      image

      2.3.2 准均匀B样条(Quasi-Uniform B-Spline)

      让起点和终点都具有K的重复度,使得曲线从起点开始,到终点结束

      image

      2.3.3 分段Bezier曲线(Piecewise Bezier Curve)

      • 起点节点和终点节点都具有K的重复度
      • 所有其它节点都具有K-1的重复度
      • 这样所有的曲线段都是Bezier曲线,各自独立

      image

      2.3.4 非均匀B样条(Non-uniform B-Spline)

      • 起始点重复度都≤K
      • 其它节点重复度≤K-1

      De Boor’s Algorithm

      展开全文
    • 图形学实验五曲线生成算法

      千次阅读 2018-11-30 14:58:30
      了解曲线的生成原理,掌握几种常见曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法。 二、实验内容 1 分析空间曲线生成算法的原理,绘制其程序流程图; 2结合示范代码了解曲线生成原理与算法实现,尤其是...
    • 对数据进行预处理,并基于处理后的数据利用R的图形函数绘制常见图形,包括:条形图、散点图、核密度图和小提琴图。 二.实验软件环境 1、电脑一台,操作系统: 2、R x64 3、RStudio Version 三.实验内容 ...
    • Android 动态绘制曲线等各种图形

      千次阅读 2019-01-10 16:59:02
      Android 中动态的绘制有两种方法,一种是用OpenGL ES,它主要用来做3D图形开发,对于一般的应用,我们会采取自定义一个View,然后覆盖onDraw()的方法,下面说一下第二种方法。 基本的思路是: 1:创建一个类,继承自...
    • 【动图】高数常见特殊曲线

      千次阅读 多人点赞 2020-05-28 13:24:36
      一个圆直线无滑动的滚动,圆上任一点画出的曲线 来自 https://zh.wikipedia.org/wiki/%E6%91%86%E7%BA%BF 最速降线问题:质点在重力作用下沿曲线从固定点A滑到固定点B,当曲线是什么形状时所需要的时间最短? 证明...
    • 附录二 基本初等函数图形及几种常用曲线

      千次阅读 多人点赞 2020-02-03 17:33:46
      基本初等函数图形及几种常用曲线
    • cad常见的50个经典平面图形,有点意思
    • QT中QPainter的使用及矩形 圆形等常见图形的画法
    • 目录一、离散型变量的可视化1 饼图1.1 matplotlib模块1.2 panda模块2 条形...曲线1.1 matplotlib模块1.1.1 直方图1.2 pandas模块1.2.1 直方图与核密度曲线1.3 seaborn模块1.3.1 可分组的直方图与核密度曲线2 箱线图2.1 ...
    • 图形报表很常用,因为展示数据比较直观,常见的形式有很多,如:折线图、柱形图、饼图、雷达图、股票图、还有一些3D效果的图表等。 Android中也有不少第三方图表库,但是很难兼容各种各样的需求。 如果第三方库不...
    • 计算机图形常见简单算法整理

      千次阅读 2018-12-19 16:57:44
      直线段的扫描转换算法(3) 1.DDA画直线算法 void CLine_ScanView::DDALine(int x1, int y1, int x2, int y2, int color) {  int dx,dy,epsl,k;  float x=10,y=10,xIncre,yIncre; ... ...
    • cumulative=True) shade参数:若为True,则在kde曲线下面的区域进行阴影处理,color空值曲线和阴影的颜色 sns.kdeplot(x,shade=True,color='red') vertical参数:表示以X轴进行绘制还是以Y轴进行绘制 sns.kdeplot(x,...
    • 参考资料:https://wenku.baidu.com/view/715f1c7b30126edb6f1aff00bed5b9f3f90f72f1.html?from=search点击进入 1.球面 2.柱面 3.旋转曲面 4.椭球面 5.抛物面 5.1椭圆抛物面 5.2双曲抛物面 ......
    • QT4中QPainter的使用及矩形、圆形等常见图形的画法例程://QT4中矩形的画法 #include QApplication> #include QWidget> #include QPainter> class MyMainWindow:public QWidget { public: MyMainWindow
    • 然后我打算开始讲一下自己目前打交道最多的一种曲线——圆弧直线,但这种线它似乎远不如贝塞尔曲线来得出名。这种线到底指的是啥,其设计初衷是什么,有何优缺点,都应用在什么地方,感觉看到我文章的朋友大概还一脸...
    • # include < QApplication > # include ...更加确切地表述,这个圆或椭圆是在矩形中,这个矩形的左上角的...传递给该函数的唯一一个参数表示一个矩形,在其中创建贝塞尔曲线(其他参数为缺省参数,可以省略)。
    • split = True, # 将小提琴图从中间割裂开,形成不同的密度曲线; palette = 'RdBu' # 指定不同性别对应的颜色(因为hue参数为设置为性别变量) ) # 添加图形标题 plt.title('每天不同性别客户的消费额情况') # ...
    • 1、首先说一下canvas类:这个类相当于一个画布,你可以在里面画很... Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) ==================================================...
    • matlab画三维曲线的代码线框 Clojure和ClojureScript中的轻量级3D渲染引擎。 从javascript演示(最初由Kragen Javier Sitaker,请参阅下面的参考文献)改编和扩展到Clojure / ClojureScript库(可呈现为SVG,HTML5 ...
    • 原文链接:http://blog.csdn.net/leo2351960/article/details/37655089 Plot3,绘制三维曲线,与plot命令类似,用法为 [html] view ...plot3命令只能绘制出三维的曲线,并不能绘制出三维

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 24,466
    精华内容 9,786
    关键字:

    常见曲线图形