Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有插值颜色的LinearGradientBrush无法使用较小的位置值正确渲染_C#_Gdi+_Lineargradientbrush - Fatal编程技术网

C# 带有插值颜色的LinearGradientBrush无法使用较小的位置值正确渲染

C# 带有插值颜色的LinearGradientBrush无法使用较小的位置值正确渲染,c#,gdi+,lineargradientbrush,C#,Gdi+,Lineargradientbrush,我正试图制作一个带有可拖动位置标记的ColorBlend编辑器,但我注意到有时它似乎无法正确渲染 使用带有插值的LinearGradientBrush,颜色再次从白色变为蓝色变为白色,蓝色的中间位置为0.02f。中间的渐变似乎与我提供的位置不一致 protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var colorBlend = new ColorBlend { Colors

我正试图制作一个带有可拖动位置标记的ColorBlend编辑器,但我注意到有时它似乎无法正确渲染

使用带有插值的LinearGradientBrush,颜色再次从白色变为蓝色变为白色,蓝色的中间位置为0.02f。中间的渐变似乎与我提供的位置不一致

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var colorBlend = new ColorBlend {
        Colors = new[] { Color.White, Color.Blue, Color.White },
        Positions = new[] { 0f, 0.02f, 1f }
    };

    var rect = new RectangleF(10, 10, 500, 50);

    //colors in constructor are not supposed to matter, and InterpolationColors should override them
    using(var brush = new LinearGradientBrush(rect, Color.Aqua, Color.Black, LinearGradientMode.Horizontal)
        {InterpolationColors = colorBlend})
        e.Graphics.FillRectangle(brush, rect);

    for (var i = 0; i < colorBlend.Positions.Length; i++)
    {
        var x = rect.X + colorBlend.Positions[i] * rect.Width;
        e.Graphics.DrawLine(Pens.Black, x, rect.Bottom, x, rect.Bottom + 20);
    }
}
protected override void OnPaint(PaintEventArgs e)
{
基础漆(e);
var colorBlend=新的colorBlend{
颜色=新[]{Color.White,Color.Blue,Color.White},
位置=新[]{0f,0.02f,1f}
};
var rect=新矩形f(10,10500,50);
//构造函数中的颜色并不重要,插值颜色应该覆盖它们
使用(var brush=新的LinearGradientBrush(rect,Color.Aqua,Color.Black,LinearGradientMode.Horizontal)
{插值颜色=颜色混合})
e、 图形。填充矩形(画笔,矩形);
对于(var i=0;i

纯蓝色应该与中间的标记对齐,但渐变在标记后继续一点,然后再返回白色

当我对蓝色使用0.2f的位置时,渐变看起来很好。

有趣!我可以a)确认这在我自己的gradientBuilder中发生。和b)可以提供一种解决方法:如果您添加另一种中间颜色(即第四种颜色),所有颜色似乎都会恢复正常,即第二种和第三种颜色都会渲染到边界处。。如果你把它放在边框上,并给它一个边框颜色,这也行得通。这些颜色不是很清晰,但它们似乎是由一个单位圆从一端到另一端构成颜色的。由于使用的数字是浮动的,因此可能会在精度方面遇到问题。Cos(0.02)=0.9999993907。。。(胡乱猜测)有趣!我可以a)确认这在我自己的gradientBuilder中发生。和b)可以提供一种解决方法:如果您添加另一种中间颜色(即第四种颜色),所有颜色似乎都会恢复正常,即第二种和第三种颜色都会渲染到边界处。。如果你把它放在边框上,并给它一个边框颜色,这也行得通。这些颜色不是很清晰,但它们似乎是由一个单位圆从一端到另一端构成颜色的。由于使用的数字是浮动的,因此可能会在精度方面遇到问题。Cos(0.02)=0.9999993907。。。(胡乱猜测)