#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 . Добавьте дополнительные проверки, если это может быть так.
При этом используется линейная интерполяция. См.: Линейная интерполяция (Википедия).