Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.
Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...
Как реализовать в данном примере границы расчёта?

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Демо JavaScript: 

Для интерполяции заданной функции необходимо выбрать узлы, через которые будет проходить многочлен Нютона. Необходимо выбрать минимум 3 точки, нажав на левую кнопку мыши (не обязательно нажимать на сам график функции), и нажать кнопку "Старт".

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var imageData;
let x = new Array(canvas.width);
let fx = new Array(canvas.height);
// Массив, через точки которого будет построен ногочлен Ньютона
let xMouse = [];
// Сдвиг координат
let offset = 300;
 
// Получить (x,y) кордианты курсора, в момент нажатия
function getCursorPosition(canvas, event) {
    const rect = canvas.getBoundingClientRect();
    let tmp = (event.clientX - rect.left) | 0;
    xMouse.push(tmp);
}
 
// Интерполируем функцию по заданным точкам
function Newton() {
    let yMouse = [];
    let n = xMouse.length;
    if (n <= 2) {
        alert("Недостаточно узлов интерполяции");
        return;
    }
    // Точки, через которые должен пройти многочлен
    for (let i = 0; i < n; i++) {
        yMouse[i] = fx[xMouse[i]];
    }
    for (let i = 0; i < n; i++) {
        ctx.fillStyle = "purple";
        ctx.fillRect(xMouse[i] - 4, yMouse[i] - 4, 8, 8);
    }
 
    // Массив для раздленымх разностей
    let fi = new Array(n);
    for (let i = 0; i < n; i++) {
        fi[i] = new Array(n).fill(0);
    }
    // Находим разделеные разности
    let k = 0;
    for (let a = 0; a < n; a++) {
        for (let b = 0; b < n; b++) {
            fi[a].shift();
        }
    }
    for (let j = 0; j < n; j++) {
        for (let i = 0; i < n - j; i++) {
            if (j == 0) {
                fi[i].push(yMouse[i]);
            } else {
                fi[i].push((fi[i + 1][j - 1] - fi[i][j - 1]) / (xMouse[i + k] - xMouse[i]));
            }
        }
        k++;
    }
    // Строим полином Ньютона
    let P = [];
    for (let k = 0; k < canvas.width; k++) {
        let Pi = [];
        for (let i = 0; i < n; i++) {
            if (i == 0) {
                Pi.push(fi[0][0]);
            } else {
                let tmp = 1;
                for (let j = 0; j < i; j++) {
                    tmp = tmp * (x[k] + offset - xMouse[j]);
                }
                Pi.push(tmp * fi[0][i]);
            }
        }
        let tmp = 0;
        for (let q = 0; q < n; q++) {
            tmp += Pi[q];
        }
        P.push(tmp);
 
    }
    // Рисуем полином
    ctx.beginPath();
    ctx.lineWidth = 3
    ctx.strokeStyle = "red";
    for (let i = 0; i < canvas.width; i++) {
        if (i == 0) {
            ctx.moveTo(i, P[i]);
        }
        ctx.lineTo(i, P[i]);
    }
    ctx.stroke();
    ctx.closePath();
}
 
function start() {
    // Красим канвас
    ctx.fillStyle = "#ccc";
    ctx.fillRect(0, 0, 600, 600);
    // Рисуем Координатную плоскость
    ctx.beginPath();
    ctx.moveTo(300, 0);
    ctx.lineTo(300, 600);
    ctx.moveTo(0, 300);
    ctx.lineTo(600, 300);
    ctx.stroke();
    ctx.closePath();
    ctx.beginPath();
    // Рисуем функцию
    ctx.lineWidth = 3;
    for (let i = 0; i < canvas.width; i += 1) {
        x[i] = i - offset;
        fx[i] = -Math.abs(x[i] * x[i] / 60 + 2 * x[i] - 70) + offset;
        if (i == 0) {
            ctx.moveTo(x[i] + offset, fx[i]);
        }
        ctx.lineTo(x[i] + offset, fx[i]);
    }
    ctx.stroke();
    ctx.closePath();
    // Клик мыши
    canvas.addEventListener('mousedown', function (e) {
        getCursorPosition(canvas, e)
 
    })
}
 
start();