【问题标题】:How to add a Colorbar for Custom Objects in ILNumerics?如何在 ILNumerics 中为自定义对象添加颜色栏?
【发布时间】:2014-08-24 01:56:42
【问题描述】:

我想使用带有自定义对象的颜色条。对象根据特定的颜色图着色。我想在运行时在颜色栏中显示此颜色图。

我已经尝试通过以下方式将其添加到场景中:

        ILColorbar cb = new ILColorbar();
        scene.Add(cb);

或到立方体:

        plotCube.Add(cb);

甚至plotCube.Children.Add(cb);

但它仍然不起作用。为自定义对象显示颜色条的正确方法是什么?

这是我的代码:

private void OKInputBodyListButton_Click(object sender, EventArgs e)
    {
        try
        {
            var sceneBody = new ILScene();
            var plotCubeBody = sceneBody.Add(new ILPlotCube(twoDMode: false));

            foreach (BlockBody item in ObjectList)
            {
                createBlockBody(item, sceneBody, plotCubeBody);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

private void createBlockBody(BlockBody BlockBody, ILScene scene, ILPlotCube plotCube)
    {
        var box = new ILTriangles("tri")
        {
            ...
            ...
        }

        plotCube.Add(box);
        var colormap = new ILColormap(Colormaps.Jet);
        Vector4 key1 = colormap.Map((float)BlockBody.Rho, new Tuple<float, float>(-1, 1));
        var test = key1.ToColor();
        box.Color = test;

        SliceilPanel.Scene = scene;
        SliceilPanel.Refresh();
    }

这是我的数据:

【问题讨论】:

    标签: colors ilnumerics colorbar box colormap


    【解决方案1】:

    颜色条需要一些数据:使用的颜色图和颜色条轴的上限/下限。通常,它会在运行时从场景中相应的绘图对象(等高线图、曲面图)中获取这些信息。 '在运行时',因为它必须能够对由于交互性而对这些绘图对象的更改做出反应。

    如果您想为自定义对象使用颜色条,您必须自己提供这些数据。 ILColorbar 提供 ColormapProvider 属性。为其分配一个在运行时提供信息的对象。您可以采用预定义的ILNumerics.Drawing.Plotting.ILStaticColormapProvider 或提供您自己的“IILColormapProvider”接口实现。

    与 nuget 的社区版一起使用!

    private void ilPanel1_Load(object sender, EventArgs e) {
    
        // We need to provide colormap data to the colorbar at runtime. 
        // We simply take a static colormap provider here:
        var cmProv = new ILStaticColormapProvider(Colormaps.ILNumerics, 0f, 1f);
        // Position data for plotting
        ILArray<float> A = ILMath.tosingle(ILMath.rand(3, 1000));
        // create the points
        ilPanel1.Scene.Add(
            new ILPlotCube(twoDMode: false) {
                new ILPoints("myPoints") {
                    Positions = A,
                    // since we want to show a colorbar, we need to put the points colors under colormap control
                    Colors = cmProv.Colormap.Map(A["1;:"]).T,
                    // deactivate single color rendering
                    Color = null
                },
                // add the colorbar (somewhere) and give it the colormap provider
                new ILColorbar() {
                    ColormapProvider = cmProv
                }
            }); 
    }
    

    【讨论】:

    • 由于我使用的是社区版,所以我无法尝试这个解决方案。它是唯一的解决方案吗?我只想显示范围从 -1 到 1(而不是在您的示例中为 0 到 1)的颜色条。我的盒子已经用“Rho”值着色了。
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 2021-09-25
    • 2018-11-06
    • 2017-08-29
    • 2019-02-17
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多