Как я эффективно определяю, выпукл ли полигон, невыпукл или сложен?

getTabAt: возвращает вкладку с указанным индексом. (TabLayout.Tab)

getSelectedTabPosition: возвращает позицию текущей выбранной вкладки. -выбранная позиция вкладки или -1, если выбранной вкладки нет .-

setScrollPosition:

void setScrollPosition (int position, 
                float positionOffset, 
                boolean updateSelectedText)

Установите положение прокрутки вкладок. Это полезно для случаев, когда вкладки отображаются как часть контейнера с прокруткой, такого как ViewPager.

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

position -> int: текущая позиция прокрутки

positionOffset -> float: значение из [0, 1), указывающее смещение от позиции.

positionOffset -> boolean: Обновлять ли выбранное состояние текста.

45
задан nbro 25 March 2018 в 23:06
поделиться

3 ответа

Stackoverflow не позволит мне удалить принятый ответ, но я сказал бы выезд ответ Rory Daulton .

23
ответ дан 7 revs, 3 users 79% 4 August 2019 в 10:23
поделиться

Вот тест, чтобы проверить, ли полигон выпукл .

Рассматривают каждый набор трех точек вдоль полигона. Если каждый угол составляет 180 градусов, или меньше у Вас есть выпуклый полигон. При выяснении каждого угла также сохраните рабочее общее количество (180 - угол). Для выпуклого полигона это составит 360.

Это тестовые прогоны в O (n) время.

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

7
ответ дан nbro 26 November 2019 в 20:50
поделиться

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

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

Для каждой последовательной пары ребер многоугольника (каждой тройки точек) , вычислите z-компоненту векторного произведения векторов, определяемых ребрами, указывающими на точки в порядке возрастания. Возьмите перекрестное произведение этих векторов:

 given p[k], p[k+1], p[k+2] each with coordinates x, y:
 dx1 = x[k+1]-x[k]
 dy1 = y[k+1]-y[k]
 dx2 = x[k+2]-x[k+1]
 dy2 = y[k+2]-y[k+1]
 zcrossproduct = dx1*dy2 - dy1*dx2

Многоугольник является выпуклым, если z-компоненты перекрестных произведений либо все положительные, либо все отрицательные. В противном случае многоугольник невыпуклый.

Если имеется N точек, убедитесь, что вы вычислили N перекрестных произведений, например, обязательно используйте тройки (p [N-2], p [N-1], p [0]) и (p [N-1], p [0], p [1]).


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

105
ответ дан 26 November 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: