This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch fix/issue-2678-affine-visuals
in repository https://gitbox.apache.org/repos/asf/sedona.git

commit 50254a7fb41507fde353081cab5020de41389db0
Author: Jia Yu <[email protected]>
AuthorDate: Wed Mar 4 18:09:09 2026 -0800

    [GH-2678] Add SVG visuals for affine transformation functions (Phase 8)
    
    Add overlay-style SVG illustrations for all 7 affine transformation
    functions showing input geometry (blue dashed) and transformed result
    (green solid) in the same coordinate space:
    
    - ST_Affine: horizontal shear transform
    - ST_Rotate: 45 degree counter-clockwise rotation around centroid
    - ST_RotateX: 3D rotation around X-axis (Y compression in 2D projection)
    - ST_RotateY: 3D rotation around Y-axis (X compression in 2D projection)
    - ST_Scale: non-uniform scaling (1.5x, 2y) from origin
    - ST_ScaleGeom: scaling relative to centroid (0.5x, 0.75y)
    - ST_Translate: translation by (deltaX=2, deltaY=1.5)
    
    Image references inserted into all 3 doc variants (SQL, Flink, Snowflake).
    
    Closes #2678 (partial)
---
 docs/api/flink/Affine-Transformations/ST_Affine.md |  2 ++
 docs/api/flink/Affine-Transformations/ST_Rotate.md |  2 ++
 .../api/flink/Affine-Transformations/ST_RotateX.md |  2 ++
 .../api/flink/Affine-Transformations/ST_RotateY.md |  2 ++
 docs/api/flink/Affine-Transformations/ST_Scale.md  |  2 ++
 .../flink/Affine-Transformations/ST_ScaleGeom.md   |  2 ++
 .../flink/Affine-Transformations/ST_Translate.md   |  2 ++
 .../Affine-Transformations/ST_Affine.md            |  2 ++
 .../Affine-Transformations/ST_Rotate.md            |  2 ++
 .../Affine-Transformations/ST_RotateX.md           |  2 ++
 .../Affine-Transformations/ST_RotateY.md           |  2 ++
 .../vector-data/Affine-Transformations/ST_Scale.md |  2 ++
 .../Affine-Transformations/ST_ScaleGeom.md         |  2 ++
 .../Affine-Transformations/ST_Translate.md         |  2 ++
 docs/api/sql/Affine-Transformations/ST_Affine.md   |  2 ++
 docs/api/sql/Affine-Transformations/ST_Rotate.md   |  2 ++
 docs/api/sql/Affine-Transformations/ST_RotateX.md  |  2 ++
 docs/api/sql/Affine-Transformations/ST_RotateY.md  |  2 ++
 docs/api/sql/Affine-Transformations/ST_Scale.md    |  2 ++
 .../api/sql/Affine-Transformations/ST_ScaleGeom.md |  2 ++
 .../api/sql/Affine-Transformations/ST_Translate.md |  2 ++
 docs/image/ST_Affine/ST_Affine.svg                 | 20 ++++++++++++++++++
 docs/image/ST_Rotate/ST_Rotate.svg                 | 24 ++++++++++++++++++++++
 docs/image/ST_RotateX/ST_RotateX.svg               | 20 ++++++++++++++++++
 docs/image/ST_RotateY/ST_RotateY.svg               | 20 ++++++++++++++++++
 docs/image/ST_Scale/ST_Scale.svg                   | 24 ++++++++++++++++++++++
 docs/image/ST_ScaleGeom/ST_ScaleGeom.svg           | 22 ++++++++++++++++++++
 docs/image/ST_Translate/ST_Translate.svg           | 24 ++++++++++++++++++++++
 28 files changed, 196 insertions(+)

diff --git a/docs/api/flink/Affine-Transformations/ST_Affine.md 
b/docs/api/flink/Affine-Transformations/ST_Affine.md
index c8714c9f01..bea4229b04 100644
--- a/docs/api/flink/Affine-Transformations/ST_Affine.md
+++ b/docs/api/flink/Affine-Transformations/ST_Affine.md
@@ -37,6 +37,8 @@ Based on the invoked function, the following transformation 
is applied:
 
 If the given geometry is empty, the result is also empty.
 
+![ST_Affine](../../../image/ST_Affine/ST_Affine.svg "ST_Affine")
+
 Format:
 
 `ST_Affine(geometry, a, b, c, d, e, f, g, h, i, xOff, yOff, zOff)`
diff --git a/docs/api/flink/Affine-Transformations/ST_Rotate.md 
b/docs/api/flink/Affine-Transformations/ST_Rotate.md
index 41b489d948..4e4998b9ee 100644
--- a/docs/api/flink/Affine-Transformations/ST_Rotate.md
+++ b/docs/api/flink/Affine-Transformations/ST_Rotate.md
@@ -21,6 +21,8 @@
 
 Introduction: Rotates a geometry by a specified angle in radians 
counter-clockwise around a given origin point. The origin for rotation can be 
specified as either a POINT geometry or x and y coordinates. If the origin is 
not specified, the geometry is rotated around POINT(0 0).
 
+![ST_Rotate](../../../image/ST_Rotate/ST_Rotate.svg "ST_Rotate")
+
 Formats;
 
 `ST_Rotate (geometry: Geometry, angle: Double)`
diff --git a/docs/api/flink/Affine-Transformations/ST_RotateX.md 
b/docs/api/flink/Affine-Transformations/ST_RotateX.md
index b239e29246..9d9e0c8f47 100644
--- a/docs/api/flink/Affine-Transformations/ST_RotateX.md
+++ b/docs/api/flink/Affine-Transformations/ST_RotateX.md
@@ -21,6 +21,8 @@
 
 Introduction: Performs a counter-clockwise rotation of the specified geometry 
around the X-axis by the given angle measured in radians.
 
+![ST_RotateX](../../../image/ST_RotateX/ST_RotateX.svg "ST_RotateX")
+
 Format: `ST_RotateX(geometry: Geometry, angle: Double)`
 
 Return type: `Geometry`
diff --git a/docs/api/flink/Affine-Transformations/ST_RotateY.md 
b/docs/api/flink/Affine-Transformations/ST_RotateY.md
index 24d6b6ba61..dc0f0f40ad 100644
--- a/docs/api/flink/Affine-Transformations/ST_RotateY.md
+++ b/docs/api/flink/Affine-Transformations/ST_RotateY.md
@@ -21,6 +21,8 @@
 
 Introduction: Performs a counter-clockwise rotation of the specified geometry 
around the Y-axis by the given angle measured in radians.
 
+![ST_RotateY](../../../image/ST_RotateY/ST_RotateY.svg "ST_RotateY")
+
 Format: `ST_RotateY(geometry: Geometry, angle: Double)`
 
 Return type: `Geometry`
diff --git a/docs/api/flink/Affine-Transformations/ST_Scale.md 
b/docs/api/flink/Affine-Transformations/ST_Scale.md
index 34940342a8..7b9be8a7aa 100644
--- a/docs/api/flink/Affine-Transformations/ST_Scale.md
+++ b/docs/api/flink/Affine-Transformations/ST_Scale.md
@@ -24,6 +24,8 @@ Introduction: This function scales the geometry to a new size 
by multiplying the
 !!!Note
     This function is designed for scaling 2D geometries. While it currently 
doesn't support scaling the Z and M coordinates, it preserves these values 
during the scaling operation.
 
+![ST_Scale](../../../image/ST_Scale/ST_Scale.svg "ST_Scale")
+
 Format: `ST_Scale(geometry: Geometry, scaleX: Double, scaleY: Double)`
 
 Return type: `Geometry`
diff --git a/docs/api/flink/Affine-Transformations/ST_ScaleGeom.md 
b/docs/api/flink/Affine-Transformations/ST_ScaleGeom.md
index 7a2408bb3b..5a7db86270 100644
--- a/docs/api/flink/Affine-Transformations/ST_ScaleGeom.md
+++ b/docs/api/flink/Affine-Transformations/ST_ScaleGeom.md
@@ -26,6 +26,8 @@ To scale the geometry relative to a point other than the true 
origin (e.g., scal
 !!!Note
     This function is designed for scaling 2D geometries. While it currently 
doesn't support scaling the Z and M coordinates, it preserves these values 
during the scaling operation.
 
+![ST_ScaleGeom](../../../image/ST_ScaleGeom/ST_ScaleGeom.svg "ST_ScaleGeom")
+
 Format:
 
 `ST_ScaleGeom(geometry: Geometry, factor: Geometry, origin: Geometry)`
diff --git a/docs/api/flink/Affine-Transformations/ST_Translate.md 
b/docs/api/flink/Affine-Transformations/ST_Translate.md
index 8ee50846c3..185cebe69d 100644
--- a/docs/api/flink/Affine-Transformations/ST_Translate.md
+++ b/docs/api/flink/Affine-Transformations/ST_Translate.md
@@ -27,6 +27,8 @@ If the geometry is empty, no change is done to it.
 
 If the given geometry contains sub-geometries (GEOMETRY COLLECTION, MULTI 
POLYGON/LINE/POINT), all underlying geometries are individually translated.
 
+![ST_Translate](../../../image/ST_Translate/ST_Translate.svg "ST_Translate")
+
 Format:
 
 `ST_Translate(geometry: Geometry, deltaX: Double, deltaY: Double, deltaZ: 
Double)`
diff --git a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Affine.md 
b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Affine.md
index 6053df6778..f705c5650d 100644
--- a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Affine.md
+++ b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Affine.md
@@ -37,6 +37,8 @@ Based on the invoked function, the following transformation 
is applied:
 
 If the given geometry is empty, the result is also empty.
 
+![ST_Affine](../../../../image/ST_Affine/ST_Affine.svg "ST_Affine")
+
 Format:
 
 `ST_Affine(geometry, a, b, c, d, e, f, g, h, i, xOff, yOff, zOff)`
diff --git a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Rotate.md 
b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Rotate.md
index 3aaa6ed918..969398c7d5 100644
--- a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Rotate.md
+++ b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Rotate.md
@@ -21,6 +21,8 @@
 
 Introduction: Rotates a geometry by a specified angle in radians 
counter-clockwise around a given origin point. The origin for rotation can be 
specified as either a POINT geometry or x and y coordinates. If the origin is 
not specified, the geometry is rotated around POINT(0 0).
 
+![ST_Rotate](../../../../image/ST_Rotate/ST_Rotate.svg "ST_Rotate")
+
 Formats;
 
 `ST_Rotate (geometry: Geometry, angle: Double)`
diff --git 
a/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateX.md 
b/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateX.md
index db2e52e30a..f9297fac85 100644
--- a/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateX.md
+++ b/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateX.md
@@ -21,6 +21,8 @@
 
 Introduction: Performs a counter-clockwise rotation of the specified geometry 
around the X-axis by the given angle measured in radians.
 
+![ST_RotateX](../../../../image/ST_RotateX/ST_RotateX.svg "ST_RotateX")
+
 Format: `ST_RotateX(geometry: Geometry, angle: Double)`
 
 Return type: `Geometry`
diff --git 
a/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateY.md 
b/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateY.md
index 311dc12b32..ca1f4d9b52 100644
--- a/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateY.md
+++ b/docs/api/snowflake/vector-data/Affine-Transformations/ST_RotateY.md
@@ -21,6 +21,8 @@
 
 Introduction: Performs a counter-clockwise rotation of the specified geometry 
around the Y-axis by the given angle measured in radians.
 
+![ST_RotateY](../../../../image/ST_RotateY/ST_RotateY.svg "ST_RotateY")
+
 Format: `ST_RotateY(geometry: Geometry, angle: Double)`
 
 Return type: `Geometry`
diff --git a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Scale.md 
b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Scale.md
index b416efd63f..ce1b43c976 100644
--- a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Scale.md
+++ b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Scale.md
@@ -24,6 +24,8 @@ Introduction: This function scales the geometry to a new size 
by multiplying the
 !!!Note
     This function is designed for scaling 2D geometries. While it currently 
doesn't support scaling the Z and M coordinates, it preserves these values 
during the scaling operation.
 
+![ST_Scale](../../../../image/ST_Scale/ST_Scale.svg "ST_Scale")
+
 Format: `ST_Scale(geometry: Geometry, scaleX: Double, scaleY: Double)`
 
 Return type: `Geometry`
diff --git 
a/docs/api/snowflake/vector-data/Affine-Transformations/ST_ScaleGeom.md 
b/docs/api/snowflake/vector-data/Affine-Transformations/ST_ScaleGeom.md
index f45e0ddd80..750013cb6f 100644
--- a/docs/api/snowflake/vector-data/Affine-Transformations/ST_ScaleGeom.md
+++ b/docs/api/snowflake/vector-data/Affine-Transformations/ST_ScaleGeom.md
@@ -26,6 +26,8 @@ To scale the geometry relative to a point other than the true 
origin (e.g., scal
 !!!Note
     This function is designed for scaling 2D geometries. While it currently 
doesn't support scaling the Z and M coordinates, it preserves these values 
during the scaling operation.
 
+![ST_ScaleGeom](../../../../image/ST_ScaleGeom/ST_ScaleGeom.svg "ST_ScaleGeom")
+
 Format:
 
 `ST_ScaleGeom(geometry: Geometry, factor: Geometry, origin: Geometry)`
diff --git 
a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Translate.md 
b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Translate.md
index c05cb646b7..e145103f1e 100644
--- a/docs/api/snowflake/vector-data/Affine-Transformations/ST_Translate.md
+++ b/docs/api/snowflake/vector-data/Affine-Transformations/ST_Translate.md
@@ -26,6 +26,8 @@ If the geometry is 2D, and a deltaZ parameter is specified, 
no change is done to
 If the geometry is empty, no change is done to it.
 If the given geometry contains sub-geometries (GEOMETRY COLLECTION, MULTI 
POLYGON/LINE/POINT), all underlying geometries are individually translated.
 
+![ST_Translate](../../../../image/ST_Translate/ST_Translate.svg "ST_Translate")
+
 Format: `ST_Translate(geometry: geometry, deltaX: deltaX, deltaY: deltaY, 
deltaZ: deltaZ)`
 
 Return type: `Geometry`
diff --git a/docs/api/sql/Affine-Transformations/ST_Affine.md 
b/docs/api/sql/Affine-Transformations/ST_Affine.md
index cf4e74f365..70afa17b42 100644
--- a/docs/api/sql/Affine-Transformations/ST_Affine.md
+++ b/docs/api/sql/Affine-Transformations/ST_Affine.md
@@ -37,6 +37,8 @@ Based on the invoked function, the following transformation 
is applied:
 
 If the given geometry is empty, the result is also empty.
 
+![ST_Affine](../../../image/ST_Affine/ST_Affine.svg "ST_Affine")
+
 Format:
 
 `ST_Affine(geometry, a, b, c, d, e, f, g, h, i, xOff, yOff, zOff)`
diff --git a/docs/api/sql/Affine-Transformations/ST_Rotate.md 
b/docs/api/sql/Affine-Transformations/ST_Rotate.md
index 41b489d948..4e4998b9ee 100644
--- a/docs/api/sql/Affine-Transformations/ST_Rotate.md
+++ b/docs/api/sql/Affine-Transformations/ST_Rotate.md
@@ -21,6 +21,8 @@
 
 Introduction: Rotates a geometry by a specified angle in radians 
counter-clockwise around a given origin point. The origin for rotation can be 
specified as either a POINT geometry or x and y coordinates. If the origin is 
not specified, the geometry is rotated around POINT(0 0).
 
+![ST_Rotate](../../../image/ST_Rotate/ST_Rotate.svg "ST_Rotate")
+
 Formats;
 
 `ST_Rotate (geometry: Geometry, angle: Double)`
diff --git a/docs/api/sql/Affine-Transformations/ST_RotateX.md 
b/docs/api/sql/Affine-Transformations/ST_RotateX.md
index b239e29246..9d9e0c8f47 100644
--- a/docs/api/sql/Affine-Transformations/ST_RotateX.md
+++ b/docs/api/sql/Affine-Transformations/ST_RotateX.md
@@ -21,6 +21,8 @@
 
 Introduction: Performs a counter-clockwise rotation of the specified geometry 
around the X-axis by the given angle measured in radians.
 
+![ST_RotateX](../../../image/ST_RotateX/ST_RotateX.svg "ST_RotateX")
+
 Format: `ST_RotateX(geometry: Geometry, angle: Double)`
 
 Return type: `Geometry`
diff --git a/docs/api/sql/Affine-Transformations/ST_RotateY.md 
b/docs/api/sql/Affine-Transformations/ST_RotateY.md
index 24d6b6ba61..dc0f0f40ad 100644
--- a/docs/api/sql/Affine-Transformations/ST_RotateY.md
+++ b/docs/api/sql/Affine-Transformations/ST_RotateY.md
@@ -21,6 +21,8 @@
 
 Introduction: Performs a counter-clockwise rotation of the specified geometry 
around the Y-axis by the given angle measured in radians.
 
+![ST_RotateY](../../../image/ST_RotateY/ST_RotateY.svg "ST_RotateY")
+
 Format: `ST_RotateY(geometry: Geometry, angle: Double)`
 
 Return type: `Geometry`
diff --git a/docs/api/sql/Affine-Transformations/ST_Scale.md 
b/docs/api/sql/Affine-Transformations/ST_Scale.md
index 34940342a8..7b9be8a7aa 100644
--- a/docs/api/sql/Affine-Transformations/ST_Scale.md
+++ b/docs/api/sql/Affine-Transformations/ST_Scale.md
@@ -24,6 +24,8 @@ Introduction: This function scales the geometry to a new size 
by multiplying the
 !!!Note
     This function is designed for scaling 2D geometries. While it currently 
doesn't support scaling the Z and M coordinates, it preserves these values 
during the scaling operation.
 
+![ST_Scale](../../../image/ST_Scale/ST_Scale.svg "ST_Scale")
+
 Format: `ST_Scale(geometry: Geometry, scaleX: Double, scaleY: Double)`
 
 Return type: `Geometry`
diff --git a/docs/api/sql/Affine-Transformations/ST_ScaleGeom.md 
b/docs/api/sql/Affine-Transformations/ST_ScaleGeom.md
index 7a2408bb3b..5a7db86270 100644
--- a/docs/api/sql/Affine-Transformations/ST_ScaleGeom.md
+++ b/docs/api/sql/Affine-Transformations/ST_ScaleGeom.md
@@ -26,6 +26,8 @@ To scale the geometry relative to a point other than the true 
origin (e.g., scal
 !!!Note
     This function is designed for scaling 2D geometries. While it currently 
doesn't support scaling the Z and M coordinates, it preserves these values 
during the scaling operation.
 
+![ST_ScaleGeom](../../../image/ST_ScaleGeom/ST_ScaleGeom.svg "ST_ScaleGeom")
+
 Format:
 
 `ST_ScaleGeom(geometry: Geometry, factor: Geometry, origin: Geometry)`
diff --git a/docs/api/sql/Affine-Transformations/ST_Translate.md 
b/docs/api/sql/Affine-Transformations/ST_Translate.md
index 5904ea931e..a03f088031 100644
--- a/docs/api/sql/Affine-Transformations/ST_Translate.md
+++ b/docs/api/sql/Affine-Transformations/ST_Translate.md
@@ -26,6 +26,8 @@ If the geometry is 2D, and a deltaZ parameter is specified, 
no change is done to
 If the geometry is empty, no change is done to it.
 If the given geometry contains sub-geometries (GEOMETRY COLLECTION, MULTI 
POLYGON/LINE/POINT), all underlying geometries are individually translated.
 
+![ST_Translate](../../../image/ST_Translate/ST_Translate.svg "ST_Translate")
+
 Format:
 
 `ST_Translate(geometry: Geometry, deltaX: Double, deltaY: Double, deltaZ: 
Double)`
diff --git a/docs/image/ST_Affine/ST_Affine.svg 
b/docs/image/ST_Affine/ST_Affine.svg
new file mode 100644
index 0000000000..72d86c364a
--- /dev/null
+++ b/docs/image/ST_Affine/ST_Affine.svg
@@ -0,0 +1,20 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="400" height="180" viewBox="0 0 
400 180">
+  <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+  <text x="200" y="18" font-family="monospace" font-size="12" fill="#333" 
text-anchor="middle" font-weight="bold">ST_Affine</text>
+  <text x="200" y="32" font-family="monospace" font-size="9" fill="#888" 
text-anchor="middle">horizontal shear (b=0.4)</text>
+  <polygon points="113.1,149.2 246.8,149.2 246.8,48.8 113.1,48.8 113.1,149.2" 
stroke="#1565C0" stroke-width="2" fill="rgba(21,101,192,0.12)" 
stroke-dasharray="6,3"/>
+  <circle cx="113.1" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="246.8" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="246.8" cy="48.8" r="2.5" fill="#1565C0"/>
+  <circle cx="113.1" cy="48.8" r="2.5" fill="#1565C0"/>
+  <polygon points="113.1,149.2 246.8,149.2 286.9,48.8 153.2,48.8 113.1,149.2" 
stroke="#43A047" stroke-width="2" fill="rgba(67,160,71,0.18)"/>
+  <circle cx="113.1" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="246.8" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="286.9" cy="48.8" r="2.5" fill="#43A047"/>
+  <circle cx="153.2" cy="48.8" r="2.5" fill="#43A047"/>
+
+  <rect x="100" y="162" width="8" height="8" fill="rgba(21,101,192,0.12)" 
stroke="#1565C0" stroke-width="1" stroke-dasharray="2,1"/>
+  <text x="112" y="170" font-family="monospace" font-size="9" 
fill="#1565C0">Input</text>
+  <rect x="220" y="162" width="8" height="8" fill="rgba(67,160,71,0.18)" 
stroke="#43A047" stroke-width="1"/>
+  <text x="232" y="170" font-family="monospace" font-size="9" 
fill="#43A047">Result</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Rotate/ST_Rotate.svg 
b/docs/image/ST_Rotate/ST_Rotate.svg
new file mode 100644
index 0000000000..31b26124df
--- /dev/null
+++ b/docs/image/ST_Rotate/ST_Rotate.svg
@@ -0,0 +1,24 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="400" height="180" viewBox="0 0 
400 180">
+  <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+  <text x="200" y="18" font-family="monospace" font-size="12" fill="#333" 
text-anchor="middle" font-weight="bold">ST_Rotate</text>
+  <text x="200" y="32" font-family="monospace" font-size="9" fill="#888" 
text-anchor="middle">angle=45° counter-clockwise</text>
+  <polygon points="162.4,133.6 247.1,133.6 247.1,105.3 190.6,105.3 190.6,48.8 
162.4,48.8 162.4,133.6" stroke="#1565C0" stroke-width="2" 
fill="rgba(21,101,192,0.12)" stroke-dasharray="6,3"/>
+  <circle cx="162.4" cy="133.6" r="2.5" fill="#1565C0"/>
+  <circle cx="247.1" cy="133.6" r="2.5" fill="#1565C0"/>
+  <circle cx="247.1" cy="105.3" r="2.5" fill="#1565C0"/>
+  <circle cx="190.6" cy="105.3" r="2.5" fill="#1565C0"/>
+  <circle cx="190.6" cy="48.8" r="2.5" fill="#1565C0"/>
+  <circle cx="162.4" cy="48.8" r="2.5" fill="#1565C0"/>
+  <polygon points="200.0,149.2 259.9,89.3 239.9,69.3 200.0,109.2 160.1,69.3 
140.1,89.3 200.0,149.2" stroke="#43A047" stroke-width="2" 
fill="rgba(67,160,71,0.18)"/>
+  <circle cx="200.0" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="259.9" cy="89.3" r="2.5" fill="#43A047"/>
+  <circle cx="239.9" cy="69.3" r="2.5" fill="#43A047"/>
+  <circle cx="200.0" cy="109.2" r="2.5" fill="#43A047"/>
+  <circle cx="160.1" cy="69.3" r="2.5" fill="#43A047"/>
+  <circle cx="140.1" cy="89.3" r="2.5" fill="#43A047"/>
+
+  <rect x="100" y="162" width="8" height="8" fill="rgba(21,101,192,0.12)" 
stroke="#1565C0" stroke-width="1" stroke-dasharray="2,1"/>
+  <text x="112" y="170" font-family="monospace" font-size="9" 
fill="#1565C0">Input</text>
+  <rect x="220" y="162" width="8" height="8" fill="rgba(67,160,71,0.18)" 
stroke="#43A047" stroke-width="1"/>
+  <text x="232" y="170" font-family="monospace" font-size="9" 
fill="#43A047">Result</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_RotateX/ST_RotateX.svg 
b/docs/image/ST_RotateX/ST_RotateX.svg
new file mode 100644
index 0000000000..27a2feb64f
--- /dev/null
+++ b/docs/image/ST_RotateX/ST_RotateX.svg
@@ -0,0 +1,20 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="400" height="180" viewBox="0 0 
400 180">
+  <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+  <text x="200" y="18" font-family="monospace" font-size="12" fill="#333" 
text-anchor="middle" font-weight="bold">ST_RotateX</text>
+  <text x="200" y="32" font-family="monospace" font-size="9" fill="#888" 
text-anchor="middle">angle=45° around X-axis (Y compresses)</text>
+  <polygon points="133.1,149.2 266.9,149.2 266.9,48.8 133.1,48.8 133.1,149.2" 
stroke="#1565C0" stroke-width="2" fill="rgba(21,101,192,0.12)" 
stroke-dasharray="6,3"/>
+  <circle cx="133.1" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="266.9" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="266.9" cy="48.8" r="2.5" fill="#1565C0"/>
+  <circle cx="133.1" cy="48.8" r="2.5" fill="#1565C0"/>
+  <polygon points="133.1,149.2 266.9,149.2 266.9,78.2 133.1,78.2 133.1,149.2" 
stroke="#43A047" stroke-width="2" fill="rgba(67,160,71,0.18)"/>
+  <circle cx="133.1" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="266.9" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="266.9" cy="78.2" r="2.5" fill="#43A047"/>
+  <circle cx="133.1" cy="78.2" r="2.5" fill="#43A047"/>
+
+  <rect x="100" y="162" width="8" height="8" fill="rgba(21,101,192,0.12)" 
stroke="#1565C0" stroke-width="1" stroke-dasharray="2,1"/>
+  <text x="112" y="170" font-family="monospace" font-size="9" 
fill="#1565C0">Input</text>
+  <rect x="220" y="162" width="8" height="8" fill="rgba(67,160,71,0.18)" 
stroke="#43A047" stroke-width="1"/>
+  <text x="232" y="170" font-family="monospace" font-size="9" 
fill="#43A047">Result</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_RotateY/ST_RotateY.svg 
b/docs/image/ST_RotateY/ST_RotateY.svg
new file mode 100644
index 0000000000..7a54bb8ad1
--- /dev/null
+++ b/docs/image/ST_RotateY/ST_RotateY.svg
@@ -0,0 +1,20 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="400" height="180" viewBox="0 0 
400 180">
+  <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+  <text x="200" y="18" font-family="monospace" font-size="12" fill="#333" 
text-anchor="middle" font-weight="bold">ST_RotateY</text>
+  <text x="200" y="32" font-family="monospace" font-size="9" fill="#888" 
text-anchor="middle">angle=45° around Y-axis (X compresses)</text>
+  <polygon points="133.1,149.2 266.9,149.2 266.9,48.8 133.1,48.8 133.1,149.2" 
stroke="#1565C0" stroke-width="2" fill="rgba(21,101,192,0.12)" 
stroke-dasharray="6,3"/>
+  <circle cx="133.1" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="266.9" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="266.9" cy="48.8" r="2.5" fill="#1565C0"/>
+  <circle cx="133.1" cy="48.8" r="2.5" fill="#1565C0"/>
+  <polygon points="133.1,149.2 227.7,149.2 227.7,48.8 133.1,48.8 133.1,149.2" 
stroke="#43A047" stroke-width="2" fill="rgba(67,160,71,0.18)"/>
+  <circle cx="133.1" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="227.7" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="227.7" cy="48.8" r="2.5" fill="#43A047"/>
+  <circle cx="133.1" cy="48.8" r="2.5" fill="#43A047"/>
+
+  <rect x="100" y="162" width="8" height="8" fill="rgba(21,101,192,0.12)" 
stroke="#1565C0" stroke-width="1" stroke-dasharray="2,1"/>
+  <text x="112" y="170" font-family="monospace" font-size="9" 
fill="#1565C0">Input</text>
+  <rect x="220" y="162" width="8" height="8" fill="rgba(67,160,71,0.18)" 
stroke="#43A047" stroke-width="1"/>
+  <text x="232" y="170" font-family="monospace" font-size="9" 
fill="#43A047">Result</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Scale/ST_Scale.svg b/docs/image/ST_Scale/ST_Scale.svg
new file mode 100644
index 0000000000..90b4e5c738
--- /dev/null
+++ b/docs/image/ST_Scale/ST_Scale.svg
@@ -0,0 +1,24 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="400" height="180" viewBox="0 0 
400 180">
+  <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+  <text x="200" y="18" font-family="monospace" font-size="12" fill="#333" 
text-anchor="middle" font-weight="bold">ST_Scale</text>
+  <text x="200" y="32" font-family="monospace" font-size="9" fill="#888" 
text-anchor="middle">scaleX=1.5, scaleY=2</text>
+  <polygon points="162.4,149.2 212.5,149.2 212.5,132.4 179.1,132.4 179.1,99.0 
162.4,99.0 162.4,149.2" stroke="#1565C0" stroke-width="2" 
fill="rgba(21,101,192,0.12)" stroke-dasharray="6,3"/>
+  <circle cx="162.4" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="212.5" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="212.5" cy="132.4" r="2.5" fill="#1565C0"/>
+  <circle cx="179.1" cy="132.4" r="2.5" fill="#1565C0"/>
+  <circle cx="179.1" cy="99.0" r="2.5" fill="#1565C0"/>
+  <circle cx="162.4" cy="99.0" r="2.5" fill="#1565C0"/>
+  <polygon points="162.4,149.2 237.6,149.2 237.6,115.7 187.5,115.7 187.5,48.8 
162.4,48.8 162.4,149.2" stroke="#43A047" stroke-width="2" 
fill="rgba(67,160,71,0.18)"/>
+  <circle cx="162.4" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="237.6" cy="149.2" r="2.5" fill="#43A047"/>
+  <circle cx="237.6" cy="115.7" r="2.5" fill="#43A047"/>
+  <circle cx="187.5" cy="115.7" r="2.5" fill="#43A047"/>
+  <circle cx="187.5" cy="48.8" r="2.5" fill="#43A047"/>
+  <circle cx="162.4" cy="48.8" r="2.5" fill="#43A047"/>
+
+  <rect x="100" y="162" width="8" height="8" fill="rgba(21,101,192,0.12)" 
stroke="#1565C0" stroke-width="1" stroke-dasharray="2,1"/>
+  <text x="112" y="170" font-family="monospace" font-size="9" 
fill="#1565C0">Input</text>
+  <rect x="220" y="162" width="8" height="8" fill="rgba(67,160,71,0.18)" 
stroke="#43A047" stroke-width="1"/>
+  <text x="232" y="170" font-family="monospace" font-size="9" 
fill="#43A047">Result</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_ScaleGeom/ST_ScaleGeom.svg 
b/docs/image/ST_ScaleGeom/ST_ScaleGeom.svg
new file mode 100644
index 0000000000..d550f7dad7
--- /dev/null
+++ b/docs/image/ST_ScaleGeom/ST_ScaleGeom.svg
@@ -0,0 +1,22 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="400" height="180" viewBox="0 0 
400 180">
+  <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+  <text x="200" y="18" font-family="monospace" font-size="12" fill="#333" 
text-anchor="middle" font-weight="bold">ST_ScaleGeom</text>
+  <text x="200" y="32" font-family="monospace" font-size="9" fill="#888" 
text-anchor="middle">factor=(0.5, 0.75) relative to centroid</text>
+  <polygon points="159.9,149.2 240.1,149.2 240.1,89.0 200.0,48.8 159.9,89.0 
159.9,149.2" stroke="#1565C0" stroke-width="2" fill="rgba(21,101,192,0.12)" 
stroke-dasharray="6,3"/>
+  <circle cx="159.9" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="240.1" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="240.1" cy="89.0" r="2.5" fill="#1565C0"/>
+  <circle cx="200.0" cy="48.8" r="2.5" fill="#1565C0"/>
+  <circle cx="159.9" cy="89.0" r="2.5" fill="#1565C0"/>
+  <polygon points="179.9,138.1 220.1,138.1 220.1,93.0 200.0,62.9 179.9,93.0 
179.9,138.1" stroke="#43A047" stroke-width="2" fill="rgba(67,160,71,0.18)"/>
+  <circle cx="179.9" cy="138.1" r="2.5" fill="#43A047"/>
+  <circle cx="220.1" cy="138.1" r="2.5" fill="#43A047"/>
+  <circle cx="220.1" cy="93.0" r="2.5" fill="#43A047"/>
+  <circle cx="200.0" cy="62.9" r="2.5" fill="#43A047"/>
+  <circle cx="179.9" cy="93.0" r="2.5" fill="#43A047"/>
+
+  <rect x="100" y="162" width="8" height="8" fill="rgba(21,101,192,0.12)" 
stroke="#1565C0" stroke-width="1" stroke-dasharray="2,1"/>
+  <text x="112" y="170" font-family="monospace" font-size="9" 
fill="#1565C0">Input</text>
+  <rect x="220" y="162" width="8" height="8" fill="rgba(67,160,71,0.18)" 
stroke="#43A047" stroke-width="1"/>
+  <text x="232" y="170" font-family="monospace" font-size="9" 
fill="#43A047">Result</text>
+</svg>
\ No newline at end of file
diff --git a/docs/image/ST_Translate/ST_Translate.svg 
b/docs/image/ST_Translate/ST_Translate.svg
new file mode 100644
index 0000000000..d1c1454e59
--- /dev/null
+++ b/docs/image/ST_Translate/ST_Translate.svg
@@ -0,0 +1,24 @@
+<svg xmlns="http://www.w3.org/2000/svg"; width="400" height="180" viewBox="0 0 
400 180">
+  <rect width="400" height="180" fill="#f5f5f5" rx="5"/>
+  <text x="200" y="18" font-family="monospace" font-size="12" fill="#333" 
text-anchor="middle" font-weight="bold">ST_Translate</text>
+  <text x="200" y="32" font-family="monospace" font-size="9" fill="#888" 
text-anchor="middle">deltaX=2, deltaY=1.5</text>
+  <polygon points="144.3,149.2 211.1,149.2 211.1,126.9 166.6,126.9 166.6,82.3 
144.3,82.3 144.3,149.2" stroke="#1565C0" stroke-width="2" 
fill="rgba(21,101,192,0.12)" stroke-dasharray="6,3"/>
+  <circle cx="144.3" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="211.1" cy="149.2" r="2.5" fill="#1565C0"/>
+  <circle cx="211.1" cy="126.9" r="2.5" fill="#1565C0"/>
+  <circle cx="166.6" cy="126.9" r="2.5" fill="#1565C0"/>
+  <circle cx="166.6" cy="82.3" r="2.5" fill="#1565C0"/>
+  <circle cx="144.3" cy="82.3" r="2.5" fill="#1565C0"/>
+  <polygon points="188.9,115.7 255.7,115.7 255.7,93.4 211.1,93.4 211.1,48.9 
188.9,48.9 188.9,115.7" stroke="#43A047" stroke-width="2" 
fill="rgba(67,160,71,0.18)"/>
+  <circle cx="188.9" cy="115.7" r="2.5" fill="#43A047"/>
+  <circle cx="255.7" cy="115.7" r="2.5" fill="#43A047"/>
+  <circle cx="255.7" cy="93.4" r="2.5" fill="#43A047"/>
+  <circle cx="211.1" cy="93.4" r="2.5" fill="#43A047"/>
+  <circle cx="211.1" cy="48.9" r="2.5" fill="#43A047"/>
+  <circle cx="188.9" cy="48.9" r="2.5" fill="#43A047"/>
+
+  <rect x="100" y="162" width="8" height="8" fill="rgba(21,101,192,0.12)" 
stroke="#1565C0" stroke-width="1" stroke-dasharray="2,1"/>
+  <text x="112" y="170" font-family="monospace" font-size="9" 
fill="#1565C0">Input</text>
+  <rect x="220" y="162" width="8" height="8" fill="rgba(67,160,71,0.18)" 
stroke="#43A047" stroke-width="1"/>
+  <text x="232" y="170" font-family="monospace" font-size="9" 
fill="#43A047">Result</text>
+</svg>
\ No newline at end of file

Reply via email to