Pre loader

Colorize SurfaceMeshRenderableSeries3D according to the fourth dimension

Welcome to the SciChart Forums!

  • Please read our Question Asking Guidelines for how to format a good question
  • Some reputation is required to post answers. Get up-voted to avoid the spam filter!
  • We welcome community answers and upvotes. Every Q&A improves SciChart for everyone

WPF Forums | JavaScript Forums | Android Forums | iOS Forums

0
0

Hello,

I need to draw a three-dimensional surface with a special coloring according to the fourth dimension. I tried to do this using the texture. But I did not find examples of how to do it. This code only works if you specify the size of the texture 1024×1.

var texture = new Texture2D(1024, 1, TextureFormat.TEXTUREFORMAT_A8B8G8R8);
uint[] rgbaData = new uint[1024];
for (int i = 0; i < rgbaData.Length; i++)
{
    if (i > 512)
        rgbaData[i] = 0xFF8080FF;
    else rgbaData[i] = 0xFFFF8080;
}
texture.WritePixels(rgbaData);

meshSeries.ColorMapTexture = texture;
meshSeries.ColorMapTextureSize = new Size(1024, 1);

It is possible to set the color of the mesh as a function?

Version
4.1.1
Images
  • You must to post comments
0
0

Hi Yuriy

Have you seen our example: WPF 3D Chart Realtime 3D Surface Mesh Plot Example

This has an option to change the MeshColorPalette on the left.

One of the options allows you to apply a texture to the surface, you can see a screenshot below.

enter image description here.

The way this works is there is a BrushColorPalette applied to the SurfaceMeshRenderableSeries3D.ColorPalette property. This accepts type Brush so you can use a Visual Brush and place an image in there.

If you want finer grained control over the texture applied you can always inherit MeshColorPalette and provide your own implementation. For instance, the code for BrushColorPalette is like this:

public class BrushColorPalette : MeshColorPalette
{
    /// <summary>
    /// Defines the <see cref="Brush"/> DependencyProperty
    /// </summary>
    public static readonly DependencyProperty BrushProperty = DependencyProperty.Register(
        "Brush", typeof(Brush), typeof(BrushColorPalette), new PropertyMetadata(default(Brush), (s, e) => ((BrushColorPalette)s).OnColorPaletteChanged()));

    /// <summary>
    /// Initializes a new instance of the <see cref="BrushColorPalette"/> class.
    /// </summary>
    public BrushColorPalette()
    {
        DefaultStyleKey = typeof(BrushColorPalette);
    }

    /// <summary>
    /// Gets or sets the brush to create color-palette from. 
    /// </summary>        
    public Brush Brush
    {
        get { return (Brush) GetValue(BrushProperty); }
        set { SetValue(BrushProperty, value); }
    }

    /// <summary>
    /// Gets the <see cref="Texture2D" /> to apply to the <see cref="SurfaceMeshRenderableSeries3D" />, given the size passed in
    /// </summary>
    /// <param name="size">The size.</param>
    /// <returns>
    /// The <see cref="Texture2D" /> instance to map to the surface
    /// </returns>
    public override Texture2D GetTexture(Size size)
    {
        if (Brush == null)
            return null;

        var b = Brush.Clone();
        if (b is LinearGradientBrush)
        {
            ((LinearGradientBrush)b).StartPoint = new Point(0, 0);
            ((LinearGradientBrush)b).EndPoint = new Point(1, 0);
        }
        Rectangle r = new Rectangle() { Width = size.Width, Height = size.Height, Fill = b };
        return Texture2D.FromWriteableBitmap(r.RenderToBitmap());
    }
}

Take a look and let me know if this is what you need.

Best regards,
Andrew

  • You must to post comments
0
0

Hi, Andrew!

Thanks for the detailed answer.

I was not able to appoint a palette of resources.
Code from example is working:

MeshColorPalette="{Binding ElementName=ColorMapCombo, Path=SelectedItem}" 

But my code does not work:

MeshColorPalette="{StaticResource SmileColorPalette}" 

For me, it is not critical, since I more suitable option with inheritance MeshColorPalette. I got to use a computed palette of arbitrary size.

SurfaceMesh.ColorMapTextureSize = new Size(lengthSize, timeSize);
SurfaceMesh.MeshColorPalette = new MyFuncColorPalette();

Best regards

  • You must to post comments
Showing 2 results
Your Answer

Please first to submit.

Try SciChart Today

Start a trial and discover why we are the choice
of demanding developers worldwide

Start TrialCase Studies