Полиномиальная интерполяция в Javascript для кривых - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь получить полиномиальную интерполяцию для моей кривой.Я могу получить простой результат для 3 простых точек, но я хочу получить лучший результат для всей моей кривой.

Я нуб.Спасибо за вашу помощь!Мой код:

var list_dots = [6, 4.5, 6, 4.5, 6, 7.5, 6, 4.5, 3, 1.5, 0, 0, 0, 3, 4.5, 6, 7.5, 6, 7.5, 6, 4.5, 6, 4.5, 3, 1.5, 0, 0, 0, 0, 3, 1.5, 3, 4.5, 3, 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1.5, 0, 0, 3, 1.5, 0, 0, 0, 3, 1.5, 0, 3, 1.5, 0, 0, 0, 0, 0, 3, 1.5, 0, 0, 0, 0, 0, 0, 0, 3, 4.5, 3, 1.5, 3, 1.5, 0, 0, 0, 0, 3, 4.5, 3, 4.5, 6, 4.5, 3, 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1.5, 0, 3, 1.5, 0, 0, 0, 0, 0, 0, 3, 1.5, 3, 1.5, 0, 0, 0, 0, 0, 3, 1.5, 3, 1.5, 3, 1.5, 3, 1.5, 0, 3, ];

//list_dots
base.beginPath();
base.lineWidth = 2;
base.strokeStyle = '#aaa';
for (var i = 0; i < list_dots.length; i++) {
  base.lineTo(i * 10, (size_canvas_y / 2) - (list_dots[i] * 10));
}
base.stroke();
base.closePath();

//date line interpolation
base.beginPath();
base.lineWidth = 2;
base.strokeStyle = '#F00';
base.moveTo(0, size_canvas_y / 2);
for (var i = 0; i < list_dots.length; i++) {
  if (i > 5) {
    var x = i;
    var x1 = i - 1;
    var x2 = i - 2;
    var x3 = i - 3;
    var y1 = list_dots[i - 1];
    var y2 = list_dots[i - 2];
    var y3 = list_dots[i - 3];
    var y = ((x - x2) * (x - x3)) / ((x1 - x2) * (x1 - x3)) * y1 +
      ((x - x1) * (x - x3)) / ((x2 - x1) * (x2 - x3)) * y2 +
      ((x - x1) * (x - x2)) / ((x3 - x1) * (x3 - x2)) * y3;
  }

  base.lineTo(i * 10, (size_canvas_y / 2) - y * 10);
}

base.stroke();
base.closePath();

Я также пробовал этот код:

var xp = 1 ;
var yp = 1 ;
for ( var i=1 ; i<list_dots.length ; i+=10) 
    {
    var p = 1 ;
    for ( var j=1 ; j<list_dots.length ; j+=10) 
        {
        if ( i != j )
            {
            p = p * ( (i - list_dots[j]) / (list_dots[i] - list_dots[j]) ) ;
            }
        }
        yp = yp + (p * list_dots[i]) ;
    base.lineTo(         i*10       ,          (size_canvas_y/2) - yp*10               );
    }
...