代码是通过网上一个winform代码中提取修改而来的。后转为javascript 版本。

  1. /*
  2. points = new Array();
  3. points.push({x:1,y:2});
  4. */
  5. function Spline(points) {
  6. var NewArrayFloat = function(n) {
  7. var arr = new Array(n);
  8. for (var i = 0; i < n; i++) {
  9. arr[i] = 0.0;
  10. }
  11. return arr;
  12. }
  13. /*
  14. C# (float[] sub, float[] diag, float[] sup, ref float[] b, int n)
  15. Js return float[] b;
  16. */
  17. var solveTridiag = function(sub, diag, sup, b, n) {
  18. /*
  19. solve linear system with tridiagonal n by n matrix a
  20. using Gaussian elimination *without* pivoting
  21. where a(i,i-1) = sub[i] for 2<=i<=n
  22. a(i,i) = diag[i] for 1<=i<=n
  23. a(i,i+1) = sup[i] for 1<=i<=n-1
  24. (the values sub[1], sup[n] are ignored)
  25. right hand side vector b[1:n] is overwritten with solution
  26. NOTE: 1...n is used in all arrays, 0 is unused */
  27. var i;
  28. /*factorization and forward substitution */
  29. for (i = 2; i <= n; i++) {
  30. sub[i] = sub[i] / diag[i - 1];
  31. diag[i] = diag[i] - sub[i] * sup[i - 1];
  32. b[i] = b[i] - sub[i] * b[i - 1];
  33. }
  34. b[n] = b[n] / diag[n];
  35. for (i = n - 1; i >= 1; i--) {
  36. b[i] = (b[i] - sup[i] * b[i + 1]) / diag[i];
  37. }
  38. return b;
  39. }
  40.  
  41. var resultPoint = new Array();
  42. var precision = 10;
  43.  
  44. var np = points.length;
  45. var yCoords = NewArrayFloat(np);
  46. var xCoords = NewArrayFloat(np);
  47. var x;
  48. var y;
  49. var oldy = 0;
  50. var oldx = 0;
  51.  
  52. var npp = np * precision;
  53.  
  54. // draw a border around the canvas
  55. if (np > 0) {
  56. // draw the control points
  57. for (var i = 0; i < np; i++) {
  58. var p = { x: points[i].x, y: points[i].y };
  59. xCoords[i] = p.x;
  60. yCoords[i] = p.y;
  61. }
  62.  
  63. if (np > 1) {
  64. var a = new NewArrayFloat(np);
  65. var x1;
  66. var x2;
  67. var h = new NewArrayFloat(np);
  68. for (var i = 1; i <= np - 1; i++) {
  69. h[i] = xCoords[i] - xCoords[i - 1];
  70. }
  71. if (np > 2) {
  72. var sub = NewArrayFloat(np - 1);
  73. var diag = NewArrayFloat(np - 1);
  74. var sup = NewArrayFloat(np - 1);
  75.  
  76. for (var i = 1; i <= np - 2; i++) {
  77. diag[i] = (h[i] + h[i + 1]) / 3;
  78. sup[i] = h[i + 1] / 6;
  79. sub[i] = h[i] / 6;
  80. a[i] = (yCoords[i + 1] - yCoords[i]) / h[i + 1] - (yCoords[i] - yCoords[i - 1]) / h[i];
  81. }
  82.  
  83. //C# CODE param [a] = [ref a];
  84. a = solveTridiag(sub, diag, sup, a, np - 2);
  85. }
  86. // note that a[0]=a[np-1]=0
  87.  
  88. oldx = xCoords[0];
  89. oldy = yCoords[0];
  90.  
  91. resultPoint.push({ x: oldx, y: oldy });
  92.  
  93. for (var i = 1; i <= np - 1; i++) {
  94. // loop over intervals between nodes
  95. for (var j = 1; j <= precision; j++) {
  96. x1 = (h[i] * j) / precision;
  97. x2 = h[i] - x1;
  98. y = ((-a[i - 1] / 6 * (x2 + h[i]) * x1 + yCoords[i - 1]) * x2 +
  99. (-a[i] / 6 * (x1 + h[i]) * x2 + yCoords[i]) * x1) / h[i];
  100. x = xCoords[i - 1] + x1;
  101.  
  102. resultPoint.push({ x: x, y: y });
  103.  
  104. oldx = x;
  105. oldy = y;
  106. }
  107. }
  108. }
  109. }
  110. return resultPoint;
  111. }

javascript Spline代码的更多相关文章

  1. javascript两行代码按指定格式输出日期时间

    javascript两行代码按指定格式输出日期时间,具体看代码: function date2str(x,y) { var z ={y:x.getFullYear(),M:x.getMonth()+1 ...

  2. javascript常用代码大全

    http://caibaojian.com/288.html    原文链接 jquery选中radio //如果之前有选中的,则把选中radio取消掉 $("#tj_cat .pro_ca ...

  3. JSLint是一个JavaScript的代码质量工具

    JSLint是一个JavaScript的代码质量工具 可能都或多或少的知道JSLint是一个JavaScript的代码质量工具,一个JavaScript语法检查器和校验器,它能分析JavaScript ...

  4. javascript实现代码高亮

    javascript实现代码高亮-wangHighLighter.js 1. 引言 (先贴出wangHighLighter.js的github地址:https://github.com/wangfup ...

  5. JavaScript后台代码操作HTML TABLE的方法

    原文:JavaScript后台代码操作HTML TABLE的方法 var rowNum = 0,fileNum = 0; //行号与列号 var oNewRow; //定义插入行对象 var oNew ...

  6. 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)

    记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...

  7. 32、可以拿来用的JavaScript实用功能代码

    可以拿来用的JavaScript实用功能代码(可能会有些bug,用时稍微修改下,我用了几个还可以) 转载自 1.原生JavaScript实现字符串长度截取 function cutstr(str, l ...

  8. JavaScript standard 代码规范的全文

    这是 JavaScript standard 代码规范的全文. 掌握本规范的最好方法是安装并在自己的代码中使用它. 细则 使用两个空格进行缩进. eslint: indent function hel ...

  9. Javascript特效代码大全(420个)(转)

    转载自:Javascript特效代码大全(420个) 收集资料,以便使用+面试+学习  ├ Cookie脚本 ├ 随访问次数变提示 ├ 集成Cookies ├ 使窗口仅弹出一次 ├ 签名提示程序 ├ ...

随机推荐

  1. javaScript年份下拉列表框内容为当前年份及前后50年

    javascript下拉列表框,内容为当前年份及前后50年,默认选择为当前年份 <script language="javascript" type="text/j ...

  2. Ionic APP 热更新 之 产品发布状态下的热更新搭建,去local-dev-addon插件

    上一篇,我们介绍了在本地开发环境下的ionic项目热更新测试, 本文,我们将详细说明如何在去掉cordova-hot-code-push-local-dev-addon插件的情况下,实现热更新. 使用 ...

  3. Spring界的HelloWorld

    1.Spring依赖的jar包下载网址: https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-loca ...

  4. JVM学习网址(收集总结)

    1.文章分类 - JVM调优总结   JVM综合调优汇总 星火燎原智勇 2018-08-16 11:11 阅读:8 评论:0 JVM调优04-概括总结 星火燎原智勇 2017-01-08 23:28 ...

  5. Code Signal_练习题_adjacentElementsProduct

    Given an array of integers, find the pair of adjacent elements that has the largest product and retu ...

  6. springMVC 简单应用

    一,controller FileController package com.dkt.controller; import java.io.File; import java.io.FileInpu ...

  7. 基于jQuery的软键盘

    基于jQuery的软键盘   前些天写了一个基于基于jQuery的数字键盘,今天给大家带来一个基于jQuery的全字母键盘插件(支持全字母大小写切换,数字输入,退格清除,关闭功能,可调整大小和键盘位置 ...

  8. 高斯消元与期望DP

    高斯消元可以解决一系列DP序混乱的无向图上(期望)DP DP序 DP序是一道DP的所有状态的一个排列,使状态x所需的所有前置状态都位于状态x前: (通俗的说,在一个状态转移方程中‘=’左侧的状态应该在 ...

  9. CentOS 7 搭建PXC 数据库集群

    CentOS 7 搭建PXC 数据库集群 PXC( Percona XtraDB Cluster ) 特点如下: 1.同步复制,事务要么在所有节点提交或不提交,保证了数据的强一致性. 2.多主复制,可 ...

  10. opencv3.2.0形态学滤波之开运算、闭运算

    /* 一.开运算: (1)开运算,其实就是先腐蚀后膨胀的过程. (2)数学表达式:dst = open(src,element) = dilate(erode(src,element)) (3)作用: ...