Работа с невыпуклыми многоугольниками будет сложной задачей, поэтому, возможно, вам следует начать, разделив ваш многоугольник на несколько выпуклых многоугольников. Вы можете использовать внутренний угол, чтобы решить, где угол не выпуклый, и применять разрезы, которые связаны с этими углами, как минимум. Но, возможно, Matlab поддерживает некоторый алгоритм triangulation, который вы можете использовать.
Как только у вас есть выпуклые многоугольники, вы можете думать о них как о пересечениях полупространств. Если и B являются два угла, которые пронизывают линию, и P является точка сетки, вы можете использовать знак определителя
| Ax Bx Px |
| Ay By Py |
| 1 1 1 |
решить, с какой стороны от линии точки вранье. Какой знак зависит от порядка, в котором вы обходите свой полигон, но если вы обрабатываете углы по порядку, то точка P лежит внутри выпуклого многоугольника, если знак никогда не изменяется. Горизонтальные или вертикальные линии не будут особыми случаями в этой формулировке, и у вас не будет подразделений, которые хороши для производительности и могут также помочь с точностью.
Если вы не хотите перебирать все точки сетки с помощью этого метода, вы можете придумать различные оптимизации. Можно было бы прекомпретировать перекрестный продукт A × B из двух углов, охватывающих каждую строку. Точечный продукт между этим кросс-продуктом и точкой P равен указанному выше определителю (т. Е. Det (A, B, P) = (A × B) · P), поэтому вместо полного детерминанта вам остается только вычислить три продукта и две суммы для каждой комбинации точечных линий.
Если вы хотите оптимизировать это еще больше, вы, вероятно, лучше всего посмотрите на что-то вроде Bresenham's line algorithm, чтобы вычислить точки на границе многоугольника, а затем просто перечислить все точки горизонтальной (или вертикальной) линии между соответствующие граничные точки.
Если вы не выполняете все ваши вычисления с целыми числами или другими точными числами, вопросы округления могут быть серьезной проблемой во всем этом. Вы должны решить, следует ли подсчитывать граничные точки, а также точно рассчитывать точки внутри исходного многоугольника, но на границе его выпуклых участков ровно один раз. Сколько усилий это требует, в значительной степени зависит от того, как выглядит ваш ввод.
Как выглядит ваша «сетка»? – Junuxx
Вы можете создать полуплоскости для каждого сегмента - протянуть его до линии и посмотреть, какие точки находятся слева (0), а справа (1) - булевая матрица. Тогда просто пересечь все 4 из них. –