簡體   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