WPF Math для полукруга с использованием ArcSegment между двумя произвольными точками - PullRequest
17 голосов
/ 17 марта 2011

Может кто-нибудь показать математику для рисования полукруга между двумя произвольными точками, используя ArcSegment в WPF.

Я совершенно запутался с RadiusX, RadiusY в ArcSegment.Похоже, что это не относительно двух точек, а относительно оси X и Y.Это так и должно быть?

1 Ответ

37 голосов
/ 17 марта 2011

Вы правы, Size из ArcSegment не является радиусом между точками, которые определяют начало и конец дуги.Это свойство описывает, насколько большим должен быть эллипс между этими точками.Если вы хотите иметь круг вместо эллипса, вы должны всегда помнить, что значения x и y размера должны быть одинаковыми.Если вы хотите, чтобы всегда была нарисована половина круга, вам также необходимо убедиться, что Size будет половиной расстояния между этими двумя точками.

Например, посмотрите на код ниже:

<Canvas>
    <Path Stroke="Black">
        <Path.Data>
            <PathGeometry>
                <PathFigure StartPoint="100,100">
                    <ArcSegment IsLargeArc="True"
                                Size="50, 50"
                                Point="200, 100"
                                SweepDirection="Clockwise" />
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>
</Canvas>

Нарисует верхнюю половину круга, которая начинается в точке 100, 100 и заканчивается в точке 200, 100.Так как я установил свойство Size на 50, 50 (расстояние между этими точками равно 100), это создаст ровно половину круга.SweepDirection утверждает, что круг должен быть нарисован по часовой стрелке, и именно поэтому он будет рисовать верхнюю половину.Проверьте разницу между Clockwise и Counterclockwise на экранах ниже:

50, 50, clockwise 50, 50, counterclokwise

IsLargeArc выбирает, рисовать большую часть эллипса или меньше.Поскольку я рисую половину круга, это не имеет смысла, но если бы вы нарисовали эллипс с другим размером, это значительно изменило бы внешний вид выходного документа, просто поиграйте с ним, чтобы увидеть, как он работает.

Вот какэто выглядит, когда вы пытаетесь поместить размер 200, 200, clockwise, используя его большую часть дуги.Как вы можете видеть - дуга даже не подходит к окну (это снимок из дизайнера WPF, в нормальном приложении часть с переполнением будет обрезана)

200, 200, clockwise, largearc И это то же самое, но с небольшим размеромarc: 200, 200, clockwise, not largearc

Когда я изменил свойство Size на 200, 200, нарисованный круг просто в 4 раза больше, но все еще начинается и заканчивается в точных точках, которые вы определили.Size не имеет ничего общего с точками, между которыми вы рисуете свой эллипс / крикл, но это меняет вид эллипса.

Я надеюсь, что оно показывает вам, что означает Size в ArcSegment не стесняйтесь задавать более подробные вопросы, если вы все еще в замешательстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...