Есть хороший способ проверить, перекрываются ли сегменты в PathFigure в WPF? - PullRequest
1 голос
/ 16 марта 2011

Я работаю над элементом управления в WPF, чтобы рисовать фигуры областей с использованием различных типов сегментов (дуга, Безье, линейный сегмент) и хочу, чтобы они не создавали сложные фигуры областей. То есть формы, где края перекрываются.

Я работаю с PathGeometry, сгенерированным конвертером, но после завершения конвертации XAML будет выглядеть следующим образом XAML.

без перекрытий: </p> <pre><code> <Path x:Name="PolygonPath" Fill="Blue" Opacity="75"> <Path.Data> <PathGeometry> <PathGeometry.Figures> <PathFigure StartPoint="50,50" IsClosed="True" IsFilled="True"> <PathFigure.Segments> <QuadraticBezierSegment Point1="100,0" Point2="200,50"/> <LineSegment Point="250,50"/> <LineSegment Point="250,200"/> <QuadraticBezierSegment Point1="100,350" Point2="50,50"/> </PathFigure.Segments> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path>

с перекрытиями (должен провалиться тест): </p> <pre><code> <Path x:Name="PolygonPath" Fill="Blue" Opacity="75"> <Path.Data> <PathGeometry> <PathGeometry.Figures> <PathFigure StartPoint="50,50" IsClosed="True" IsFilled="True"> <PathFigure.Segments> <QuadraticBezierSegment Point1="100,0" Point2="200,60"/> <LineSegment Point="0,60"/> <LineSegment Point="250,200"/> <QuadraticBezierSegment Point1="100,350" Point2="50,50"/> </PathFigure.Segments> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path>

В приведенном выше случае второй и третий отрезки <LineSegment Point="0,60"/> и <LineSegment Point="250,200"/> перекрывают последний отрезок <QuadraticBezierSegment Point1="100,350" Point2="50,50"/>.

Есть ли метод, который мне не хватает, чтобы проверить, пересекается ли путь с самим собой в любой точке WPF?

1 Ответ

1 голос
/ 16 марта 2011

Я думаю, вы могли бы сделать следующее:

получить прямоугольник границ для каждого тестируемого PathFigure, вызвав:

Rect rect = new PathGeometry(new PathFigure[] { figure }).Bounds;

Затем используйте rect.IntersectsWith метод проверки прямоугольников пересекается.

Что-то вроде этого:

Rect rect1 = new PathGeometry(new PathFigure[] { figure1 }).Bounds;
Rect rect2 = new PathGeometry(new PathFigure[] { figure2 }).Bounds;
Rect rect3 = new PathGeometry(new PathFigure[] { figure3 }).Bounds;

if (rect1.IntersectsWith(rect2))
    Console.WriteLine("figure1 intersects with figure2");
if (rect1.IntersectsWith(rect3))
    Console.WriteLine("figure1 intersects with figure3");
if (rect2.IntersectsWith(rect3))
    Console.WriteLine("figure2 intersects with figure3");

xaml:

<Canvas>
    <Path Stroke="Black" StrokeThickness="1">
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigure StartPoint="10,20" x:Name="figure1">
                        <PathFigure.Segments>
                            <LineSegment Point="100,130"/>
                        </PathFigure.Segments>
                    </PathFigure>
                    <PathFigure StartPoint="20,70" x:Name="figure2">
                        <PathFigure.Segments>
                            <LineSegment Point="200,70"/>
                        </PathFigure.Segments>
                    </PathFigure>
                    <PathFigure StartPoint="200,20" x:Name="figure3">
                        <PathFigure.Segments>
                            <LineSegment Point="130,130"/>
                        </PathFigure.Segments>
                    </PathFigure>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
</Canvas>

код, указанный выше, возвращает:

figure1 пересекается с figure2

figure2 пересекается с figure3

для этого xaml

надеюсь, что это помогает, с уважением

...