Как мне найти Y-перехват графика / кривой функции в jsxgraph?

#javascript #geometry #algebra #jsxgraph

#javascript #геометрия #алгебра #jsxgraph

Вопрос:

У меня есть строка функционального графика, определенная следующим образом:

 const f1 = function(x) {
    const slope = me.options.gLine1Slope;
    return (x - 2.5) * slope   2.5;
};

this.l1 = this.board.create('functiongraph', [f1, -30, 30], {
    recursionDepthLow: 8,
    recursionDepthHigh: 15
});

this.l1.setPosition(window.JXG.COORDS_BY_USER, [
    forceFloat(this.options.gLine1OffsetX),
    forceFloat(this.options.gLine1OffsetY)
]);
  

Я знаю, что Functiongraph — это просто оболочка для Curve, поэтому я прочитал оба документа API.

Я вручную позиционирую эту линию на основе этих значений смещения, потому что пользователь может перетаскивать ее по плоскости.

Я могу получить значение, близкое к Y-перехвату, вот так:

 f1(0)   (this.options.gLine1OffsetY - this.options.gLine1OffsetX)
  

Но это не совсем правильно, после того, как эта строка немного перетаскивается. Кто-нибудь может дать некоторые рекомендации о том, как получить Y-перехват для этой кривой? Я полагаю, я могу просто перебрать массив данных точек вдоль этой кривой и выбрать ту, где Y ближе всего к 0. Я просто надеялся, что есть и более простой способ.

Ответ №1:

Вы правы. Получить y-перехват графика функции после его свободного перетаскивания непросто. Причина в том, что перетаскивание объектов в основном реализуется с использованием проективных преобразований. Это усложняет получение y-перехвата кривой, которая видна в данный момент. Самый простой подход, который я могу придумать на данный момент, — это пересечь кривую с вертикальной осью и получить положение этой точки. Вот слегка измененная версия вашего примера:

 const board = JXG.JSXGraph.initBoard('jxgbox', { 
    boundingbox: [-5, 5, 5, -5], axis:true
});

var me = {
    gLine1Slope:2,
    gLine1OffsetX: 1,
    gLine1OffsetY: -1
};

const f1 = function(x) {
    const slope = me.gLine1Slope;
    return x * slope;
};

var l1 = board.create('functiongraph', [f1, -30, 30], {fixed: false});
var p = board.create('intersection', [l1, board.defaultAxes.y], {
            withLabel: false, visible: false});

// Now, we can move the curve and get the y-intercept 
// in p.Y()

l1.setPosition(window.JXG.COORDS_BY_USER, [
    me.gLine1OffsetX,
    me.gLine1OffsetY
]);
board.update();

board.on('up', function(evt) {
    document.getElementById('jxg_debug').value = p.Y();
});
document.getElementById('jxg_debug').value = p.Y();
  

Смотрите это в прямом эфире на https://jsfiddle.net/3s90qx57/2 /