[英]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.