Как сгенерировать линию с точным количеством очков? - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно сгенерировать путь из набора данных из n точек. Я строю кубический сплайн через точки в этом наборе данных. Сгенерированный путь должен содержать точное количество спроецированных точек пути.

Моя проблема не в построении кривой , а в распределении точек пути вдоль оси x для получения пути, состоящего из точного числа path-points. Вот почему я сократил следующий пример до одномерного массива точек, через который должна быть построена прямая линия. Каждая точка в наборе данных должна представлять начало сегмента кривой (даже если кривая действительно является линией из-за упрощения).

Мой текущий наивный подход не точен, то есть он не дает пути, который содержит указанное количество точек (он отклоняется на 4-5 точек в зависимости от плотности набора данных и указанного targetLength).

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

Наивный подход (javascript):

// Array with floating point values constrained between 0 - 1
// Think of each value as the beginning of a line segment.
const dataset = [0, 0.123, 0.3432, 0.454, 0.56, 0.8334, 0.987, 1];

// Path should have this many points
const targetLength = 1024;

// Step distance between points
const delta = 1 / targetLength;

// The path array we're generating
const path = [];

// For each point (segment)
for (let i = 0; i < dataset.length - 1; i++) {

  const x1 = dataset[i]; // current point
  const x2 = dataset[i + 1]; // next point
  const xd = x2 - x1 - delta; // dist between current and next point(-delta)

  // For each step in the segment generate a path-point
  for (let k = 0; k <= xd; k += delta) {
    // For this example we're only pushing the x-value onto the array.
    // In the real implementation I'm calculating a y-value to plot a curve
    // and push an array of [x, y] onto the dataset.
    path.push(dataset[i] + k);
  }

}

// expect: path.length === targetLength
console.log(path.length);

В приведенном выше примере я ожидаю, что path.length будет равен targetLength (1024). Я мог бы взять сгенерированный путь как единое целое и интерполировать весь массив, но я думаю, Я ищу более разумный способ для генерации пути в первую очередь . Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 12 мая 2019

Похоже, что вы хотите, это просто:

for (let i=0; i<targetLength; ++i) {
    path.push(i / (targetLength-1));
}

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

...