C# 理解';中心';对于径向梯度笔刷

C# 理解';中心';对于径向梯度笔刷,c#,wpf,shapes,C#,Wpf,Shapes,我正在努力理解Center属性在RadialGradientBrush中的作用。MSDN说“获取或设置径向梯度最外圆的中心”。但当我设置它的值时,我得到的结果对我来说毫无意义 例如: <Rectangle Margin="10" Width="200" Height="200"> <Rectangle.Fill> <RadialGradientBrush C

我正在努力理解
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>

使用“Center”的默认值,它会显示如下内容:

这正是我所期望的。但如果我将其更改为=“0.5,1”,我会得到以下结果:

从MSDN来看,我认为它只影响了最外层的圆圈——我将其解释为“黑色”渐变停止。但这似乎影响到了所有人。如果我把它移得更远,它会变得更奇怪(至少对我来说)。当我把它设为=“0.5,3”时,它会以一个开始类似三角形的东西结束


我已经做了一些快速的搜索,但是我还没有找到一个对我有意义的解释。有人能解释一下中心到底在做什么吗?

画笔还有一个
GradientOrigin
属性,也称为“焦点”。通过在原点和外圆之间沿通过该点的直线找到该点的比例距离,并以与线性渐变笔刷的着色计算方式类似的方式使用该比例距离,为笔刷绘制的每个点计算渐变

在每个示例中,原点都位于中心。在第二个示例中,已移动外圆,使其一条边与原点重合,从而将停止点0处的颜色推到该边

第三个例子很奇怪,但是IMHO是采用一种算法的自然结果,该算法旨在将原点放置在外圆内,并使用它来填充外圆已移动到原点不再包含在内的区域。因此,在给定底层算法的情况下,结果在数学上是正确的,但不再有多大意义


我所说的“不再有多大意义”,并不是指任何人,只是乍一看他们可能不会

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

受这个问题的启发,我编写了一个快速而肮脏的程序,让我可以轻松地探索
RadialGradientBrush
的不同设置,通过一次互动体验,很快就可以清楚地看到,该算法将光线从原点延伸到要着色的像素,一直延伸到外圆(如我在上文第一段所述)

但有一个重要的警告:如果原点位于外圆之外,则光线延伸到的外圆点是光线从圆内部接近的点,即从外部穿过圆后。正是这种行为导致了不太直观的输出

从视觉上看,效果是在圆锥体上垂直向下看,其中代码的底部由外圆描述(由
中心
半径x
半径y
属性定义)圆锥体的顶点由
GradientOrigin
属性指定。如果原点在圆的外部,则此圆锥体将随着顶点在基部边界外部而向外倾斜,并且您看到的直边是圆锥体的正交投影边界。

在这种情况下,查看底层API的文档是很有帮助的,事实上,它专门将此场景称为“未定义”。也就是说,规范没有定义任何特定的行为,因此允许算法做任何它喜欢的事情(通常是最方便的,不一定是最直观的)

笔刷映射渐变原点的渐变停止位置0.0f,位置1.0f映射到椭圆边界。当渐变原点位于椭圆内时,椭圆的内容将包围整个[0,1]画笔渐变的范围停止。如果渐变原点在椭圆的边界之外,画笔仍然可以工作,但是它的渐变没有很好的定义

事实上,至少在当前的实现中,输出是“定义良好的”,即它是可预测和可理解的(参见上面的编辑)。但当然,该行为没有记录在案,并且可以随时任意更改实现。显然,用户希望将原点保留在外圆内。:)

请注意,在上面,外圈被假定为1的渐变停止点所在的位置。当指定大于1的渐变停止点时,它将位于圆之外,并且可能会导致意外结果,具体取决于精确的几何图形



注意:我编写的示例程序不难重新创建。但如果有兴趣,我很乐意将其包含在这里。如果有人问我,我会将其添加到这篇文章中。

只需将径向渐变轴保持在中心。中心“0.5,0.5”表示它在垂直和水平方向上都位于中心。“水平,垂直”~“0.5,0.5”,因此根据您的场景,它将移动到3。