Как правильно построить трехмерную поверхность с помощью ZXYPositions в ilNumerics? - PullRequest
0 голосов
/ 08 мая 2019

Чего я хочу достичь?

Я работаю над эволюционным алгоритмом нахождения минимума / максимума нелинейных функций.У меня полнофункциональное приложение WPF, но отсутствует одна функция: 3D-графики .

В чем проблема?

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

Проблема визуализации:

Итак, вот как это ведет себя в данный момент

error

Это графики нелинейной функции: 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,
    }
};

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

Построить только точки данных.

В конце мне нужно добавить, что когда я не создаю объект поверхности и строю только точки данных, это выглядит гораздо более разумно:

correct

Но, к сожалению, это не то, что я ищу.Я хочу создать поверхность с этими данными.

1 Ответ

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

Хорошие новости!

Я нашел ответ.Как ни странно, почти все было хорошо ... Я неправильно понял только одну вещь.Когда я передаю аргумент ZXYPositions на поверхность, он может ожидать, что только данные Z от меня будут правильно отображать график.

Что я изменил, чтобы заставить его работать

Теперь два первых цикла for выглядят какчто:

sigma = data;

Как вы можете видеть, они больше не являются циклами, потому что сигма теперь содержит только координаты "решения" (которые являются координатами Z), поэтому мне нужно просто присвоить массив данных сигме.

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

var B = ILMath.tosingle(sigma);
var scene = new PlotCube(twoDMode: false) {
         // add a surface
         new Surface(B) {
                 // make thin transparent wireframes
                 Wireframe = { Color = Color.FromArgb(50, Color.LightGray) },
                 // choose a different colormap
                 Colormap = Colormaps.Jet,
         }
};
scene.Axes.XAxis.Max = (float)arguments[0].Maximum;
scene.Axes.XAxis.Min = (float)arguments[0].Minimum;
scene.Axes.YAxis.Max = (float)arguments[1].Maximum;
scene.Axes.YAxis.Min = (float)arguments[1].Minimum;
scene.First<PlotCube>().Rotation = Matrix4.Rotation(new Vector3(1f, 0.23f, 1), 0.7f);

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

Окончательные результаты

Здесь у вас есть окончательные результаты: heart

...