PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ lw_arc_length()

double lw_arc_length ( const POINT2D A1,
const POINT2D A2,
const POINT2D A3 
)

Returns the length of a circular arc segment.

Definition at line 119 of file lwalgorithm.c.

120{
121 POINT2D C;
122 double radius_A, circumference_A;
123 int a2_side, clockwise;
124 double a1, a3;
125 double angle;
126
127 if ( lw_arc_is_pt(A1, A2, A3) )
128 return 0.0;
129
130 radius_A = lw_arc_center(A1, A2, A3, &C);
131
132 /* Co-linear! Return linear distance! */
133 if ( radius_A < 0 )
134 {
135 double dx = A1->x - A3->x;
136 double dy = A1->y - A3->y;
137 return sqrt(dx*dx + dy*dy);
138 }
139
140 /* Closed circle! Return the circumference! */
141 circumference_A = M_PI * 2 * radius_A;
142 if ( p2d_same(A1, A3) )
143 return circumference_A;
144
145 /* Determine the orientation of the arc */
146 a2_side = lw_segment_side(A1, A3, A2);
147
148 /* The side of the A1/A3 line that A2 falls on dictates the sweep
149 direction from A1 to A3. */
150 if ( a2_side == -1 )
151 clockwise = LW_TRUE;
152 else
153 clockwise = LW_FALSE;
154
155 /* Angles of each point that defines the arc section */
156 a1 = atan2(A1->y - C.y, A1->x - C.x);
157 a3 = atan2(A3->y - C.y, A3->x - C.x);
158
159 /* What's the sweep from A1 to A3? */
160 if ( clockwise )
161 {
162 if ( a1 > a3 )
163 angle = a1 - a3;
164 else
165 angle = 2*M_PI + a1 - a3;
166 }
167 else
168 {
169 if ( a3 > a1 )
170 angle = a3 - a1;
171 else
172 angle = 2*M_PI + a3 - a1;
173 }
174
175 /* Length as proportion of circumference */
176 return circumference_A * (angle / (2*M_PI));
177}
#define LW_FALSE
Definition liblwgeom.h:108
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
double lw_arc_center(const POINT2D *p1, const POINT2D *p2, const POINT2D *p3, POINT2D *result)
Determines the center of the circle defined by the three given points.
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
Definition lwalgorithm.c:65
int lw_arc_is_pt(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3)
Returns true if arc A is actually a point (all vertices are the same) .
int p2d_same(const POINT2D *p1, const POINT2D *p2)
Definition lwalgorithm.c:50
double y
Definition liblwgeom.h:376
double x
Definition liblwgeom.h:376

References lw_arc_center(), lw_arc_is_pt(), LW_FALSE, lw_segment_side(), LW_TRUE, p2d_same(), POINT2D::x, and POINT2D::y.

Referenced by ptarray_arc_length_2d(), and test_lw_arc_length().

Here is the call graph for this function:
Here is the caller graph for this function: