Advertisement
overloop

my-spline.js

Oct 28th, 2015
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function toVector(a,p,r) {
  2.     return [p[0] + Math.cos(a)*r,p[1] + Math.sin(a)*r];
  3. }
  4.  
  5. function opposite(a) {
  6.     return a>0?a-Math.PI:a+Math.PI;
  7. }
  8.  
  9. function connectTwo(a1,r1,p1,a2,r2,p2) {
  10.     var a2o = opposite(a2);
  11.     var p1h = toVector(a1,p1,r1);
  12.     var p2h = toVector(a2o,p2,r2);
  13.     //console.log([a2o,p1h,p2h]);
  14.     return [p1h,p2h];
  15. }
  16.  
  17. function getAngle(p1,p2,p3) {
  18.     return Math.atan2(p3[1]-p1[1],p3[0]-p1[0]);
  19. }
  20.  
  21. function genData(n) {
  22.   var data = [];
  23.   for (var i=0;i<n;i++) {
  24.     data.push([Math.floor(Math.random()*20+1)*20,Math.floor(Math.random()*20+1)*20]);
  25.   }
  26.   console.log(JSON.stringify(data));
  27. }
  28.  
  29. genData(10);
  30.  
  31. function dist(p1,p2) {
  32.   return Math.sqrt(Math.pow(p2[0]-p1[0],2)+Math.pow(p2[1]-p1[1],2));
  33. }
  34.  
  35. function pointsToPath(ps) {
  36.   var result = [];
  37.   result.push('M' + Math.round(ps[0][0]) + ' ' + Math.round(ps[0][1]) + 'C');
  38.   for (var i=0;i<ps.length;i++) {
  39.     result.push(Math.round(ps[i][0]) + ' ' + Math.round(ps[i][1]) + ' ');
  40.   }
  41.   return result.join('');
  42. }
  43.  
  44. function arrayInsert(a,i,v) {
  45.   a.splice(i,0,v);
  46. }
  47.  
  48. function arrayRemoveAt(a,i) {
  49.   var es = a.splice(i,1);
  50.   return es[0];
  51. }
  52.  
  53. function orderByDist(data) {
  54.   var minIndex = 0;
  55.   for (var i=1;i<data.length;i++) {
  56.     if(dist([0,0],data[i]) < dist([0,0],data[minIndex])) {
  57.       minIndex = i;
  58.     }
  59.   }
  60.   if (minIndex > 0) {
  61.     var e = arrayRemoveAt(data,minIndex);
  62.     arrayInsert(data,0,e);
  63.   }
  64.   for (var i=1;i<data.length-1;i++) {
  65.     var minDist = dist(data[i-1],data[i]);
  66.     var minIndex = i;
  67.     for (var j=i+1;j<data.length;j++) {
  68.       if (dist(data[i-1],data[j]) < minDist) {
  69.         minIndex = j;
  70.         minDist = dist(data[i-1],data[j]);
  71.       }
  72.     }
  73.     if (minIndex != i) {
  74.       var e = arrayRemoveAt(data,minIndex);
  75.       arrayInsert(data,i,e);
  76.     }
  77.   }
  78. }
  79.  
  80. function pathMoveTo(p) {
  81.   return 'M' + Math.round(p[0]) + ' ' + Math.round(p[1]);
  82. }
  83.  
  84. function pathCurveTo(p1,p2,p) {
  85.   return 'C' + Math.round(p1[0]) + ' ' + Math.round(p1[1]) + ' ' + Math.round(p2[0]) + ' ' + Math.round(p2[1]) + ' ' + Math.round(p[0]) + ' ' + Math.round(p[1]);
  86. }
  87.  
  88. $(document).ready(function(){
  89.     var data = [[40,340],[60,200],[140,200],[20,80],[120,360],[280,200],[60,80],[180,40],[40,280],[200,240]];
  90.     console.log(JSON.stringify(data));
  91.     orderByDist(data);
  92.     console.log(JSON.stringify(data));
  93.     var paper = Raphael('canvas', 400, 400);
  94.     var c = paper.path();
  95.     for (var i=0;i<data.length;i++) {
  96.       paper.circle(data[i][0],data[i][1],(i+2)*2);
  97.     }
  98.     var angles = [];
  99.     angles.push(-Math.PI/2+0.7);
  100.     for (var i=1;i<data.length-1;i++) {
  101.       angles.push(getAngle(data[i-1],data[i],data[i+1]));
  102.     }
  103.     angles.push(Math.PI/2+0.2);
  104.     /*var angles_ = [];
  105.     angles.forEach(function(e){
  106.       angles_.push(Math.floor(e/Math.PI*180));
  107.       });
  108.     console.log(angles_);*/
  109.  
  110.     var dists = [];
  111.     for (var i=0;i<data.length;i++) {
  112.       if (i<data.length-1) {
  113.         dists.push(dist(data[i],data[i+1]));
  114.       } else {
  115.         dists.push(dists[dists.length-1]);
  116.       }
  117.     }
  118.     dists.push(dists[dists.length-1]);
  119.  
  120.     var path = [pathMoveTo(data[0])];
  121.     for (var i=0;i<data.length-1;i++) {
  122.       var k = 0.5;
  123.      
  124.       var p1p2 = connectTwo(angles[i],dists[i]*k,data[i],angles[i+1],dists[i+1]*k,data[i+1]);
  125.       var p1 = p1p2[0];
  126.       var p2 = p1p2[1];
  127.       c = paper.rect(p1[0],p1[1],3,3);
  128.       c.attr('stroke',"#ff0000");
  129.       c = paper.rect(p2[0],p2[1],3,3);
  130.       c.attr('stroke',"#00ff00");
  131.      // path.push(p1,p2,data[i+1]);
  132.      path.push(pathCurveTo(p1,p2,data[i+1]));
  133.     }
  134.     //console.log(pointsToPath(path));
  135.     //c = paper.path('M180 90C180 90 199 67 207 53 180 30 153 7 132 26 110 30 88 34 98 -5 70 50');
  136.     path = path.join('');
  137.     c = paper.path(path);
  138.     c.attr('stroke-width',3);
  139.     c.attr('stroke',"#0000ff");
  140.     //console.log(path);
  141. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement