刷子的径向扫描

3
我正在寻找一种使用WPF中定义的刷子进行径向扫描填充的方法。我将通过一系列图像来阐述我的要求,以便更加清晰明了。
假设我在WPF中定义了一个如下所示的刷子:
然后我想这样使用刷子的一部分:
并将其平铺在圆的半径上,如下所示:
最后,为了填充形状,我希望将刷子在圆的所有角度上扫过,从而得到类似于以下结果的结果:
在这种特定情况下,我试图制作同心圆。我知道可以使用RadialGradientBrush来实现这一点,但这是一个麻烦的解决方案,因为为了精确控制同心圆的宽度,我需要根据圆的大小改变径向停止的数量。更糟糕的是,如果圆的大小发生变化,径向停止将不会改变,除非我使用基于圆宽度/高度的某种转换器。
我希望能够用路径或其他方法干净地解决此问题,但欢迎任何其他建议来制作受控大小的圆形切片。
2个回答

1
关于同心圆案例,将Clemens的解决方案与转换器结合使用,可以得到精确大小的圆,其宽度可以动态更改,圆的数量设置为尽可能多地适合允许的区域。
class SizeSpacingToCircleGroupConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values == null) return values;
        var input = values.OfType<double>().ToArray();
        if (input.Length != 3) return values;

        var width = input[0];
        var height = input[1];
        var spacing = input[2];

        var halfSpacing = spacing / 2;
        var diameter = width > height ? height : width;

        var lineCount = (int)Math.Floor((diameter / (2 * spacing)) - 1);
        if (lineCount <= 0) return values;

        var circles = Enumerable.Range(0, lineCount).Select(i =>
        {
            var radius = halfSpacing + (i * spacing);
            return new EllipseGeometry() { RadiusX = radius, RadiusY = radius };
        }).ToArray();

        var group = new GeometryGroup();
        foreach (var circle in circles) group.Children.Add(circle);

        return group;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

并且 XAML:

<Rectangle Height="{StaticResource Diameter}" Width="{StaticResource Diameter}">
    <Rectangle.Fill>
        <DrawingBrush Stretch="None">
            <DrawingBrush.Drawing>
                <GeometryDrawing>
                    <GeometryDrawing.Pen>
                        <Pen Brush="{StaticResource ForegroundBrush}" Thickness="{StaticResource SpacingDiv2}"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <MultiBinding Converter="{StaticResource SizeSpacingToCircleGroupConverter}">
                            <Binding Source="{StaticResource Diameter}" />
                            <Binding Source="{StaticResource Diameter}" />
                            <Binding Source="{StaticResource Spacing}" />
                        </MultiBinding>
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </Rectangle.Fill>
</Rectangle>

在我的情况下,我只是使用在我的资源字典中定义的双精度浮点数,但我也可以很容易地使用来自视图模型的绑定。然而,我仍不会将任何东西标记为被接受的答案,因为问题涉及到一个平铺的径向扫描,这可能对其他原因有用。

1

这样使用刷子画几个同心圆怎么样?

<Rectangle>
    <Rectangle.Fill>
        <DrawingBrush Stretch="Uniform">
            <DrawingBrush.Drawing>
                <GeometryDrawing>
                    <GeometryDrawing.Pen>
                        <Pen Brush="Black" Thickness="1"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <GeometryGroup>
                            <EllipseGeometry RadiusX="1" RadiusY="1"/>
                            <EllipseGeometry RadiusX="3" RadiusY="3"/>
                            <EllipseGeometry RadiusX="5" RadiusY="5"/>
                            <EllipseGeometry RadiusX="7" RadiusY="7"/>
                            <EllipseGeometry RadiusX="9" RadiusY="9"/>
                            <EllipseGeometry RadiusX="11" RadiusY="11"/>
                        </GeometryGroup>
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </Rectangle.Fill>
</Rectangle>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接