Чего я хочу достичь?
Я работаю над эволюционным алгоритмом нахождения минимума / максимума нелинейных функций.У меня полнофункциональное приложение WPF, но отсутствует одна функция: 3D-графики .
В чем проблема?
Для этого я начал с бесплатной пробной версии ilNumerics , которые обеспечивают трехмерную визуализацию данных.Он прекрасно работает с примерами из документации, но есть кое-что, что мешает мне правильно строить свои собственные трехмерные графики.
Проблема визуализации:
Итак, вот как это ведет себя в данный момент
Это графики нелинейной функции: x1 ^ 4 + x2 ^ 4-0,62 * x1 ^ 2-0,62 * x2 ^ 2
Левая сторона : контур получен с помощью OxyPlot
Правая сторона : 3D-график получен с помощью ilNumerics
Как вы можете видеть, контур OxyPlot совершенно точный, а 3D-график, которыйЯ пытаюсь построить с точно такими же данными не совсем правильно.
Как выполняется реальное (не работающее) решение?
Я пытаюсь визуализировать3D поверхность с использованием точек в пространстве.У ILNumerics есть класс Surface , который я должен создать, чтобы построить свой график.Он имеет следующий конструктор:
public Surface(InArray<float> ZXYPositions, InArray<float> C = null, Tuple<float, float> colorsDataRange = null, Colormap colormap = null, object tag = null);
, где, как вы можете видеть, ZXYPositions - это то, с чем у меня на самом деле проблема.Перед созданием объекта Surface я создаю массив, подобный следующему:
int m = 0;
for (int i = 0; i < p; ++i)
{
for (int j = 0; j < p; ++j)
{
sigma[m, 0] = (float)data[i, j];
sigma[m, 1] = (float)xy[0][i];
sigma[m, 2] = (float)xy[1][j];
m++;
}
}
где sigma [m, 0] = Z;сигма [м, 1] = X;сигма [м, 2] = Y;
И вот в чем проблема.Я не могу найти никакой логической ошибки в этом подходе.Вот код, отвечающий за создание объекта, который я передаю на панель графиков ilNumerics:
var scene = new PlotCube(twoDMode: false) {
// add a surface
new Surface(sigma) {
// make thin transparent wireframes
Wireframe = { Color = Color.FromArgb(50, Color.LightGray) },
// choose a different colormap
Colormap = Colormaps.Jet,
}
};
Дополнительно хочу сказать, что массив сигма построен правильно, потому что я распечатал его значения, и ониопределенно правильно.
Построить только точки данных.
В конце мне нужно добавить, что когда я не создаю объект поверхности и строю только точки данных, это выглядит гораздо более разумно:
Но, к сожалению, это не то, что я ищу.Я хочу создать поверхность с этими данными.