Проблемы с обтравочным контуром - PullRequest
1 голос
/ 18 апреля 2011

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

Затем у меня есть метод, позволяющий превратить мой многоугольник в объект Path путем итерации списка точек с помощью серии вызовов lineTo ().Этот путь затем применяется к холсту в качестве пути клипа в методе onDraw моего View.

Он отлично работает для сложных полигонов, и я могу нарисовать этот путь, чтобы проверить его точность.

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

Например, рассмотрим диаграмму ниже, где внешняя рамка и "замковая" форма в середине являются частямитот же объект Path, который используется в качестве пути клипа.# Представляет нарисованную область.

+---------+
|#########|
|#+-+#+-+#|
|#| |#| |#|
|#| +-+ |#|
|#|     |#|
|#+-----+#|
|#########|
+---------+

Я ожидаю, что все, что находится снаружи внешней коробки и внутренней формы "замка", будет обрезано.Проблема, которую я вижу, заключается в том, что внутренняя форма не обрезается должным образом.Кажется, проблема с алгоритмом трассировки лучей.

Любые идеи будут полезны.

РЕДАКТИРОВАТЬ: Кроме того, я пытался протестировать каждый режим Region.Op, и ни один из них не решил проблему,Я подозреваю, что мне нужно будет принять меры, чтобы определить, есть ли «дыра», и сделать что-то творческое.

1 Ответ

2 голосов
/ 23 апреля 2011

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

Мне нужно было установить Path.FillType с помощью:

path.setFillType(Path.FillType.EVEN_ODD)

Но потом у меня былослучай, когда произошло противоположное, и была нарисована только центральная дорожка.Немного больше исследования, и я смог исправить это, добавив:

canvas.clipPath(path, Region.Op.DIFFERENCE);

Но тогда у полигонов с одним путем на внешней стороне их клип инвертирован.Хотя я удовлетворен тем, что нашел правильные ручки ботаников для правильного поведения отсечения, я не нашел способа определить, какие методы отсечения необходимы.

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

...