javascript Spline代码
代码是通过网上一个winform代码中提取修改而来的。后转为javascript 版本。
- /*
- points = new Array();
- points.push({x:1,y:2});
- */
- function Spline(points) {
- var NewArrayFloat = function(n) {
- var arr = new Array(n);
- for (var i = 0; i < n; i++) {
- arr[i] = 0.0;
- }
- return arr;
- }
- /*
- C# (float[] sub, float[] diag, float[] sup, ref float[] b, int n)
- Js return float[] b;
- */
- var solveTridiag = function(sub, diag, sup, b, n) {
- /*
- solve linear system with tridiagonal n by n matrix a
- using Gaussian elimination *without* pivoting
- where a(i,i-1) = sub[i] for 2<=i<=n
- a(i,i) = diag[i] for 1<=i<=n
- a(i,i+1) = sup[i] for 1<=i<=n-1
- (the values sub[1], sup[n] are ignored)
- right hand side vector b[1:n] is overwritten with solution
- NOTE: 1...n is used in all arrays, 0 is unused */
- var i;
- /*factorization and forward substitution */
- for (i = 2; i <= n; i++) {
- sub[i] = sub[i] / diag[i - 1];
- diag[i] = diag[i] - sub[i] * sup[i - 1];
- b[i] = b[i] - sub[i] * b[i - 1];
- }
- b[n] = b[n] / diag[n];
- for (i = n - 1; i >= 1; i--) {
- b[i] = (b[i] - sup[i] * b[i + 1]) / diag[i];
- }
- return b;
- }
- var resultPoint = new Array();
- var precision = 10;
- var np = points.length;
- var yCoords = NewArrayFloat(np);
- var xCoords = NewArrayFloat(np);
- var x;
- var y;
- var oldy = 0;
- var oldx = 0;
- var npp = np * precision;
- // draw a border around the canvas
- if (np > 0) {
- // draw the control points
- for (var i = 0; i < np; i++) {
- var p = { x: points[i].x, y: points[i].y };
- xCoords[i] = p.x;
- yCoords[i] = p.y;
- }
- if (np > 1) {
- var a = new NewArrayFloat(np);
- var x1;
- var x2;
- var h = new NewArrayFloat(np);
- for (var i = 1; i <= np - 1; i++) {
- h[i] = xCoords[i] - xCoords[i - 1];
- }
- if (np > 2) {
- var sub = NewArrayFloat(np - 1);
- var diag = NewArrayFloat(np - 1);
- var sup = NewArrayFloat(np - 1);
- for (var i = 1; i <= np - 2; i++) {
- diag[i] = (h[i] + h[i + 1]) / 3;
- sup[i] = h[i + 1] / 6;
- sub[i] = h[i] / 6;
- a[i] = (yCoords[i + 1] - yCoords[i]) / h[i + 1] - (yCoords[i] - yCoords[i - 1]) / h[i];
- }
- //C# CODE param [a] = [ref a];
- a = solveTridiag(sub, diag, sup, a, np - 2);
- }
- // note that a[0]=a[np-1]=0
- oldx = xCoords[0];
- oldy = yCoords[0];
- resultPoint.push({ x: oldx, y: oldy });
- for (var i = 1; i <= np - 1; i++) {
- // loop over intervals between nodes
- for (var j = 1; j <= precision; j++) {
- x1 = (h[i] * j) / precision;
- x2 = h[i] - x1;
- y = ((-a[i - 1] / 6 * (x2 + h[i]) * x1 + yCoords[i - 1]) * x2 +
- (-a[i] / 6 * (x1 + h[i]) * x2 + yCoords[i]) * x1) / h[i];
- x = xCoords[i - 1] + x1;
- resultPoint.push({ x: x, y: y });
- oldx = x;
- oldy = y;
- }
- }
- }
- }
- return resultPoint;
- }
javascript Spline代码的更多相关文章
- javascript两行代码按指定格式输出日期时间
javascript两行代码按指定格式输出日期时间,具体看代码: function date2str(x,y) { var z ={y:x.getFullYear(),M:x.getMonth()+1 ...
- javascript常用代码大全
http://caibaojian.com/288.html 原文链接 jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...
- JSLint是一个JavaScript的代码质量工具
JSLint是一个JavaScript的代码质量工具 可能都或多或少的知道JSLint是一个JavaScript的代码质量工具,一个JavaScript语法检查器和校验器,它能分析JavaScript ...
- javascript实现代码高亮
javascript实现代码高亮-wangHighLighter.js 1. 引言 (先贴出wangHighLighter.js的github地址:https://github.com/wangfup ...
- JavaScript后台代码操作HTML TABLE的方法
原文:JavaScript后台代码操作HTML TABLE的方法 var rowNum = 0,fileNum = 0; //行号与列号 var oNewRow; //定义插入行对象 var oNew ...
- 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...
- 32、可以拿来用的JavaScript实用功能代码
可以拿来用的JavaScript实用功能代码(可能会有些bug,用时稍微修改下,我用了几个还可以) 转载自 1.原生JavaScript实现字符串长度截取 function cutstr(str, l ...
- JavaScript standard 代码规范的全文
这是 JavaScript standard 代码规范的全文. 掌握本规范的最好方法是安装并在自己的代码中使用它. 细则 使用两个空格进行缩进. eslint: indent function hel ...
- Javascript特效代码大全(420个)(转)
转载自:Javascript特效代码大全(420个) 收集资料,以便使用+面试+学习 ├ Cookie脚本 ├ 随访问次数变提示 ├ 集成Cookies ├ 使窗口仅弹出一次 ├ 签名提示程序 ├ ...
随机推荐
- javaScript年份下拉列表框内容为当前年份及前后50年
javascript下拉列表框,内容为当前年份及前后50年,默认选择为当前年份 <script language="javascript" type="text/j ...
- Ionic APP 热更新 之 产品发布状态下的热更新搭建,去local-dev-addon插件
上一篇,我们介绍了在本地开发环境下的ionic项目热更新测试, 本文,我们将详细说明如何在去掉cordova-hot-code-push-local-dev-addon插件的情况下,实现热更新. 使用 ...
- Spring界的HelloWorld
1.Spring依赖的jar包下载网址: https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-loca ...
- JVM学习网址(收集总结)
1.文章分类 - JVM调优总结 JVM综合调优汇总 星火燎原智勇 2018-08-16 11:11 阅读:8 评论:0 JVM调优04-概括总结 星火燎原智勇 2017-01-08 23:28 ...
- Code Signal_练习题_adjacentElementsProduct
Given an array of integers, find the pair of adjacent elements that has the largest product and retu ...
- springMVC 简单应用
一,controller FileController package com.dkt.controller; import java.io.File; import java.io.FileInpu ...
- 基于jQuery的软键盘
基于jQuery的软键盘 前些天写了一个基于基于jQuery的数字键盘,今天给大家带来一个基于jQuery的全字母键盘插件(支持全字母大小写切换,数字输入,退格清除,关闭功能,可调整大小和键盘位置 ...
- 高斯消元与期望DP
高斯消元可以解决一系列DP序混乱的无向图上(期望)DP DP序 DP序是一道DP的所有状态的一个排列,使状态x所需的所有前置状态都位于状态x前: (通俗的说,在一个状态转移方程中‘=’左侧的状态应该在 ...
- CentOS 7 搭建PXC 数据库集群
CentOS 7 搭建PXC 数据库集群 PXC( Percona XtraDB Cluster ) 特点如下: 1.同步复制,事务要么在所有节点提交或不提交,保证了数据的强一致性. 2.多主复制,可 ...
- opencv3.2.0形态学滤波之开运算、闭运算
/* 一.开运算: (1)开运算,其实就是先腐蚀后膨胀的过程. (2)数学表达式:dst = open(src,element) = dilate(erode(src,element)) (3)作用: ...