Colors ILNumerics曲面图中的颜色范围

Colors ILNumerics曲面图中的颜色范围,colors,ilnumerics,color-mapping,Colors,Ilnumerics,Color Mapping,我正在使用ILNumerics生成曲面图 我想使用平面着色颜色贴图(即颜色范围)而不是平滑着色颜色贴图(即每个像素都有自己的颜色) 这在数字上可能吗 平面着色曲面打印和颜色栏图例示例: 平滑着色曲面打印和颜色栏图例示例: 这是不可能的。ILNumerics中的曲面图始终在栅格点之间插值颜色。对于其他着色模型,您必须创建自己的曲面类。您可以创建显示平面着色行为的颜色贴图。只需复制公共颜色贴图中存在的关键点,即可对一系列颜色数据进行建模,以获得相同的指定颜色 平面着色颜色贴图的工作原理 根据颜色映

我正在使用ILNumerics生成曲面图

我想使用平面着色颜色贴图(即颜色范围)而不是平滑着色颜色贴图(即每个像素都有自己的颜色)

这在数字上可能吗

平面着色曲面打印和颜色栏图例示例:

平滑着色曲面打印和颜色栏图例示例:


这是不可能的。ILNumerics中的曲面图始终在栅格点之间插值颜色。对于其他着色模型,您必须创建自己的曲面类。

您可以创建显示平面着色行为的颜色贴图。只需复制公共颜色贴图中存在的关键点,即可对一系列颜色数据进行建模,以获得相同的指定颜色

平面着色颜色贴图的工作原理 根据颜色映射的关键点由5列组成:一个“位置”和4个颜色值(RGBA)。为了模拟“平面”着色颜色贴图,将两个关键点“几乎”完全放置在彼此的顶部,使第一个关键点的颜色为下一个较低范围的颜色,第二个关键点的颜色为下一个较高范围的颜色。因此,颜色范围由两个指定了相同颜色的关键点建模

我在上面的段落中写了“几乎”,因为我认为在两个范围的边缘之间至少要留一个小间隙——希望没有实际的颜色数据值会碰到这个间隙。但看起来,根本不需要任何差距,可以给两个关键点提供完全相同的值。但排序时必须小心:不要混淆颜色(ILMath.sort()中的快速排序不稳定!)

在下面的示例中,将从
Colormaps.Jet
创建一个平面着色彩色贴图:

Keypoints for Colormaps.Jet (original, interpolating)
<Single> [6,5]
[0]:          0          0          0     0,5625          1 
[1]:     0,1094          0          0     0,9375          1 
[2]:     0,3594          0     0,9375          1          1 
[3]:     0,6094     0,9375          1     0,0625          1 
[4]:     0,8594          1     0,0625          0          1 
[5]:          1     0,5000          0          0          1 
结果

OP要求的不是ILSurface,而是“平面着色彩色贴图”。我认为值得一试,创建一个颜色映射,它可以显示所描述的颜色分布?我已经添加了一个答案。结果很好。虽然我接受了这个答案,但情节仍然不是平淡的。通过放大或使用密度较小的数据集,可以很容易地看到这一点。正如@user492238所指出的,颜色总是在数据点之间插值(平滑着色)。右。如果您碰巧拥有为其任何顶点拾取不同颜色的平铺,则颜色仍将被插值。我想知道如何定义平面着色面来处理此类情况?整个瓷砖区域将使用哪种颜色?与平均值相对应的颜色?但这有什么用呢?此外,考虑更新你的问题,因为它指的是“一个平面阴影彩色地图”。这就是答案。
Colormaps.Jet - flat shading version
<Single> [11,5]
[0]:          0          0          0     0,5625          1 
[1]:     0,1094          0          0     0,5625          1 
[2]:     0,1094          0          0     0,9375          1 
[3]:     0,3594          0          0     0,9375          1 
[4]:     0,3594          0     0,9375          1          1 
[5]:     0,6094          0     0,9375          1          1 
[6]:     0,6094     0,9375          1     0,0625          1 
[7]:     0,8594     0,9375          1     0,0625          1 
[8]:     0,8594          1     0,0625          0          1 
[9]:     1,0000          1     0,0625          0          1 
[10]:          1     0,5000          0          0          1 
private void ilPanel1_Load(object sender, EventArgs e) {
    ILArray<float> A = ILMath.tosingle(ILSpecialData.terrain["0:400;0:400"]);
    // derive a 'flat shaded' colormap from Jet colormap
    var cm = new ILColormap(Colormaps.Jet);
    ILArray<float> cmData = cm.Data;
    cmData.a = Computation.CreateFlatShadedColormap(cmData);
    cm.SetData(cmData); 
    // display interpolating colormap
    ilPanel1.Scene.Add(new ILPlotCube() { 
        Plots = {
            new ILSurface(A, colormap: Colormaps.Jet) {
                Children = { new ILColorbar() },
                Wireframe = { Visible = false }
            }
        }, 
        ScreenRect = new RectangleF(0,-0.05f,1,0.6f)
    }); 

    // display flat shading colormap
    ilPanel1.Scene.Add(new ILPlotCube() {
        Plots = {
            new ILSurface(A, colormap: cm) {
                Children = { new ILColorbar() },
                Wireframe = { Visible = false }
            }
        },
        ScreenRect = new RectangleF(0, 0.40f, 1, 0.6f)
    }); 

}

private class Computation : ILMath {
    public static ILRetArray<float> CreateFlatShadedColormap(ILInArray<float> cm) {
        using (ILScope.Enter(cm)) {
            // create array large enough to hold new colormap
            ILArray<float> ret = zeros<float>(cm.S[0] * 2 - 1, cm.S[1]);
            // copy the original
            ret[r(0, cm.S[0] - 1), full] = cm; 
            // double original keypoints, give small offset (may not even be needed?) 
            ret[r(cm.S[0], end), 0] = cm[r(1, end), 0] - epsf;
            ret[r(cm.S[0], end), r(1, end)] = cm[r(0, end - 1), r(1, end)];
            // reorder to sort keypoints in ascending order
            ILArray<int> I = 1;
            sort(ret[full, 0], Indices: I);
            return ret[I, full];
        }

    }