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