@@ -511,7 +511,7 @@ g_spoint_consistent(PG_FUNCTION_ARGS)
511
511
SCK_INTERLEAVE (SELLIPSE , sphereellipse_gen_key , 0 );
512
512
break ;
513
513
case 42 :
514
- SCK_INTERLEAVE (SBOX , spherebox_gen_key , 0 );
514
+ SCK_INTERLEAVE (SBOX , spherebox_gen_key , 0 );
515
515
break ;
516
516
}
517
517
@@ -682,8 +682,11 @@ g_spoint3_consistent(PG_FUNCTION_ARGS)
682
682
PG_RETURN_BOOL (false);
683
683
}
684
684
685
- static double distance_vector_point_3d (Vector3D * v , double x , double y , double z ) {
686
- return acos ( (v -> x * x + v -> y * y + v -> z * z ) / sqrt ( x * x + y * y + z * z ) ); // as v has length=1 by design
685
+ static double
686
+ distance_vector_point_3d (Vector3D * v , double x , double y , double z )
687
+ {
688
+ /* as v has length = 1 by design */
689
+ return acos ((v -> x * x + v -> y * y + v -> z * z ) / sqrt (x * x + y * y + z * z ));
687
690
}
688
691
689
692
Datum
@@ -1683,121 +1686,218 @@ g_spoint_distance(PG_FUNCTION_ARGS)
1683
1686
{
1684
1687
GISTENTRY * entry = (GISTENTRY * ) PG_GETARG_POINTER (0 );
1685
1688
StrategyNumber strategy = (StrategyNumber ) PG_GETARG_UINT16 (2 );
1686
- Box3D * box = (Box3D * ) DatumGetPointer (entry -> key );
1689
+ Box3D * box = (Box3D * ) DatumGetPointer (entry -> key );
1687
1690
double retval ;
1688
1691
SPoint * point = (SPoint * ) PG_GETARG_POINTER (1 );
1689
- Vector3D v_point , v_low , v_high ;
1692
+ Vector3D v_point ,
1693
+ v_low ,
1694
+ v_high ;
1690
1695
1691
1696
switch (strategy )
1692
1697
{
1693
1698
case 17 :
1694
- // Prepare data for calculation
1699
+ /* Prepare data for calculation */
1695
1700
spoint_vector3d (& v_point , point );
1696
- v_low .x = (double )box -> low .coord [0 ] / MAXCVALUE ;
1697
- v_low .y = (double )box -> low .coord [1 ] / MAXCVALUE ;
1698
- v_low .z = (double )box -> low .coord [2 ] / MAXCVALUE ;
1699
- v_high .x = (double )box -> high .coord [0 ] / MAXCVALUE ;
1700
- v_high .y = (double )box -> high .coord [1 ] / MAXCVALUE ;
1701
- v_high .z = (double )box -> high .coord [2 ] / MAXCVALUE ;
1702
- // a box splits space into 27 subspaces (6+12+8+1) with different distance calculation
1703
- if (v_point .x < v_low .x ) {
1704
- if (v_point .y < v_low .y ) {
1705
- if (v_point .z < v_low .z ) {
1706
- retval = distance_vector_point_3d (& v_point , v_low .x , v_low .y , v_low .z ); //point2point distance
1707
- } else if (v_point .z < v_high .z ) {
1708
- retval = distance_vector_point_3d (& v_point , v_low .x , v_low .y , v_point .z ); //point2line distance
1709
- } else {
1710
- retval = distance_vector_point_3d (& v_point , v_low .x , v_low .y , v_high .z ); //point2point distance
1711
- }
1712
- } else if (v_point .y < v_high .y ) {
1713
- if (v_point .z < v_low .z ) {
1714
- retval = distance_vector_point_3d (& v_point , v_low .x , v_point .y , v_low .z ); //point2line distance
1715
- } else if (v_point .z < v_high .z ) {
1716
- retval = distance_vector_point_3d (& v_point , v_low .x , v_point .y , v_point .z ); //point2plane distance
1717
- } else {
1718
- retval = distance_vector_point_3d (& v_point , v_low .x , v_point .y , v_high .z ); //point2line distance
1701
+ v_low .x = (double ) box -> low .coord [0 ] / MAXCVALUE ;
1702
+ v_low .y = (double ) box -> low .coord [1 ] / MAXCVALUE ;
1703
+ v_low .z = (double ) box -> low .coord [2 ] / MAXCVALUE ;
1704
+ v_high .x = (double ) box -> high .coord [0 ] / MAXCVALUE ;
1705
+ v_high .y = (double ) box -> high .coord [1 ] / MAXCVALUE ;
1706
+ v_high .z = (double ) box -> high .coord [2 ] / MAXCVALUE ;
1707
+
1708
+ /*
1709
+ * a box splits space into 27 subspaces (6+12+8+1) with different
1710
+ * distance calculation
1711
+ */
1712
+ if (v_point .x < v_low .x )
1713
+ {
1714
+ if (v_point .y < v_low .y )
1715
+ {
1716
+ if (v_point .z < v_low .z )
1717
+ {
1718
+ /* point2point distance */
1719
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_low .y , v_low .z );
1720
+ }
1721
+ else if (v_point .z < v_high .z )
1722
+ {
1723
+ /* point2line distance */
1724
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_low .y , v_point .z );
1725
+ }
1726
+ else
1727
+ {
1728
+ /* point2point distance */
1729
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_low .y , v_high .z );
1730
+ }
1731
+ }
1732
+ else if (v_point .y < v_high .y )
1733
+ {
1734
+ if (v_point .z < v_low .z )
1735
+ {
1736
+ /* point2line distance */
1737
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_point .y , v_low .z );
1738
+ }
1739
+ else if (v_point .z < v_high .z )
1740
+ {
1741
+ /* point2plane distance */
1742
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_point .y , v_point .z );
1743
+ }
1744
+ else
1745
+ {
1746
+ /* point2line distance */
1747
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_point .y , v_high .z );
1748
+ }
1749
+ }
1750
+ else
1751
+ {
1752
+ if (v_point .z < v_low .z )
1753
+ {
1754
+ /* point2point distance */
1755
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_high .y , v_low .z );
1756
+ }
1757
+ else if (v_point .z < v_high .z )
1758
+ {
1759
+ /* point2line distance */
1760
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_high .y , v_point .z );
1761
+ }
1762
+ else
1763
+ {
1764
+ /* point2point distance */
1765
+ retval = distance_vector_point_3d (& v_point , v_low .x , v_high .y , v_high .z );
1766
+ }
1767
+ }
1768
+ }
1769
+ else if (v_point .x < v_high .x )
1770
+ {
1771
+ if (v_point .y < v_low .y )
1772
+ {
1773
+ if (v_point .z < v_low .z )
1774
+ {
1775
+ /* p2line distance */
1776
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_low .y , v_low .z );
1777
+ }
1778
+ else if (v_point .z < v_high .z )
1779
+ {
1780
+ /* point2plane distance */
1781
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_low .y , v_point .z );
1782
+ }
1783
+ else
1784
+ {
1785
+ /* point2line distance */
1786
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_low .y , v_high .z );
1719
1787
}
1720
- } else {
1721
- if (v_point .z < v_low .z ) {
1722
- retval = distance_vector_point_3d (& v_point , v_low .x , v_high .y , v_low .z ); //point2point distance
1723
- } else if (v_point .z < v_high .z ) {
1724
- retval = distance_vector_point_3d (& v_point , v_low .x , v_high .y , v_point .z ); //point2line distance
1725
- } else {
1726
- retval = distance_vector_point_3d (& v_point , v_low .x , v_high .y , v_high .z ); //point2point distance
1788
+ }
1789
+ else if (v_point .y < v_high .y )
1790
+ {
1791
+ if (v_point .z < v_low .z )
1792
+ {
1793
+ /* point2plane distance */
1794
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_point .y , v_low .z );
1795
+ }
1796
+ else if (v_point .z < v_high .z )
1797
+ {
1798
+ /* inside cube */
1799
+ retval = 0 ;
1800
+ }
1801
+ else
1802
+ {
1803
+ /* point2plane distance */
1804
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_point .y , v_high .z );
1727
1805
}
1728
1806
}
1729
- } else if (v_point .x < v_high .x ) {
1730
- if (v_point .y < v_low .y ) {
1731
- if (v_point .z < v_low .z ) {
1732
- retval = distance_vector_point_3d (& v_point , v_point .x , v_low .y , v_low .z ); //p2line distance
1733
- } else if (v_point .z < v_high .z ) {
1734
- retval = distance_vector_point_3d (& v_point , v_point .x , v_low .y , v_point .z ); //point2plane distance
1735
- } else {
1736
- retval = distance_vector_point_3d (& v_point , v_point .x , v_low .y , v_high .z ); //point2line distance
1737
- }
1738
- } else if (v_point .y < v_high .y ) {
1739
- if (v_point .z < v_low .z ) {
1740
- retval = distance_vector_point_3d (& v_point , v_point .x , v_point .y , v_low .z ); //point2plane distance
1741
- } else if (v_point .z < v_high .z ) {
1742
- retval = 0 ; // inside cube
1743
- } else {
1744
- retval = distance_vector_point_3d (& v_point , v_point .x , v_point .y , v_high .z ); //point2plane distance
1807
+ else
1808
+ {
1809
+ if (v_point .z < v_low .z )
1810
+ {
1811
+ /* point2line distance */
1812
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_high .y , v_low .z );
1813
+ }
1814
+ else if (v_point .z < v_high .z )
1815
+ {
1816
+ /* point2plane distance */
1817
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_high .y , v_point .z );
1745
1818
}
1746
- } else {
1747
- if (v_point .z < v_low .z ) {
1748
- retval = distance_vector_point_3d (& v_point , v_point .x , v_high .y , v_low .z ); //point2line distance
1749
- } else if (v_point .z < v_high .z ) {
1750
- retval = distance_vector_point_3d (& v_point , v_point .x , v_high .y , v_point .z ); //point2plane distance
1751
- } else {
1752
- retval = distance_vector_point_3d (& v_point , v_point .x , v_high .y , v_high .z ); //point2line distance
1819
+ else
1820
+ {
1821
+ /* point2line distance */
1822
+ retval = distance_vector_point_3d (& v_point , v_point .x , v_high .y , v_high .z );
1753
1823
}
1754
1824
}
1755
- } else {
1756
- if (v_point .y < v_low .y ) {
1757
- if (v_point .z < v_low .z ) {
1758
- retval = distance_vector_point_3d (& v_point , v_high .x , v_low .y , v_low .z ); //p2p distance
1759
- } else if (v_point .z < v_high .z ) {
1760
- retval = distance_vector_point_3d (& v_point , v_high .x , v_low .y , v_point .z ); //point2line distance
1761
- } else {
1762
- retval = distance_vector_point_3d (& v_point , v_high .x , v_low .y , v_high .z ); //point2point distance
1763
- }
1764
- } else if (v_point .y < v_high .y ) {
1765
- if (v_point .z < v_low .z ) {
1766
- retval = distance_vector_point_3d (& v_point , v_high .x , v_point .y , v_low .z ); //point2line distance
1767
- } else if (v_point .z < v_high .z ) {
1768
- retval = distance_vector_point_3d (& v_point , v_high .x , v_point .y , v_point .z ); //point2plane distance
1769
- } else {
1770
- retval = distance_vector_point_3d (& v_point , v_high .x , v_point .y , v_high .z ); //point2line distance
1825
+ }
1826
+ else
1827
+ {
1828
+ if (v_point .y < v_low .y )
1829
+ {
1830
+ if (v_point .z < v_low .z )
1831
+ {
1832
+ /* p2p distance */
1833
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_low .y , v_low .z );
1771
1834
}
1772
- } else {
1773
- if (v_point .z < v_low .z ) {
1774
- retval = distance_vector_point_3d (& v_point , v_high .x , v_high .y , v_low .z ); //point2point distance
1775
- } else if (v_point .z < v_high .z ) {
1776
- retval = distance_vector_point_3d (& v_point , v_high .x , v_high .y , v_point .z ); //point2line distance
1777
- } else {
1778
- retval = distance_vector_point_3d (& v_point , v_high .x , v_high .y , v_high .z ); //point2point distance
1835
+ else if (v_point .z < v_high .z )
1836
+ {
1837
+ /* point2line distance */
1838
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_low .y , v_point .z );
1839
+ }
1840
+ else
1841
+ {
1842
+ /* point2point distance */
1843
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_low .y , v_high .z );
1844
+ }
1845
+ }
1846
+ else if (v_point .y < v_high .y )
1847
+ {
1848
+ if (v_point .z < v_low .z )
1849
+ {
1850
+ /* point2line distance */
1851
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_point .y , v_low .z );
1852
+ }
1853
+ else if (v_point .z < v_high .z )
1854
+ {
1855
+ /* point2plane distance */
1856
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_point .y , v_point .z );
1857
+ }
1858
+ else
1859
+ {
1860
+ /* point2line distance */
1861
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_point .y , v_high .z );
1862
+ }
1863
+ }
1864
+ else
1865
+ {
1866
+ if (v_point .z < v_low .z )
1867
+ {
1868
+ /* point2point distance */
1869
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_high .y , v_low .z );
1870
+ }
1871
+ else if (v_point .z < v_high .z )
1872
+ {
1873
+ /* point2line distance */
1874
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_high .y , v_point .z );
1875
+ }
1876
+ else
1877
+ {
1878
+ /* point2point distance */
1879
+ retval = distance_vector_point_3d (& v_point , v_high .x , v_high .y , v_high .z );
1779
1880
}
1780
1881
}
1781
1882
}
1782
-
1883
+
1783
1884
elog (DEBUG1 , "distance (%lg,%lg,%lg %lg,%lg,%lg) <-> (%lg,%lg) = %lg" ,
1784
- v_low .x , v_low .y , v_low .z ,
1785
- v_high .x , v_high .y , v_high .z ,
1786
- point -> lng , point -> lat ,
1787
- retval
1788
- );
1885
+ v_low .x , v_low .y , v_low .z ,
1886
+ v_high .x , v_high .y , v_high .z ,
1887
+ point -> lng , point -> lat ,
1888
+ retval
1889
+ );
1789
1890
break ;
1790
1891
1791
1892
default :
1792
1893
elog (ERROR , "unrecognized cube strategy number: %d" , strategy );
1793
- retval = 0 ; /* keep compiler quiet */
1894
+ retval = 0 ; /* keep compiler quiet */
1794
1895
break ;
1795
1896
}
1897
+
1796
1898
PG_RETURN_FLOAT8 (retval );
1797
1899
}
1798
1900
1799
-
1800
-
1801
1901
/*
1802
1902
* Represents information about an entry that can be placed to either group
1803
1903
* without affecting overlap over selected axis ("common entry").
@@ -2329,7 +2429,7 @@ do_picksplit(Box3D *boxes, OffsetNumber maxoff, GIST_SPLITVEC *v)
2329
2429
{
2330
2430
box = & boxes [i ];
2331
2431
commonEntries [i ].delta = fabs ((unionSizeBox3D (leftBox , box ) - leftBoxSize ) -
2332
- (unionSizeBox3D (rightBox , box ) - rightBoxSize ));
2432
+ (unionSizeBox3D (rightBox , box ) - rightBoxSize ));
2333
2433
}
2334
2434
2335
2435
/*
0 commit comments