Обсуждение: 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