Инкрементальное упрощение линии

В интернете много информации об упрощении обычных линий,

https://www.jasondavies.com/simplify/

https://bost.ocks.org/mike/simplify/

http://geomalgorithms.com/a16-_decimate-1.html

http://mourner.github.io/simplify-js/

т.е. когда упрощенные точки известны заранее. Алгоритм Дугласа-Пекера, алгоритм Висвалингама, но что делать, если параметр допуска фиксирован и точки не известны заранее. У меня много точек, и я бы не хотел запускать алгоритм N * Log(N) M тысячу раз, вместо этого я хотел бы, чтобы он обрабатывал мой набор постепенно, пересечения не имеют значения, смысл просто уменьшить Размер набора данных с минимальным визуальным воздействием. Есть ли какой-нибудь умный способ справиться с этой проблемой?

1 ответ

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

В псевдокоде:

Let C be the original chain
Let R be the reduced chain (initially empty)

Add the first point of C to R
For every subsequent point p of C:
    If distance(p, the last point of R) >= ε:
        Add p to R

Что этот подход гарантирует:

  • Длина каждого сегмента в сокращенной цепочке будет не менее ε
  • Расстояние Хаусдорфа между цепями будет не более ε

Что это не гарантирует:

  • Отсутствие самопересечения
  • Любой вид оптимальности (может быть другая цепочка, которая ближе по Хаусдорфу и меньше по количеству точек)
Другие вопросы по тегам