PostGIS  3.3.9dev-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 1780 of file measures.c.

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

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: