PostGIS  2.5.2dev-r@@SVN_REVISION@@

## ◆ lw_arc_side()

 int lw_arc_side ( const POINT2D * A1, const POINT2D * A2, const POINT2D * A3, const POINT2D * Q )

Definition at line 178 of file lwalgorithm.c.

References distance2d_pt_pt(), lw_arc_center(), and lw_segment_side().

Referenced by ptarrayarc_contains_point_partial(), and rect_leaf_node_segment_side().

179 {
180  POINT2D C;
182  double side_Q, side_A2;
183  double d;
184
185  side_Q = lw_segment_side(A1, A3, Q);
186  radius_A = lw_arc_center(A1, A2, A3, &C);
187  side_A2 = lw_segment_side(A1, A3, A2);
188
189  /* Linear case */
190  if ( radius_A < 0 )
191  return side_Q;
192
193  d = distance2d_pt_pt(Q, &C);
194
195  /* Q is on the arc boundary */
196  if ( d == radius_A && side_Q == side_A2 )
197  {
198  return 0;
199  }
200
201  /* Q on A1-A3 line, so its on opposite side to A2 */
202  if ( side_Q == 0 )
203  {
204  return -1 * side_A2;
205  }
206
207  /*
208  * Q is inside the arc boundary, so it's not on the side we
209  * might think from examining only the end points
210  */
211  if ( d < radius_A && side_Q == side_A2 )
212  {
213  side_Q *= -1;
214  }
215
216  return side_Q;
217 }
double distance2d_pt_pt(const POINT2D *p1, const POINT2D *p2)
Definition: measures.c:2313
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.
Definition: lwalgorithm.c:228
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
Definition: lwalgorithm.c:64
Here is the call graph for this function:
Here is the caller graph for this function: