Как создать отрицательный буфер многоугольника в GEOS? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь создать отрицательный буфер (смещение) многоугольника, используя GEOS (с c api).

Пока я достиг положительного смещения (см. изображение) , однако, когда я пытаюсь сделать ширину '-ve, это ничего не дает. Я подозреваю, что для получения «смещения» необходимо каким-то образом обрезать перед извлечением внешнего кольца.

Если бы вы хорошо просмотрели документацию, но не смогли ее решить, любая помощь будет принята с благодарностью !!

Мой Код ниже, если это поможет:

#include <geos_c.h>  

// Define coordinate sequence
int noPoints = 6 + 1;   // +1 because it is a loop
GEOSCoordSequence* points = GEOSCoordSeq_create(noPoints, 2 /*# ordinates*/);
GEOSCoordSeq_setX(points, 0, 0);
GEOSCoordSeq_setY(points, 0, 0);
GEOSCoordSeq_setX(points, 1, 0);
GEOSCoordSeq_setY(points, 1, 50);
GEOSCoordSeq_setX(points, 2, 50);
GEOSCoordSeq_setY(points, 2, 50);
GEOSCoordSeq_setX(points, 3, 50);
GEOSCoordSeq_setY(points, 3, 0);
GEOSCoordSeq_setX(points, 4, 30);
GEOSCoordSeq_setY(points, 4, 15);
GEOSCoordSeq_setX(points, 5, 20);
GEOSCoordSeq_setY(points, 5, 15);
GEOSCoordSeq_setX(points, noPoints-1, 0);
GEOSCoordSeq_setY(points, noPoints-1, 0);

// Define linear ring
GEOSGeometry* ploop = GEOSGeom_createLinearRing(points);

// Define offset
double width = 15;
int quadsegs = 100;
int endCapStyle = 1;
int joinStyle = 1;
double mitreLimit = 1.0;
const GEOSGeometry* offset = GEOSBufferWithStyle(ploop, width, quadsegs, endCapStyle, joinStyle, mitreLimit); 

// Get exterior ring
const GEOSGeometry* exteriorRing = GEOSGetExteriorRing(offset);

// Convert to coord sequence and draw points
const GEOSCoordSequence *coordSeq = GEOSGeom_getCoordSeq(exteriorRing);
uint numPoints = GEOSGeomGetNumPoints(exteriorRing);
double xCoord, yCoord;

for (uint p = 0; p < numPoints; p++) {
  GEOSCoordSeq_getX(coordSeq, p, &xCoord);
  GEOSCoordSeq_getY(coordSeq, p, &yCoord);
  printf("x: %g\ty:%g\n", xCoord, yCoord);
  drawPoint(xCoord, yCoord);
}

Заранее спасибо!

1 Ответ

0 голосов
/ 06 февраля 2020

Наконец-то решил! геометрия, которую я вводил, была линейным кольцом, а не многоугольником. Для тех, кто столкнется с подобной проблемой в будущем:

Заменить:

GEOSGeometry* ploop = GEOSGeom_createLinearRing(points);

На:

GEOSGeometry* rloop = GEOSGeom_createLinearRing(points); 
const GEOSGeometry* ploop = GEOSGeom_createPolygon(rloop, NULL, 0);
...