Если Вы пишете VM в C, оказывается что использование вычисленного gotos (gcc) как это:
char run(char *pc) {
void *opcodes[3] = {&&op_inc, &&op_lda_direct, &&op_hlt};
#define NEXT_INSTR(stride) goto *(opcodes[*(pc += stride)])
NEXT_INSTR(0);
op_inc:
++acc;
NEXT_INSTR(1);
op_lda_direct:
acc = ram[++pc];
NEXT_INSTR(1);
op_hlt:
return acc;
}
работы намного быстрее, чем стандартный переключатель в цикле.
Проблема с простым отбрасыванием точек состоит в том, что вы можете быстро исказить форму исходного многоугольника. Лучше подойти к этому с другой стороны; начните с базовой аппроксимации многоугольника, а затем уточните его вверх до вашей сложной формы.
Прекрасным примером этого подхода является алгоритм Дугласа-Пуккера . Вы начинаете с двух вершин, нарисованных из полного многоугольника. Добавьте третью вершину, выбрав ту, которая находится дальше всего от ребра, проведенного между первыми двумя вершинами. Продолжайте добавлять точки, пока не получите что-то, что достаточно похоже на исходный многоугольник.
Дуглас-Пойкер определенно правильный подход. Есть несколько простых способов получить доступ к его реализациям в PostGIS и QGIS, и я подумал, что добавлю сюда для тех, кто сталкивается с этим сообщением с похожим вопросом. Цель состоит в том, чтобы начать с чего-то вроде этого:
и получить что-то вроде этого:
В PostGIS Дуглас-Пекер реализован как simpleify
, синтаксис, подробно описанный здесь, на bostongis. .org - это некий вариант:
SELECT transform (упрощение (transform (the_geom, 2249), 500), 4326) из the_geo_table
Это работало очень хорошо даже с полным национальным набором данных, с некоторыми ошибки, которые кажутся из-за плохих исходных данных. Также оказывается, что в QGIS пункт меню Инструменты> Инструменты геометрии>
Вот простой итеративный алгоритм сглаживания:
для каждых трех последовательных точек на любом пути, если средняя точка не имеет пересечений и находится в пределах некоторого небольшого порогового угла прямого пути между двумя внешние точки, снимите его.
Повторяйте до тех пор, пока не получите желаемое.