Обсуждение: BUG #4872: Geometric function problem
The following bug has been logged online:
Bug reference: 4872
Logged by: Nick Roosevelt
Email address: nroose@thepinc.com
PostgreSQL version: 8.2.5
Operating system: Linux
Description: Geometric function problem
Details:
I am getting bad results for distance between point and lseg. As you can
see below, the first result is correct, and the second is clearly not.
nroose_dev=> select version();
version
----------------------------------------------------------------------------
-------------------------------
PostgreSQL 8.2.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC)
4.1.2 20070626 (Red Hat 4.1.2-13)
(1 row)
nroose_dev=> select point(0,0) <-> lseg(point(10,-100),point(10,450));
?column?
----------
10
(1 row)
nroose_dev=> select point(0,0) <-> lseg(point(10,-100),point(11,450));
?column?
------------------
100.498756211209
(1 row)
nroose_dev=>
"Nick Roosevelt" <nroose@thepinc.com> writes:
> I am getting bad results for distance between point and lseg. As you can
> see below, the first result is correct, and the second is clearly not.
Hmm ... what it looks like to me is that there's an ancient thinko
in dist_ps_internal(). It's trying to calculate the slope of the
perpendicular to the given line segment, and it gets it wrong.
The segment's own slope would be deltaY / deltaX, so the slope
of the perpendicular should be the negative inverse of that, ie
-deltaX / deltaY, but what it was actually calculating was
-deltaY / deltaX. So it was getting the wrong answers for any
situation where the given line segment's slope wasn't +1/-1
(or 0 or infinite, which are correctly special-cased).
Depressingly, fixing this changes none of the regression test outputs;
apparently all the test cases involving distances were one of the
special cases. But it's really amazing no one complained of this
before ...
regards, tom lane