[Merkaartor] "Align Nodes" fix [quasi-patch]

Chris Browet cbro at semperpax.com
Sat Aug 22 21:18:58 BST 2009


It will... when I'm back from holidays :-)

- Chris -

2009/8/21 Eugene Alvin Villar <seav80 at gmail.com>

> Hi,
>
> I hope this fix gets integrated. I was just about to ask what the Align
> command was supposed to do since it didn't do anything sane at all. :-)
>
> Eugene
>
>
>
> On Fri, Aug 21, 2009 at 11:55 PM, Chris Baird <cjb at brushtail.apana.org.au>wrote:
>
>> (I attempted to file a bug ticket at first, however Trac is spitting
>> out Python errors.. Trying to post to this list wasn't the easiest,
>> either, with Mailman not understanding RFC5233 +tagging..)
>>
>> The foremost issue I found in the code of the buggy 'Align Nodes'
>> feature was the multiplications overflowing the 32-bit integer
>> datatype in Coord::length (src/Maps/Coord.h, line 83 as of 20090818
>> checkout). This bug was causing src/Maps/Coord.cpp:angle() to return a
>> bogus value.
>>
>> Problem code in length():
>>    return sqrt((double)Lat*Lat+Lon*Lon));
>>
>> A fix by someone from a time when you had to be paranoid about C
>> compiler behavour:
>>
>>    return sqrt((double)((long)Lat*(long)Lat+(long)Lon*(long)Lon));
>>
>>
>> In the process of locating the above bug, I made a few code rewrites
>> 'for clarity', that I should probably include below, just in case I've
>> forgotten a subtlety.
>>
>> src/Maps/Coord.cpp:
>>
>>  double angle(Coord p1)
>>    {
>>        if (p1.length() == 0)
>>          return 0;
>>        double adjacent = (double)p1.lon() / p1.length();
>>        if (p1.lat() > 0)
>>          return acos(adjacent);
>>        return -acos(adjacent);
>>    }
>>
>> The original code mucked-about with constant coordinate conversions
>> (intToRad), which is unnecessary as (Trigonometric) ratios were
>> involved.
>>
>> src/Maps/FeatureManipulations.cpp:alignNodes():
>>
>>  void alignNodes(MapDocument* theDocument, CommandList* theList,
>> PropertiesDock* theDock)
>>  {
>> [..]
>>        //we do the alignment
>>        Coord pos(0,0);
>>        const Coord p1(Nodes[0]->position());
>>        const Coord p2(Nodes[1]->position()-p1);
>>        const double slope = angle(p2);
>>        for (int i=2; i<Nodes.size(); ++i) {
>>                pos=Nodes[i]->position()-p1;
>>                rotate(pos,-slope);
>>                pos.setLat(0);
>>                rotate(pos,slope);
>>                pos=pos+p1;
>>                theList->add(new MoveTrackPointCommand( Nodes[i], pos,
>> theDocument->getDirtyOrOriginLayer(Nodes[i]->layer()) ));
>>        }
>>  }
>>
>> (I had an "Aha!" moment when I figured out how this code worked. Nice
>> idea. :)
>>
>> --
>> Chris Baird,, <cjb+merkaator at brushtail.apana.org.au<cjb%2Bmerkaator at brushtail.apana.org.au>
>> >
>>
>> _______________________________________________
>> Merkaartor mailing list
>> Merkaartor at openstreetmap.org
>> http://lists.openstreetmap.org/listinfo/merkaartor
>>
>
>
>
> --
> http://vaes9.codedgraphic.com
>
> _______________________________________________
> Merkaartor mailing list
> Merkaartor at openstreetmap.org
> http://lists.openstreetmap.org/listinfo/merkaartor
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstreetmap.org/pipermail/merkaartor/attachments/20090822/07bc8ffb/attachment.html>


More information about the Merkaartor mailing list