Как создать круг, разделенный на равные части в WPF и написать текст в каждой части, используя GeometryDrawing - PullRequest
0 голосов
/ 14 июня 2019

У меня есть динамический список строк длиной «n», и мне нужно нарисовать круг, разделенный на «n» количество равных частей, и распределить имя по частям.

Я нашел этот фрагмент кода Xamlкоторый генерирует 3 части, но я не могу понять, как это сделать программно

<Image Width="500" Height="500" Name="image1">
            <Image.Source>
                <DrawingImage>
                    <DrawingImage.Drawing>
                        <DrawingGroup>

                            <GeometryDrawing Brush="Red">
                                <GeometryDrawing.Pen>
                                    <Pen Brush="Black" />
                                </GeometryDrawing.Pen>
                                <GeometryDrawing.Geometry>
                                    <PathGeometry>
                                        <PathFigure StartPoint="100,100">
                                            <PathFigure.Segments>
                                                <LineSegment Point="100,0"/>
                                                <ArcSegment Point="186.6,150"  SweepDirection="Clockwise" Size="100,100"/>
                                                <LineSegment Point="100,100"/>
                                            </PathFigure.Segments>
                                        </PathFigure>
                                    </PathGeometry>
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>

                            <GeometryDrawing Brush="Blue">
                                <GeometryDrawing.Pen>
                                    <Pen Brush="Black"/>
                                </GeometryDrawing.Pen>
                                <GeometryDrawing.Geometry>
                                    <PathGeometry>
                                        <PathFigure StartPoint="100,100">
                                            <PathFigure.Segments>
                                                <LineSegment Point="186.6,150"/>
                                                <ArcSegment Point="13.4,150" SweepDirection="Clockwise" Size="100,100"/>
                                                <LineSegment Point="100,100"/>
                                            </PathFigure.Segments>
                                        </PathFigure>
                                    </PathGeometry>
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>

                            <GeometryDrawing Brush="Green">
                                <GeometryDrawing.Pen>
                                    <Pen Brush="Black"/>
                                </GeometryDrawing.Pen>
                                <GeometryDrawing.Geometry>
                                    <PathGeometry>
                                        <PathFigure StartPoint="100,100">
                                            <PathFigure.Segments>
                                                <LineSegment Point="13.4,150"/>
                                                <ArcSegment Point="100,0" SweepDirection="Clockwise" Size="100,100"/>
                                                <LineSegment Point="100,100"/>
                                            </PathFigure.Segments>
                                        </PathFigure>
                                    </PathGeometry>
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>

                        </DrawingGroup>
                    </DrawingImage.Drawing>
                </DrawingImage>
            </Image.Source>
        </Image>

Это даже хороший способ?если нет, то какой лучший способ создать то, что мне нужно?

Что меня действительно смущает, так это способ вычисления значения ArcSegment?

            DrawingGroup drawingGroup = new DrawingGroup();
            var lastPoint = new Point(100, 0);
            for (int i = 0; i < 3; i++)
            {
                GeometryDrawing drawing = new GeometryDrawing();
                drawing.Brush = (Brush)new BrushConverter().ConvertFrom("#FF0000"); // TODO: change color

                drawing.Pen = new Pen
                {
                    Brush = (Brush)new BrushConverter().ConvertFrom("#000000")
                };

                PathSegment lineSegment1 = new LineSegment(lastPoint, true);
                lastPoint = new Point(200, 100); // TODO: calculate
                PathSegment arcSegment = new ArcSegment(lastPoint, new Size(100, 100), 0, false, SweepDirection.Clockwise, true);
                PathSegment lineSegment2 = new LineSegment(new Point(100, 100), true);
                PathFigure figure = new PathFigure(new Point(100, 100), new PathSegment[] { lineSegment1, arcSegment, lineSegment2 }, false);
                drawing.Geometry = new PathGeometry(new PathFigure[] { figure });

                drawingGroup.Children.Add(drawing);
            }

Заранее спасибо.

...