CG_NurbsCurveApproximate — データポイントに許容値範囲内で近似するNURBS曲線を生成します。
geometry CG_NurbsCurveApproximate(geometry data_points, integer degree, float8 tolerance, integer max_control_points=100);
与えたデータポイントを指定した許容値内に収まるようにNURBS曲線を生成します。補間と違い、この曲線は必ずしも全てのポイントを通りませんが、少ない制御点で滑らかに近似します。
パラメーター:
data_points - 近似用ポイントを持つLINESTRINGジオメトリー。
degree - NURBS曲線の次数。
tolerance - 曲線とデータポイントとの最大許容距離。
max_control_points - 任意パラメーター。制御点の最大数 (デフォルト: 100)。曲線の複雑さを制限します。
Availability: 3.7.0 - SFCGAL >= 2.3.0 が必要。
このメソッドにはSFCGALバックエンドが必要です。
この関数は3次元に対応し、Z値を削除しません。
Approximate noisy 2D data with a degree-2 curve and a tolerance of 0.5.
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;
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)))
Approximate a 3D point set while preserving the Z dimension in the fitted curve.
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;
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)))