gpt4 book ai didi

c# - 具有第 4 维标记特殊值的 3D 表面着色

转载 作者:行者123 更新时间:2023-11-30 16:17:41 25 4
gpt4 key购买 nike

我想创建一个如图所示的 3D 曲面图。我正在使用 ILNumerics,recent RC from the website .到目前为止,我可以使用以下代码创建表面(数据仅用于测试):

using System;
using System.Drawing;
using System.Windows.Forms;
using ILNumerics;
using ILNumerics.Drawing;
using ILNumerics.Drawing.Plotting;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}

private void ilPanel1_Load(object sender, EventArgs e) {
using (ILScope.Enter()) {
ILArray<float> R = ILMath.linspace<float>(-4, 4, 100);
ILArray<float> y = 1;
ILArray<float> x = ILMath.meshgrid(R, R, y);

ILArray<float> Z = ILMath.zeros<float>(x.S[0], x.S[1], 3);
Z[":;:;1"] = x; Z[":;:;2"] = y;
Z[":;:;0"] = 0.4f * x * x - 0.2f * y * y * y;

ilPanel1.Scene.Add(new ILPlotCube(twoDMode: false) {
new ILSurface(Z, colormap: Colormaps.Cool) {
Colors = 1.4f * x * x * x + 0.13f * y * y,
Childs = { new ILColorbar() }
}
});
}
}
}
}

surface graph without marked values

用不同颜色标记数据(颜色)值为 0 的所有面的最佳方法是什么?可能使用颜色条是可行的方法吗?但这究竟是如何完成的呢?

最佳答案

这可以使用自定义颜色图来实现。但是必须小心,可靠地做到这一点。简单地在颜色图的中间放置一个新的红色关键点会给出非常不正确的结果......:|

我稍微修改并记录了您的示例。基本上,颜色图包含具有位置和颜色的关键点。位置通常(但不一定)在 [0..1] 范围内。颜色始终在 [0..1] 范围内。这里的挑战是在颜色图范围内找到“0”cdata 值的正确位置。

首先,创建默认的冷色图。它有以下两个关键点(按行):

colorkeys
<Single> [2,5]
[0]: 0,00000 0,00000 1,00000 1,00000 1,00000 <- position: 0, color: RGBA
[1]: 1,00000 1,00000 0,00000 1,00000 1,00000 <- position: 1

您必须添加至少 3 个新关键点:前两个在标记区域的边缘采样原始颜色。第三个为标记区域提供红色。简单地添加红色关键点是行不通的,因为这会影响 map 中的所有值,而不仅仅是 0 附近的数据值。

最后的关键点如下:

colorkeys
<Single> [5,5]
[0]: 0,00000 0,00000 1,00000 1,00000 1,00000
[1]: 1,00000 1,00000 0,00000 1,00000 1,00000
[2]: 0,49150 0,49150 0,50850 1,00000 1,00000
[3]: 0,49702 0,49702 0,50298 1,00000 1,00000
[4]: 0,49426 1,00000 0,00000 0,00000 1,00000

请注意,关键点的顺序并不重要。创建新的颜色图时,无论如何都会对它们进行排序。新 map 只是提供给 ILSurface:

private void ilPanel1_Load(object sender, EventArgs e) {

// create some X/Y meshgrid data
ILArray<float> y = 1, R = ILMath.linspace<float>(-4, 4, 100);
ILArray<float> x = ILMath.meshgrid(R, ILMath.linspace<float>(-4, 4, 100), y);

// precreate the surface data array
ILArray<float> Z = ILMath.zeros<float>(x.S[0], x.S[1], 3);
// surface expects Z, X and Y coords (in that order)
Z[":;:;2"] = y; Z[":;:;1"] = x;
Z[":;:;0"] = 0.4f * x * x - 0.2f * y * y * y;

// our color data are based on another function
ILArray<float> cdata = 1.4f * x * x * x + 0.13f * y * y;

// we need cdatas limits for creating a new colormap
float min, max; cdata.GetLimits(out min, out max);

// get default 'Cool' colormap
var colormap = new ILColormap(Colormaps.Cool);
// get colormap keys as array: [position,R,G,B,A]
ILArray<float> colorkeys = colormap.Data;
// helper function to map true values to 0..1 range
Func<float, float> map = a => { return (a - min) / (max - min); };

// the value to mark and +/- tolerance width (to make it a visible strip at least)
float markValue = 0, tolerance = 0.5f;
// sample the colormap at the marked edges
Vector4 key1 = colormap.Map(markValue - tolerance, new Tuple<float, float>(min, max));
Vector4 key2 = colormap.Map(markValue + tolerance, new Tuple<float, float>(min, max));
// create new keypoints at the edges of marked area
colorkeys[ILMath.end + 1, ":"] = ILMath.array(map(markValue - tolerance), key1.X, key1.Y, key1.Z, 1f);
colorkeys[ILMath.end + 1, ":"] = ILMath.array(map(markValue + tolerance), key2.X, key2.Y, key2.Z, 1f);
// create new keypoint for the marked area itself; color red
colorkeys[ILMath.end + 1, ":"] = ILMath.array(map(markValue), 1f, 0f, 0f, 1f); // red
// make a new colormap out of it
colormap = new ILColormap(colorkeys);
// create & add a plot cube
ilPanel1.Scene.Add(new ILPlotCube(twoDMode: false) {
// add surface plot, give custom colormap & colormap data ...
new ILSurface(Z, colormap: colormap, C: cdata) {
// add colorbar
Childs = { new ILColorbar() }
}
});
}

这会产生以下输出: enter image description here

关于c# - 具有第 4 维标记特殊值的 3D 表面着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16862458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com