PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ lw_dist2d_arc_arc_concentric()

int lw_dist2d_arc_arc_concentric ( const POINT2D A1,
const POINT2D A2,
const POINT2D A3,
double  radius_A,
const POINT2D B1,
const POINT2D B2,
const POINT2D B3,
double  radius_B,
const POINT2D CENTER,
DISTPTS dl 
)

Definition at line 1770 of file measures.c.

1780 {
1781  int seg_size;
1782  double dist_sqr, shortest_sqr;
1783  const POINT2D *P1;
1784  const POINT2D *P2;
1785  POINT2D proj;
1786 
1787  if (radius_A == radius_B)
1788  {
1789  /* Check if B1 or B3 are in the same side as A2 in the A1-A3 arc */
1790  seg_size = lw_segment_side(A1, A3, A2);
1791  if (seg_size == lw_segment_side(A1, A3, B1))
1792  {
1793  dl->p1 = *B1;
1794  dl->p2 = *B1;
1795  dl->distance = 0;
1796  return LW_TRUE;
1797  }
1798  if (seg_size == lw_segment_side(A1, A3, B3))
1799  {
1800  dl->p1 = *B3;
1801  dl->p2 = *B3;
1802  dl->distance = 0;
1803  return LW_TRUE;
1804  }
1805  /* Check if A1 or A3 are in the same side as B2 in the B1-B3 arc */
1806  seg_size = lw_segment_side(B1, B3, B2);
1807  if (seg_size == lw_segment_side(B1, B3, A1))
1808  {
1809  dl->p1 = *A1;
1810  dl->p2 = *A1;
1811  dl->distance = 0;
1812  return LW_TRUE;
1813  }
1814  if (seg_size == lw_segment_side(B1, B3, A3))
1815  {
1816  dl->p1 = *A3;
1817  dl->p2 = *A3;
1818  dl->distance = 0;
1819  return LW_TRUE;
1820  }
1821  }
1822  else
1823  {
1824  /* Check if any projection of B ends are in A*/
1825  seg_size = lw_segment_side(A1, A3, A2);
1826 
1827  /* B1 */
1828  proj.x = CENTER->x + (B1->x - CENTER->x) * radius_A / radius_B;
1829  proj.y = CENTER->y + (B1->y - CENTER->y) * radius_A / radius_B;
1830 
1831  if (seg_size == lw_segment_side(A1, A3, &proj))
1832  {
1833  dl->p1 = proj;
1834  dl->p2 = *B1;
1835  dl->distance = fabs(radius_A - radius_B);
1836  return LW_TRUE;
1837  }
1838  /* B3 */
1839  proj.x = CENTER->x + (B3->x - CENTER->x) * radius_A / radius_B;
1840  proj.y = CENTER->y + (B3->y - CENTER->y) * radius_A / radius_B;
1841  if (seg_size == lw_segment_side(A1, A3, &proj))
1842  {
1843  dl->p1 = proj;
1844  dl->p2 = *B3;
1845  dl->distance = fabs(radius_A - radius_B);
1846  return LW_TRUE;
1847  }
1848 
1849  /* Now check projections of A in B */
1850  seg_size = lw_segment_side(B1, B3, B2);
1851 
1852  /* A1 */
1853  proj.x = CENTER->x + (A1->x - CENTER->x) * radius_B / radius_A;
1854  proj.y = CENTER->y + (A1->y - CENTER->y) * radius_B / radius_A;
1855  if (seg_size == lw_segment_side(B1, B3, &proj))
1856  {
1857  dl->p1 = proj;
1858  dl->p2 = *A1;
1859  dl->distance = fabs(radius_A - radius_B);
1860  return LW_TRUE;
1861  }
1862 
1863  /* A3 */
1864  proj.x = CENTER->x + (A3->x - CENTER->x) * radius_B / radius_A;
1865  proj.y = CENTER->y + (A3->y - CENTER->y) * radius_B / radius_A;
1866  if (seg_size == lw_segment_side(B1, B3, &proj))
1867  {
1868  dl->p1 = proj;
1869  dl->p2 = *A3;
1870  dl->distance = fabs(radius_A - radius_B);
1871  return LW_TRUE;
1872  }
1873  }
1874 
1875  /* Check the shortest between the distances of the 4 ends */
1876  shortest_sqr = dist_sqr = distance2d_sqr_pt_pt(A1, B1);
1877  P1 = A1;
1878  P2 = B1;
1879 
1880  dist_sqr = distance2d_sqr_pt_pt(A1, B3);
1881  if (dist_sqr < shortest_sqr)
1882  {
1883  shortest_sqr = dist_sqr;
1884  P1 = A1;
1885  P2 = B3;
1886  }
1887 
1888  dist_sqr = distance2d_sqr_pt_pt(A3, B1);
1889  if (dist_sqr < shortest_sqr)
1890  {
1891  shortest_sqr = dist_sqr;
1892  P1 = A3;
1893  P2 = B1;
1894  }
1895 
1896  dist_sqr = distance2d_sqr_pt_pt(A3, B3);
1897  if (dist_sqr < shortest_sqr)
1898  {
1899  shortest_sqr = dist_sqr;
1900  P1 = A3;
1901  P2 = B3;
1902  }
1903 
1904  dl->p1 = *P1;
1905  dl->p2 = *P2;
1906  dl->distance = sqrt(shortest_sqr);
1907 
1908  return LW_TRUE;
1909 }
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:93
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
Definition: lwalgorithm.c:62
static double distance2d_sqr_pt_pt(const POINT2D *p1, const POINT2D *p2)
Definition: lwinline.h:35
POINT2D p1
Definition: measures.h:52
POINT2D p2
Definition: measures.h:53
double distance
Definition: measures.h:51
double y
Definition: liblwgeom.h:390
double x
Definition: liblwgeom.h:390

References DISTPTS::distance, distance2d_sqr_pt_pt(), lw_segment_side(), LW_TRUE, DISTPTS::p1, DISTPTS::p2, POINT2D::x, and POINT2D::y.

Referenced by lw_dist2d_arc_arc().

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