Границы регионов (созданные на основе пути) не соответствуют ожиданиямAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Границы регионов (созданные на основе пути) не соответствуют ожиданиям

Сообщение Anonymous »

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

Код: Выделить всё

fun boundsTest() {
val clipRegion = Region(0, 0, 100, 100)
val pathRectF = RectF()

// Create a path describing a triangle
val path = Path()
path.moveTo(0F,0F)
path.lineTo(5f, 5f)
path.lineTo(5f, 0f)
path.lineTo(0f, 0f)
path.close()

// Compute the exact bounds of the path
path.computeBounds(pathRectF, true)
val pathBoundingBox = pathRectF.toRect()
Log.i("MyLog", "boundsTest: pathBoundingBox: $pathBoundingBox")

// Create a region from the bounding box of the path
val pathBoundingRegion = Region(pathBoundingBox)
Log.i("MyLog", "boundsTest: pathBoundingBoxRegion: $pathBoundingRegion")
Log.i("MyLog", "boundsTest: pathBoundingBoxRegion.bounds: ${pathBoundingRegion.bounds}")
pathBoundingRegion.setPath(path, clipRegion)

val bounds = pathBoundingRegion.bounds
Log.i("MyLog", "boundsTest: $bounds")
assertTrue { bounds.left == 0 }
}`
Вы видите, что у меня есть Path, описывающий простой треугольник, который должен привести к тому, что pathBoundingBox имеет значение (0, 0, 5, 5), имеющее 5 по ширине и высоте.
Затем я создаю выберите из него регион и получите границы региона, поэтому убедитесь, что он по-прежнему имеет ту же ограничивающую рамку, но журналы выглядят так.
boundsTest: pathBoundingBox: Rect(0, 0 - 5, 5)
boundsTest: pathBoundingBoxRegion: SkRegion((0,0,5,5))
boundsTest: pathBoundingBoxRegion.bounds: Rect(0, 0 - 5, 5)
boundsTest: Rect(1, 0 - 5, 4)
Как видите, все выглядит нормально, но последний лог кажется странным. Слева — 1 вместо 0, а снизу — 4 вместо 5, что приводит к ширине и высоте 4 вместо 5.
Я пытался поэкспериментировать с некоторыми вещами, например с clipRegion р>

Код: Выделить всё

val clipRegion = Region(-1, -1, 100, 100)

Код: Выделить всё

val clipRegion = Region(0, 0, Int.MAX_VALUE - 1, Int.MAX_VALUE - 1)
или путь (отрицательные значения y или исключая начальные moveTo() и close()
или другие способы установки пути

Код: Выделить всё

pathBoundingRegion.setPath(path, Region(pathBoundingBox.left, pathBoundingBox.top, pathBoundingBox.right, pathBoundingBox.bottom))
или

Код: Выделить всё

pathBoundingRegion.setPath(path, Region(pathRectF.left.toInt(), pathRectF.top.toInt(), pathRectF.right.toInt(), pathRectF.bottom.toInt()))
Но, кажется, ничего не помогает.
Я знаю, что есть другие способы решения моей первоначальной проблемы, и я также благодарен за каждый Альтернативный подход, который у вас может быть, я был бы очень признателен, если бы кто-нибудь помог мне решить этот подход, поскольку я чувствую, что что-то упускаю.

Подробнее здесь: https://stackoverflow.com/questions/789 ... s-expected
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»