Обсуждение: BUG #5745: geometry bug?
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.
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
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
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