C # Интерполирование небольшого массива в массив большего размера

#c# #.net

#c# #.net

Вопрос:

У меня есть два массива двойных X и Y одинакового размера (возможен любой размер). Разница между точками x всегда стабильна. Например, X[1] -X[0] = X[2]-X[1]… Эти два массива вместе образуют кривую (скажем, C1) из (x [i], y [i]) точек.

У меня есть еще одна фиксированная кривая C2, показанная на рисунке:
x-limit, y-limit
(0),(-5)
(1e9),(-5)
(2e9),(-6.5)
(3e9), (-9.2)
(6e9),(-16.5)
(12e9),(-29)

Ограничения

Я хочу иметь возможность проверить, попадает ли C1 или пересекается под C2, но я не могу этого сделать из-за разницы в размере.

То, о чем я думал, — это интерполяция массивов C2 размером 6 в массивы размером, равным размеру массивов C1

Таким образом, у меня было бы два Y-массива одинакового размера (один из C1 и один из C2), и я мог бы проверить разницу. (Если отрицательный, то он ниже предела)

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

Если я могу добавить что-то непонятное, дайте мне знать и поблагодарите вас.

Комментарии:

1. Некоторые примеры данных действительно помогли бы сделать этот вопрос намного более конкретным и понятным. В настоящее время единственное, что я могу представить, это пара массивов из 2000 элементов (двойников? Point s?) и какой-то массив кортежей для пределов? Любой код, который у вас уже есть, всегда полезен для публикации.

2. Что вы подразумеваете под пределом? Пределом для точки в 2d-пространстве будет область. Как этот список предельных точек работает как limit?

3. @OlivierJacot-Descombes Я отредактировал свой вопрос. Точка состоит из x из x-массива и y из y-массива.

4. @HereticMonkey Дело в том, что при построении кривой в терминах x-массива и y-массива она не должна пересекать указанную выше кривую

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

Ответ №1:

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

Предполагая, что сравниваемые точки отсортированы в порядке возрастания, я бы поступил следующим образом:

 double limitX1 = limitX[0];
double limitY1 = limitY[0];

// Create fake point to the left
double limitX0 = -2;
double limitY0 = limitY1;

double f = 0.0;

int actualLimitIndex = 0;
for (int i = 0; i < x.Length; i  ) {
    double x = x[i];
    double y = y[i];

    // Get current limit section
    while (x > limitX1) {
        actualLimitIndex  ;
        limitX0 = limitX1;
        limitY0 = limitY1;
        limitX1 = limitX[actualLimitIndex];
        limitY1 = limitY[actualLimitIndex];
        f = (limitY1 - limitY0) / (limitX1 - limitX0);
    }

    // Interpolate limit
    limitY = limitY0   (x - limitX0) * f;

    // Do whatever you have to do here.
    if (y > limitY) {
        // We are above limit
    } else {
        // We are at or below limit
    }
}
  

Это также предполагает, что никакое значение x не будет ниже минимального или выше максимального значения x-limit . Добавьте дополнительные проверки, если это может быть так.

При этом используется линейная интерполяция. См.: Линейная интерполяция (Википедия).