zoukankan      html  css  js  c++  java
  • 贝塞尔曲线_初探

    Mark

    参考: https://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html

    简单运用:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        二次贝塞尔曲线: 公式;
        起点: P0;
        终点: p2;
        控制点: p1;
        曲线长度比例: t;
        <br/>
        B(t) = (1 - t)^2 * P0 + 2 * t * (1 - t) * P1 + t^2 * P2;
        
        <br/><br/><br/>
        三次贝塞尔曲线: 公式;
        起点: P0;
        终点: p3;
        控制点1: p1;
        控制点2: p2;
        曲线长度比例: t;
        <br/>
        B(t) = P0 * (1-t)^3 + 3 * P1 * t * (1-t)^2 + 3 * P2 * t^2 * (1-t) + P3 * t^3, t ∈ [0,1]
        <script>
            function curve( t, p0, p1, p2) {
                var point = Point( 0, 0 );
                var temp = 1 - t;
                point.x = temp * temp * p0.x + 2 * t * temp * p1.x + t * t * p2.x;
                point.y = temp * temp * p0.y + 2 * t * temp * p1.y + t * t * p2.y;
                return point;
            }
            
            /**
             * 三阶贝塞尔曲线
             * B(t) = P0 * (1-t)^3 + 3 * P1 * t * (1-t)^2 + 3 * P2 * t^2 * (1-t) + P3 * t^3, t ∈ [0,1]
             *
             * @param t  曲线长度比例
             * @param p0 起始点
             * @param p1 控制点1
             * @param p2 控制点2
             * @param p3 终止点
             * @return t对应的点
             */
            function curve3( t, p0, p1, p2, p3) {
                var point = Point( 0, 0 );
                var temp = 1 - t;
                point.x = p0.x * temp * temp * temp + 3 * p1.x * t * temp * temp + 3 * p2.x * t * t * temp + p3.x * t * t * t;
                point.y = p0.y * temp * temp * temp + 3 * p1.y * t * temp * temp + 3 * p2.y * t * t * temp + p3.y * t * t * t;
                return point;
            }
            
            function Point(x, y) { 
                return {x: x, y: y} 
            }
    
            var p0 = {x: 150, y: 50};
            var p1 = {x: 0, y: 150};
            var p2 = {x: 200, y: 500};
    
            var ps = [];
            var cy = 16;
            for (var i = 0; i < cy; i++) {
                ps.push( curve(i / cy, p0, p1, p2) );
            }
    
            var canvas = document.createElement('canvas');
            canvas.width = 1000;
            canvas.height = 600;
            var context = canvas.getContext('2d');
    
            context.moveTo(ps[0].x, ps[0].y);
            for(var i = 1; i < ps.length; i++) {
                context.lineTo(ps[i].x, ps[i].y);
            }
            context.stroke();
    
            document.body.appendChild(canvas);
        </script>
    </body>
    </html>

    附: 二阶贝塞尔曲线公式推导过程:

         

  • 相关阅读:
    实现IEnumberable接口和IEnumberator
    XAML-1
    Java基础00-Java概述1
    详解Lombok中的@Builder用法
    stream之map的用法
    stream之forEach的用法
    Java中map.getOrDefault()方法的使用
    BiPredicate的test()方法
    Function.identity()
    java 8 lamda Stream的Collectors.toMap 参数
  • 原文地址:https://www.cnblogs.com/liuyingde/p/11347155.html
Copyright © 2011-2022 走看看