Namn

CG_NurbsCurveApproximate — Skapar en approximerande NURBS-kurva som anpassas till datapunkter inom en tolerans

Synopsis

geometry CG_NurbsCurveApproximate(geometry data_points, integer degree, float8 tolerance, integer max_control_points=100);

Beskrivning

Skapar en NURBS-kurva som approximerar de angivna datapunkterna inom den angivna toleransen. Till skillnad från interpolering passerar kurvan inte nödvändigtvis genom alla punkter, men ger en jämn anpassning med färre kontrollpunkter.

Parametrar:

  • data_points – en LINESTRING-geometri som innehåller punkterna som ska approximeras.

  • degree – polynomgrad för NURBS-kurvan.

  • tolerance – största tillåtna avstånd mellan kurvan och datapunkterna.

  • max_control_points – valfritt högsta antal kontrollpunkter (standard: 100). Begränsar kurvans komplexitet.

Tillgänglighet: 3.7.0 – kräver SFCGAL >= 2.3.0.

Denna metod behöver SFCGAL-backend.

Denna funktion stöder 3d och kommer inte att tappa z-index.

Exempel

Approximera brusiga 2D-data med en kurva av grad 2 och toleransen 0,5.

Kod
WITH data AS (
  SELECT 'LINESTRING(0 0,1 2.1,2 1.9,3 3.2,4 2.8,5 1)'::geometry AS input_points
)
SELECT input_points AS input_points,
       CG_NurbsCurveApproximate(input_points, 2, 0.5) AS approximated_curve
FROM data;
Utdata
LINESTRING(0 0,1 2.1,2 1.9,3 3.2,4 2.8,5 1) | NURBSCURVE(DEGREE 2, CONTROLPOINTS(NURBSPOINT(WEIGHTEDPOINT(0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(-0.05 2.64),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(2.24 1.65),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(2.79 3.48),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(4.84 2.43),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 1),WEIGHT 1)),KNOTS (KNOT(0,3), KNOT(0.35,1), KNOT(0.51,1), KNOT(0.68,1), KNOT(1,3)))
Figur
Geometry figure for visual-cg-nurbscurveapproximate-01

Approximera en 3D-punktuppsättning samtidigt som Z-dimensionen bevaras i den anpassade kurvan.

Kod
WITH data AS (
  SELECT 'LINESTRING Z (0 0 0,1 2 1,2 3 2,3 2 1,4 1 0,5 0 0)'::geometry AS input_points
)
SELECT input_points AS input_points,
       CG_NurbsCurveApproximate(input_points, 3, 0.1) AS approximated_curve
FROM data;
Utdata
LINESTRING Z (0 0 0,1 2 1,2 3 2,3 2 1,4 1 0,5 0 0) | NURBSCURVE Z (DEGREE 3,CONTROLPOINTS Z (NURBSPOINT(WEIGHTEDPOINT Z (0 0 0),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (0.18 -0.15 -1.29),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (1.49 4.36 3.35),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (3.33 1.33 0.38),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (4.34 0.83 -0.44),WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT Z (5 0 0),WEIGHT 1)),KNOTS (KNOT(0,4), KNOT(0.46,1), KNOT(0.64,1), KNOT(1,4)))
Figur
Geometry figure for visual-cg-nurbscurveapproximate-02