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

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

Я очень смущен RadiusX, RadiusY в ArcSegment. Это не похоже на две точки, а на оси X и Y. Так оно и должно быть?

Ответ 1

Вы правы, Size of 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, clockwise50, 50, counterclokwise

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

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

200, 200, clockwise, largearc И это то же самое, но для отображения небольшой дуги: 200, 200, clockwise, not largearc

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

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