LINUX.ORG.RU

Надо получить кривую по пяти точкам в данной системе координат

 , , ,


0

1
x     y
10    0.2
4     1
3     2
2     3
1     10
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatable" content="ie=edge">
    <title>Document</title>
  </head>
  <div id="container"></div>
  <body>
    <script type="module">

import * as d3 from "https://cdn.jsdelivr.net/npm/d3@7/+esm";

// Declare the chart dimensions and margins.
const width = 640;
const height = 400;
const marginTop = 20;
const marginRight = 20;
const marginBottom = 30;
const marginLeft = 40;

// Declare the x (horizontal position) scale.
      const x = d3.scaleLog()
	    .domain([0.2, 60])
    .range([marginLeft, width - marginRight]);

// Declare the y (vertical position) scale.
const y = d3.scaleLog()
    .domain([0.1, 100])
    .range([height - marginBottom, marginTop]);

// Create the SVG container.
const svg = d3.create("svg")
    .attr("width", width)
    .attr("height", height);

// Add the x-axis.
svg.append("g")
    .attr("transform", `translate(0,${height - marginBottom})`)
    .call(d3.axisBottom(x));

// Add the y-axis.
svg.append("g")
    .attr("transform", `translate(${marginLeft},0)`)
    .call(d3.axisLeft(y));

// Append the SVG element.
container.append(svg.node());

</script>
</body>
</html>

Так и не понятно, что тебе надо.

Какую кривую? Надо по 5 точкам интерполировать функцию и её нарисовать? Тогда ищи-свищи какие-нибудь мат. библиотеки или реализуй какой-нибудь простенький алгоритм:

  1. интерполяционный многочлен Лагранжа
  2. интерполяционный многочлен Ньютона
  3. интерполяция кубическими сплайнами (самый точный из приведенных, и всё ещё достаточно простой)

Или просто как-то нахреначить рисунок? Тогда можешь нарисовать ломанную или соединить несколько кривых Безье… Тоже получится кривая. Тогда тебе, скорее всего, нужно это: https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths

witaway
()
Ответ на: комментарий от witaway

Что не понятного, 5 точек есть и надо построить по ним кривую. Слово интерполировать употреблять не нужно.

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

потом попробую

<svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
  <path d="M 10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" stroke="black" fill="transparent"/>
</svg>

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 2)
Ответ на: комментарий от saufesma

Что не понятного, 5 точек есть и надо построить по ним кривую.

Стройте, не понятно в чем проблема - @witaway все правильно сказал. Я бы еще бета-сплайны добавил в список, но выбор зависит от Ваших требований к интерполяции - нужна ли монотонность? Производная какого порядка должна быть непрерывна? Есть ли какая то априорная информация о виде кривой?

Слово интерполировать употреблять не нужно.

«Неприличными словами не выражаться!»(с) Полиграф Полиграфович, перелогиньтесь.

Реши интерполяционный многочлен Ньютона

Вам «нужно решить весь график» или таки не весь?! Определитесь уже со своими надобностями.

Запасся попкорном.

PS Я бы сказал что это гипербола или экспонента, если бы средняя точка не выбивалась - три средних точки лежат на одной прямой. Похоже на ошибку во входных данных.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от saufesma

Что не понятного, 5 точек есть и надо построить по ним кривую

Дык всё у вас непонятно. Вы рассказываете нам некий образ конечного результата, который хотите получить — но этому описанию соответствует сразу неприлично много вариантов того, что вы на самом деле можете иметь в виду.

Одной фразы и куска входных данных недостаточно, вот вас и не понимают.

В одном сообщении пишете «построить кривую», а в другом уже «получить кривую».

То, что её надо как минимум вывести на экран вроде понятно из контекста, вы кусок JS-кода выкинули.

А вот как именно построить и что значит «получить» уже вопрос непонятный. Ломаная линия — тоже в своём роде кривая. Можете по координатам вывести её.

Но удовлетворит ли вас такой результат? Или хотите некой плавности? Ну тогда вам d3 и svg вряд ли будет достаточно.

Хотите плавно и точно? Вот вам в руки техники интерполяции. Реализацию найдёте в интернете. Тогда находите недостающие точки и строите уже по ним.

witaway
()
Ответ на: комментарий от saufesma

Слово интерполировать употреблять не нужно.

Т.е. тебя устроит любая кривая от балды даже если она мёртвые петли будет делать? Тогда всё ещё проще. Бери и рисуй.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Я не про это. Есть график, есть 5 точек, на форуме один умнее другого, что может быть проще как написать кусочек кода вставить в код таблицы и показать мне как это реализуется.

У меня реализовать это пока не получается!

Да и, я Вас забанил.

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от peregrine

Просто ты «не смог решить весь график»!(с) ТС

@hobbit, я бы ТС-а забанил или как минимум провел бы с ним воспитательную работу - он такие кунтюшки уже которую тему подряд откалывает… ;-(

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от saufesma

Через одну точку можно провести бесконечное множество прямых.

Через две точки можно провести бесконечно множество парабол (при условии что у точек разные x).

Через n точек с разными x можно провести бесконечное множество полиномов порядка n (потому что у такого полинома есть n+1 коэффициент).

Вот такая вот бессердечная стерва эта математика… тяжко Вам?

AntonI ★★★★★
()
Ответ на: комментарий от anonymous

Хотел кинуть пример который делает вот именно это, но расхотел

Ну и ладно.

Научитесь общаться для начала.

Прошу прошения, а Вы, что считаете себя мастером общения? Или Вы считаете кого-то таковым из этого треда? Поделитесь пожалуйста своими мыслями, а то Ваше заявление является простым оскорблением на которое я должен отреагировать достаточно грубо чтобы сохранить своё лицо перед аудиторией даже если эта аудитория мне отнюдь не нравится.

saufesma
() автор топика
Ответ на: комментарий от saufesma

Ваше заявление является простым оскорблением на которое я должен отреагировать достаточно грубо чтобы сохранить своё лицо перед аудиторией

Не волнуйтесь, Вы окончательно и бесповоротно потеряли лицо перед аудиторией еще две темы назад.

AntonI ★★★★★
()
Ответ на: комментарий от saufesma

Вы либо очень жирный тролль, либо неуч, либо ни один из упомянутых терминов не удосужились загуглить.

А вроде бы вам привели варианты решений и объяснений на все возможные случаи. И когда нужна какого-либо рода аппроксимация, и когда не нужна. И объяснили, что кривых может проходить бесконечно много. И объяснили, что можно упростить задачу до построения ломанной.

Ссылку на доку по SVG мы вам также привели. Нужный вам кейс описан в самом начале той страницы.

Что тогда мешает? К чему это хамство?

witaway
()
Ответ на: комментарий от saufesma

на которое я должен отреагировать достаточно грубо чтобы сохранить своё лицо перед аудиторией

Вы серьёзно cчитаете что через грубость можно сохранить лицо?! Лицо вы уже потеряли, и закапываете себя ещё глубже. Поздравляю, здешняя аудитория вам уже ничем помогать не станет, тем более что и помощь-то вы принять не в состоянии.

anonymous
()

Задача решается достаточно просто

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatable" content="ie=edge">
    <title>Document</title>
  </head>
  <div id="container"></div>
  <body>
    <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
    <script type="module">
      // Curved line declaration
      const data = [{xpoint: 10, ypoint: 0.2},
		    {xpoint: 4, ypoint: 1},
		    {xpoint: 3, ypoint: 2},
		    {xpoint: 2, ypoint: 3},
		    {xpoint: 1, ypoint: 10}];
// Declare the chart dimensions and margins.
const width = 640;
const height = 400;
const marginTop = 20;
const marginRight = 20;
const marginBottom = 30;
const marginLeft = 40;

// Declare the x (horizontal position) scale.
      const x = d3.scaleLog()
	    .domain([0.2, 60])
    .range([marginLeft, width - marginRight]);

// Declare the y (vertical position) scale.
const y = d3.scaleLog()
    .domain([0.1, 100])
    .range([height - marginBottom, marginTop]);

  
      
  // Declare the line generator.
      const line = d3.line()
	.x((d) => x(d.xpoint))
	.y((d) => y(d.ypoint))
        .curve(d3.curveCatmullRom.alpha(0.5));
      
      
// Create the SVG container.
const svg = d3.create("svg")
    .attr("width", width)
    .attr("height", height);

// Add the x-axis.
svg.append("g")
    .attr("transform", `translate(0,${height - marginBottom})`)
    .call(d3.axisBottom(x));

// Add the y-axis.
svg.append("g")
    .attr("transform", `translate(${marginLeft},0)`)
    .call(d3.axisLeft(y));

  // Append a path for the line.
  svg.append("path")
    .attr("fill", "none")
      .attr("stroke", "steelblue")
      .attr("stroke-width", 1.5)
    .attr("d", line(data));

 
    
// Append the SVG element.
container.append(svg.node());

</script>
</body>
</html>

Господа умники witaway, AntonI, peregrine , научитесь для начала читать и понимать, что написано. И вы увидите, что вы не тянете вопроса. Всё, что вы тут понаписали является пустой хернёй. Которая вызывает чувство брезгливости.

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от saufesma

.curve(d3.curveCatmullRom.alpha(0.5))

Curves turn a discrete (pointwise) representation of a line or area into a continuous shape.

curveCatmullRom(context). Produces a cubic Catmull–Rom spline using the specified control points

Слово интерполировать употреблять не нужно.

Мы предлагали вам соеденить прямыми и получить ломанную кривую, соединить кривыми Безье и получить ещё одну кривую, интерполировать тем или иным методом и тоже получить кривую. Кстати, вы удивитесь, но всё это - разные кривые, которые удовлетворяют поставленной вами задаче, и все эти варианты приведены в документации. Вы выбрали интерполировать через сплайны. С чем вас и поздравляю.

Просто уточняйте в следующий раз как-то подробнее, что в вашем понимании значит «получить». У читающего ваше сообщение это слово легко раскрывается в целую дюжину совершенно разных опций.

witaway
()
Ответ на: комментарий от saufesma

С полным уважением, если можете - старайтесь не оставлять собеседникам целое пространство возможных интерпретаций ваших слов. Сужайте, уточняйте. Мы у вас тоже пытались уточнять.

Просто «по пяти точкам получить кривую» нельзя. В вашем случае, можно по пяти точкам найти такую кривую, которая будет максимально точно предсказывать исходную неизвестную функцию, и отобразить её на экран, используя для этого библиотеку D3.

Кусок кода без дополнительных пояснений также вводит в ступор. Он вообще для чего? Это очень косвенное пояснение, что надо использовать D3? Или это шаблон, в который нужно вставить ещё один кусок кода? Или это ваша предыдущая попытка выполнить задачу?

Может быть, вы что-то до этого пробовали? Тогда расскажите.

Я не пытаюсь строить из вас дурака. Это всего-лишь вопрос взаимного понимания. Чем точнее вы даёте запрос и чем точнее вы отвечаете на встречные вопросы, тем больше вероятность получить точный и релевантный ответ.

witaway
()

Надо получить кривую по пяти точкам в данной системе координат

Эта задача равносильна найти символьное представление функции (не рядов).
Мне не известны алгоритмы, которые решают эту задачу.
Пяти значений крайне мало для решения этой задачи.
Когда сможете найти символьнре представление функции, тогда и график не проблема построить.

Задача крайне интересная.
Надеюсь появится время ней позаниматься.

Forum0888
()
Ответ на: комментарий от Forum0888

Мне не известны алгоритмы, которые решают эту задачу.

Изначально графики строились так. Ставился опыт, ставилась точка и этих опытов и точек было великое множество. Потом эти точки интерполировались и строились графики, но графики получились огромные и неудобные для использования. Тогда и было принято решение использовать логарифмический масштаб для построения этих графиков. Я же эти графики просто пытаюсь перенести на комп в удобном для работы варианте и всё.

Задача крайне интересная.

Не стоит греть голову.

saufesma
() автор топика
Ответ на: комментарий от witaway

У ТСа есть огромная проблема - он общепринятой терминологией не владеет и поэтому свой поток сознания формулирует весьма причудливо. Одна его фраза «решить весь график» из предыдущей темы дорогого стоит… даже я, имея опыт преподавания 25 лет в т.ч. в довольно странных местах не понимаю что он имеет ввиду. Всё это усугубляется специфической манерой общения - на вопросы ТС не отвечает, легко возбуждается и начинает хамить (раз его не поняли значит дураки).

Но цирк получается временами неплохой.

AntonI ★★★★★
()
Ответ на: комментарий от saufesma

Не стоит греть голову.

Очень даже стоит.
Например формулу коперника можно было таким способом найти в пять минут.
У исследователей в физике много всяческих экспериментальных данных и они десятилетиями не могут их обобщить в виде формулы.

Forum0888
()
Ответ на: комментарий от Forum0888

С тех пор как появился curve_fitting под любой набор экспериментальных данных формула подбирается без проблем.

Иногда так действительно удаётся найти какие то закономерности.

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

С тех пор как появился curve_fitting под любой набор экспериментальных данных формула подбирается без проблем.

То бишь по данным о движении планет формулу Коперника можно вывести?

Forum0888
()
Ответ на: комментарий от Forum0888

Можно конечно.

Меня почему умиляют пассажи ТС что дескать я «вопроса не тяну» - я последние 10 лет постоянно строю разные хитрые аппроксимации для каких то жутких нелинейных многомерных данных (иногда удаётся выходить на точность 1e-5), буржуйские конференции по аппроксимации все мыло спамом забили - поэтому то что тут ТС выдаёт выглядит особенно забавно:-)

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от anonymous

Эллипс и окружность не могут пересекаться более чем в четырёх точках.

ps. А то некоторые на ю-тубах строят эллипс из нескольких окружностей. Не выйдет!

anonymous
()