• 计算贝塞尔曲线上点坐标


    贝塞尔曲线上控制点坐标分别为:P0(3,8),P1(2,3),P2(2,7),想要返回 10 个在贝塞尔曲线上的点

    javascript代码如下:(从项目copy的代码,仅仅针对二维坐标dimersion = 2)

     1  /**
     2      * @param poss      贝塞尔曲线控制点坐标
     3      * @param precision 精度,需要计算的该条贝塞尔曲线上的点的数目
     4      * @return 该条贝塞尔曲线上的点(二维坐标)
     5      */
     6     function bezierCalculate(poss:Array<Point>, precision:number) {
     7 
     8         //维度,坐标轴数(二维坐标,三维坐标...)
     9         let dimersion = 2;
    10 
    11         //贝塞尔曲线控制点数(阶数)
    12         let number = poss.length;
    13 
    14         //控制点数不小于 2 ,至少为二维坐标系
    15         if (number < 2 || dimersion < 2)
    16             return null;
    17 
    18         let result = new Array();
    19 
    20         //计算杨辉三角
    21         let mi = new Array();
    22         mi[0] = mi[1] = 1;
    23         for (let i = 3; i <= number; i++) {
    24 
    25             let t = new Array();
    26             for (let j = 0; j < i - 1; j++) {
    27                 t[j] = mi[j];
    28             }
    29 
    30             mi[0] = mi[i - 1] = 1;
    31             for (let j = 0; j < i - 2; j++) {
    32                 mi[j + 1] = t[j] + t[j + 1];
    33             }
    34         }
    35 
    36         //计算坐标点
    37         for (let i = 0; i < precision; i++) {
    38             let t = i / precision;
    39             let p = new Point(0, 0);
    40             result.push(p);
    41             for (let j = 0; j < dimersion; j++) {
    42                 let temp = 0.0;
    43                 for (let k = 0; k < number; k++) {
    44                     temp += Math.pow(1 - t, number - k - 1) * (j == 0 ? poss[k].x : poss[k].y) * Math.pow(t, k) * mi[k];
    45                 }
    46                 j == 0 ? p.x = temp : p.y = temp;
    47             }
    48             p.x = this.toDecimal(p.x);
    49             p.y = this.toDecimal(p.y);
    50         }
    51 
    52         return result;
    53     }

    java代码:

      /**
         * @param poss      贝塞尔曲线控制点坐标
         * @param precision 精度,需要计算的该条贝塞尔曲线上的点的数目
         * @return 该条贝塞尔曲线上的点(二维坐标)
         */
    public float[][] calculate(float[][] poss, int precision) {
    
            //维度,坐标轴数(二维坐标,三维坐标...)
            int dimersion = poss[0].length;
    
            //贝塞尔曲线控制点数(阶数)
            int number = poss.length;
    
            //控制点数不小于 2 ,至少为二维坐标系
            if (number < 2 || dimersion < 2)
                return null;
    
            float[][] result = new float[precision][dimersion];
    
            //计算杨辉三角
            int[] mi = new int[number];
            mi[0] = mi[1] = 1;
            for (int i = 3; i <= number; i++) {
    
                int[] t = new int[i - 1];
                for (int j = 0; j < t.length; j++) {
                    t[j] = mi[j];
                }
    
                mi[0] = mi[i - 1] = 1;
                for (int j = 0; j < i - 2; j++) {
                    mi[j + 1] = t[j] + t[j + 1];
                }
            }
    
            //计算坐标点
            for (int i = 0; i < precision; i++) {
                float t = (float) i / precision;
                for (int j = 0; j < dimersion; j++) {
                    float temp = 0.0f;
                    for (int k = 0; k < number; k++) {
                        temp += Math.pow(1 - t, number - k - 1) * poss[k][j] * Math.pow(t, k) * mi[k];
                    }
                    result[i][j] = temp;
                }
            }
    
            return result;
        }
  • 相关阅读:
    Java学习之路-Hessian学习
    Hessian知识学习总结(二)——Hessian的helloworld
    如何封装RESTful Web Service
    c#string为传值模式
    Acrobat 无法在本页面上执行OCR识别
    redis error It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. SocketFailure on PING
    关于bootstrap的modal弹出层嵌套子Modal所引发的血案(转)
    项目学习——后台事件监听并触发相应操作
    Redis学习笔记
    正则表达式
  • 原文地址:https://www.cnblogs.com/fangsmile/p/11642784.html
Copyright © 2020-2023  润新知