Сохранение плоского свойства LineCap для линии при заполнении отсутствующих углов

В настоящее время я пытаюсь смоделировать пути железной дороги, используя заданные координаты. Ранее я использовал значение «Скругленный» для свойств StrokeStart и StrokeEnd LineCap, однако добавленный радиус, который вы получаете с этим значением, вызывал проблемы при добавлении соединений дорожек. Я переключился на «плоское» значение для LineCap, которое работает намного лучше, за исключением того факта, что «углы» моей дорожки не заполняются, например:

Отсутствующие углыhttps://imgur.com/a/EliIlzD

Я пытался противодействовать этому, сначала визуализируя все свои дорожки со значением «Круглый», а затем снова визуализируя их поверх со значением «Плоский», которое, кажется, заполняет углы, но приводит к другим проблемам. например, перекрывающиеся цвета, когда дорожка занята, и закругленные дорожки, которые я визуализировал первыми, появляются в конце дорожки:

Перекрывающиеся цветаhttps://imgur.com/a/0XCVGv5

Проблемы в конце путиhttps://imgur.com/a/fKju9uA

Мой XAML — это просто простая строка, сформированная из списка координат с различными привязками из моей модели представления и преобразователями для небольшого уменьшения моих координат. Это, очевидно, треки, отрендеренные первыми с Rounded EndCaps:


<Line  X1 = "{Binding X1, Converter = {StaticResource ScaleXCoordConverter}}" Y1 = "{Binding Y1, Converter = {StaticResource ScaleYCoordConverter}}"
                                                   X2 = "{Binding X2, Converter = {StaticResource ScaleXCoordConverter}}" Y2 = "{Binding Y2, Converter = {StaticResource ScaleYCoordConverter}}"
                                                   Stroke = "{Binding DataContext.LineColor, RelativeSource = {RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}" 
                                                   StrokeThickness = "2" StrokeEndLineCap = "Round" StrokeStartLineCap = "Round">
                                                <Line.InputBindings>
                                                    <MouseBinding Gesture = "LeftClick" Command = "{Binding DataContext.OccupyTrackCommand, RelativeSource = {RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}"/>
                                                </Line.InputBindings>

                                            </Line>

Удалось ли кому-нибудь создать пользовательскую линию, которая решает эти проблемы, где вы можете использовать значение «Flat» LineCap, сохраняя при этом углы без проблем? Обновлено: Просто чтобы уточнить, я полагаю, что прошу пользовательскую реализацию строки или строки, чтобы решить все эти проблемы, но любое другое решение очень приветствуется.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение, которое я придумал, весьма специфично для моего проекта, но я решил опубликовать его в любом случае, если оно поможет кому-нибудь в будущем, кто столкнется с этой веткой.

private void SetLineCaps() {

        if (LineCoords.Count == 1) {
            LineCoords[0].StartLineCap = "Flat";
            LineCoords[0].EndLineCap = "Flat";
            return;
        }
        foreach (var currentCoord in LineCoords) {
            foreach (var compareCoord in LineCoords) {


                if (currentCoord == compareCoord) continue;
                if ((compareCoord.X1 == currentCoord.X1 && compareCoord.Y1 == currentCoord.Y1)
                    || (compareCoord.X2 == currentCoord.X1 && compareCoord.Y2 == currentCoord.Y1)) {
                    currentCoord.StartLineCap = "Round";
                }
                if ((compareCoord.X1 == currentCoord.X2 && compareCoord.Y1 == currentCoord.Y2 )
                    || (compareCoord.X2 == currentCoord.X2 && compareCoord.Y2 == currentCoord.Y2)){ 

                    currentCoord.EndLineCap = "Round";
                }
            }
        }
    }

По сути, мне пришлось проверить начальную и конечную точки каждой из моих строк и проверить, не касается ли начало или конец какой-либо другой точки этого конкретного списка строк. Например, если у меня есть дорожка с 3 линиями, она будет проверять, соприкасаются ли какие-либо концы линий, и если да, то для этой конкретной линии будет установлено значение «Круглое», в противном случае она будет оставаться «Плоской». Затем я привязал StartLineCap и EndLineCap к этим значениям, и все заработало, как и ожидалось. Посмотрите другие мои посты о z-index, если хотите увидеть, как я справился с кровоточащими цветами.

Другие вопросы по теме