Обсуждение: BUG #5745: geometry bug?

Поиск
Список
Период
Сортировка

BUG #5745: geometry bug?

От
"Jin"
Дата:
The following bug has been logged online:

Bug reference:      5745
Logged by:          Jin
Email address:      jindiax@gmail.com
PostgreSQL version: 8.4.5
Operating system:   windows xp pro sp3
Description:        geometry bug?
Details:

The distance of the horizontal lseg and the point on that is inaccurate.

select point(1.0,1.0) <-> lseg'(0.0,0.0),(2.0,0.0)';
↓
result 1.4142135623731

must be 1.0

P.S.
I'm sorry about if it was already reported.
Because I can't read English well.

Re: BUG #5745: geometry bug?

От
Mike Fowler
Дата:
On 10/11/10 10:08, Jin wrote:
> The following bug has been logged online:
>
> Bug reference:      5745
> Logged by:          Jin
> Email address:      jindiax@gmail.com
> PostgreSQL version: 8.4.5
> Operating system:   windows xp pro sp3
> Description:        geometry bug?
> Details:
>
> The distance of the horizontal lseg and the point on that is inaccurate.
>
> select point(1.0,1.0)<->  lseg'(0.0,0.0),(2.0,0.0)';
> ↓
> result 1.4142135623731
>
> must be 1.0
>
> P.S.
> I'm sorry about if it was already reported.
> Because I can't read English well.
>

 From my digging it appears that this is returning the distance between
the first point in the line and the individual point. To get 1.0 you
would be looking for the the distance between the midpoint of the line
and the individual point which can be achieved with:

SELECT POINT(1.0,1.0) <-> POINT(LSEG'(0.0,0.0),(2.0,0.0)');

Digging through the documentation I can't find anything that says which
point should be used in the line for distance comparisons. So I would
rephrase this bug as:

The distance of the horizontal lseg and the point is calculated against
the first point in the line. Should this be calculated against the
midpoint of the line instead?

Regards,

--
Mike Fowler
Registered Linux user: 379787

Re: BUG #5745: geometry bug?

От
Tom Lane
Дата:
Mike Fowler <mike@mlfowler.com> writes:
> On 10/11/10 10:08, Jin wrote:
>> The distance of the horizontal lseg and the point on that is inaccurate.

> From my digging it appears that this is returning the distance between
> the first point in the line and the individual point.

I didn't look into the code yet, but that would match the result.

> The distance of the horizontal lseg and the point is calculated against
> the first point in the line. Should this be calculated against the
> midpoint of the line instead?

The standard geometrical notion of distance between a point and a line
is that you drop the perpendicular from the point to the line, and the
length of that perpendicular is the distance.  Now, in the case of a
line segment, the perpendicular might not intersect the segment:

        x
        |
        |
        |
        +    o-----------------o

in which case I think the distance from the point to the segment's
nearer endpoint is a reasonable definition.  In some quick testing
it seems to work that way for every case except a perfectly horizontal
line segment.  So I'm thinking somebody fat-fingered the corner case
where the perpendicular would have infinite slope, and it is falling
through to the "take the nearer endpoint" case when it shouldn't.

            regards, tom lane

Re: BUG #5745: geometry bug?

От
Tom Lane
Дата:
I wrote:
> So I'm thinking somebody fat-fingered the corner case
> where the perpendicular would have infinite slope, and it is falling
> through to the "take the nearer endpoint" case when it shouldn't.

Actually it's more basic than that: the line_construct_pm() function
is just completely bogus for the case of infinite slope.  Will fix.

            regards, tom lane