繁体   English   中英

如何在ilNumerics中使用ZXYPositions正确绘制3D表面?

[英]How to properly plot 3D surface with ZXYPositions in ilNumerics?

我想要实现什么?

我正在研究一种发现最小/最大非线性函数的进化算法。 我有完整功能的WPF应用程序,但缺少一个功能: 3D绘图

问题是什么?

为了实现这一目标,我开始免费试用提供3D数据可视化的ilNumerics 它通过文档中的示例完全正常,但有些东西阻止我正确地绘制我自己的3D图形。

可视化问题:

所以,这就是它目前的表现

错误

那些是非线性函数的图:x1 ^ 4 + x2 ^ 4-0.62 * x1 ^ 2-0.62 * x2 ^ 2

左侧 :使用OxyPlot实现轮廓

右侧 :使用ilNumerics实现的3D图形

正如您所看到的,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; sigma [m,1] = X; 西格玛[m,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,
    }
};

另外我想说sigma数组是正确构造的,因为我已经打印出它的值,它们肯定是正确的。

仅绘制数据点。

最后我需要补充一点,当我不创建表面对象并仅绘制数据点时,它看起来更合理:

正确

但遗憾的是,这不是我想要的。 我想用这些数据创建一个表面

好消息!

我找到了答案。 奇怪的是,几乎所有的东西都很好......我只想到了一件事。 当我将ZXYPositions参数传递给surface时,它实际上只能期望我的Z数据正确绘制图形。

我改变了什么让它发挥作用

两个第一个for循环现在看起来像这样:

sigma = data;

正如你所看到的,它们不再是循环,因为sigma现在只包含“解决方案”坐标(它是Z坐标),所以我需要将数据数组分配给sigma。

第二部分,我正在创建Surface现在看起来像这样:

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轴缩放到适当的值。

最终结果

在这里你有最终的结果: 心

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM