#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 /