c# – 了解RadialGradientBrushes的“中心”

我很难理解Center属性在RadialGradientBrush中的作用. MSDN说’获取或设置径向渐变的最外圈的中心’.但是当我设定它的价值时,我得到的结果对我来说没有意义.

例如:

    <Rectangle Margin="10" Width="200" Height="200">
        <Rectangle.Fill>
            <RadialGradientBrush  Center="0.5,0.5">
                <GradientStop Color="Green" Offset="0" />
                <GradientStop Color="Yellow" Offset=".5" />
                <GradientStop Color="DarkRed" Offset=".5" />                        
                <GradientStop Color="Black" Offset="1.2" />
            </RadialGradientBrush>
        </Rectangle.Fill>
    </Rectangle>

使用“中心”的默认值,它给我一些看起来像这样的东西:

《c# – 了解RadialGradientBrushes的“中心”》

这是我所期待的.但是,如果我将其更改为=“0.5,1”,我会得到:

《c# – 了解RadialGradientBrushes的“中心”》

从MSDN,我认为它只影响最外圈 – 我将其解释为’黑’GradientStop.但它似乎影响了所有这些.如果我进一步移动,它甚至更奇怪(至少对我来说).当我使它=“0.5,3”时,它最终会出现类似于三角形的东西.

《c# – 了解RadialGradientBrushes的“中心”》

我已经做了一些快速搜索,但我对一个对我有意义的解释没有太多运气.有人可以解释一下Center正在做什么吗?

最佳答案 画笔还具有GradientOrigin属性,也称为“焦点”.通过刷子找到沿着穿过它的线,在原点和外圈之间的比例距离,并使用该比例距离以类似于线性计算阴影的方式计算每个点绘制的梯度.渐变画笔.

在每个示例中,您的起源位于中心.在第二个示例中,外圆已移动,因此它的一个边与原点重合,将第0个停止的颜色推到该边.

第三个例子很奇怪,但恕我直言,采用一种算法设计将原点放置在外圆内,然后使用它来填充外圆已移动到目前为止不再包含原点的区域的自然结果因此,在给定基础算法的情况下,结果在数学上是正确的,但不再有意义.

<编辑>
而且“不再有意义”,我不是任何人的意思,只是乍一看他们可能没有.

事实上(也许你已经对这个问题已经失去了兴趣…我没有看到你的任何跟进或其他活动),当你注意到如何选择外圆上的点来定义渐变线从中选择实际阴影,结果确实有一定意义.

受到这个问题的启发,我汇总了一个快速而肮脏的程序,让我轻松探索RadialGradientBrush的不同设置,并通过交互式体验,很快就清楚该算法将光线从原点延伸到像素为止阴影,直接到外圈(正如我在上面第一段中所描述的那样).

但是有一个重要的警告:如果原点位于外圆之外,则射线所延伸的外圆的点是射线从圆的内部接近的点,即在从外部进入圆之后.正是这种行为导致了不那么直观明显的输出.

在视觉上,效果是直视锥体,其中代码的底部由外圆(由Center,RadiusX和RadiusY属性定义)描述,锥体的顶点由GradientOrigin属性指定.如果原点位于圆外,则此锥体向外倾斜,顶点位于基部边界外,您看到的直边是锥体的正交投影边界.
< /编辑>

在这种情况下查看底层API的文档是有用的,实际上它特别将此场景称为“未定义”.即规范没有定义任何特定的行为,因此允许算法做任何它喜欢的事情(通常是最方便的,不一定是最直观明显的).从ID2D1RadialGradientBrush interface

The brush maps the gradient stop position 0.0f of the gradient origin, and the position 1.0f is mapped to the ellipse boundary. When the gradient origin is within the ellipse, the contents of the ellipse enclose the entire [0, 1] range of the brush gradient stops. If the gradient origin is outside the bounds of the ellipse, the brush still works, but its gradient is not well-defined.

实际上,至少对于当前的实现来说,输出是“明确定义的”,因为它是可预测和可理解的(参见上面的编辑).但当然行为没有记录,实施可以随时任意改变.显然,用户应该将原点保持在外圈内. 🙂

还要注意,在上面假设外圆是1的梯度停止位置.当您指定大于1的渐变停止时,它将位于圆的外部,并且还可能导致意外的结果,具体取决于确切的几何.

注意:我编写的示例程序不难重新创建.但如果有兴趣,我很乐意将其纳入此处.如果被问到,我会把它添加到这篇文章中.

点赞