[GRASS-dev] [bug #2765] (grass) v.buffer produces strange results

Maciek Sieczka via RT grass-bugs at intevation.de
Sun Nov 26 16:38:08 EST 2006


hamish_nospam at yahoo.com wrote (Fri, Nov 24 2006 03:39:17):

> Maciej Sieczka wrote:
>>> g.region ditches_buf

>> Which one is that? It's not there in the package I sent you.
 
> It is the saved region:

Oh, right. Sorry, my bad. I thought you meant some vector map (I missed the
fact you didn't put "vect=" into your g.region call).

>>> can you isolate the problem with:
...

> clearer: if you can extract it to a few simple areas & export with
> v.out.ascii it is easier to follow step by step in the debugger. Also
> you can post that to the bug's history and others can try without
> needing you to send them the 1mb location download- more data points.

You are right, should have thought of using v.out.ascii for debugging.

>>> maybe it is a FP epsilon problem, which is slightly different
>>> machine to machine + compiler to compiler? e.g. 123.4000000000002 vs
>>> 123.4.

>> Would that mean v.buffer is supposed to work on some Linuces and not
>> on the other? That would be a nightmare.
 
> I don't know. It is just a guess of why our two systems would be
> different. I am testing with a Pent4 32bit debian/stable machine.
> Is yours 64bit?

No. 32 bit, Pentium M 750 (Dothan). Ubuntu Dapper 2.6.15-27-686. I'm not using
any optimization at the build time. GCC 4.0.3-1ubuntu5.

> v.buffer will try and do the same calculation, but the
> computer may give a slightly different results. That will happen with
> any 32bit and 64bit system doing FP math, with any program. It would be
> a v.buffer bug if e.g. if it tests FP1==FP2 when it should test
> "fabs(FP2-FP1) <= EPSILON"

This is propably not the case here. But I have a lead :). Please read at the
bottom.

> does "d.what.vect -f" (or without -f check area size) show the original
> as a closed area?

Yes:

$ d.vect ditches; d.what.vect -f

 map: 'ditches'
mapset: 'vbuffer_bugs'
feature type: Area
area size: 475.449658

Layer: 1
category: 1205
Database connection not defined

>> Please watch the swf at [3], where I present step-by-step the two runs
>> of v.buffer on the problematic dataset - before and after the required
>> "edit", including how the "edit" looks like. I'm just moving vertex of
>> a topologically clean boundary a bit and snapping it back. Strange...

> sorry, I don't have flash installed. But I trust you are honest and we
> have tried the same commands :)

Following your v.out.ascii hint here's what I found out.

Extract the problematic area 1205:
$ v.extract in=ditches out=ditch_1205 type=area list=1205

Buffer it:
$ v.buffer ditch_1205 out=ditch_1205_b1 type=area buffer=1
$ v.buffer ditch_1205 out=ditch_1205_b4 type=area buffer=4

As expected, both outputs are wrong, see [2] and [3], respectively.

Running the ditch_1205 through ascii vector, like:
$ v.out.ascii ditch_1205 form=standard | v.in.ascii format=standard
out=ditch_1205_asciied

doesn't change anything - buffering the ditch_1205_asciied still yields wrong
results, exactly the same as seen on [2] and [3].

However, after "editing" the ditch_1205 in v.digit, like shown on [4],[5],[6],
ie. dissjoining the boundary and snapping the vertex back, 

$ g.copy vect=ditch_1205,ditch_1205_edt
$ v.digit ditch_1205_edt #see [4],[5],[6]

buffering this resulting vector yields correct results; see [7],[8], respectively:

$ v.buffer ditch_1205_edt out=ditch_1205_edt_b1 type=area buffer=1
$ v.buffer ditch_1205_edt out=ditch_1205_edt_b4 type=area buffer=4

Now, why does this "touch" of v.digit help? The *only* difference between
ditch_1205 and the "edited" ditch_1205_edt according to v.out.ascii is where
the boundary no #4 is mentioned, see:

$ v.out.ascii ditch_1205 form=standard | awk 'NR>10'
B  4
 600727.68682251 5677973.32091602
 600739.16582305 5678137.49568095
 600736.32863997 5678140.4618269
 600730.63832718 5678056.67823368
B  2
 600730.63832718 5678056.67823368
 600725.02385533 5677974.01131491
C  1 1
 600730.04890192 5678035.56666655
 1     1205
B  2
 600727.68682251 5677973.32091602
 600725.02385533 5677974.01131491

compared to:

$ v.out.ascii ditch_1205_edt form=standard | awk 'NR>10'
B  2
 600730.63832718 5678056.67823368
 600725.02385533 5677974.01131491
C  1 1
 600730.04890192 5678035.56666655
 1     1205
B  2
 600727.68682251 5677973.32091602
 600725.02385533 5677974.01131491
B  4
 600727.68682251 5677973.32091602
 600739.16582305 5678137.49568095
 600736.32863997 5678140.4618269
 600730.63832718 5678056.67823368

Note there is no single difference between the 2 *besides* the order in which
boundaries are listed. Somehow, the ditch_1205 having boundary #4 listed as
first is wrong for v.buffer (on my machine), while the ditch_1205_edt, having
the same boundary listed as the last one, is OK.

Does this finding help?

Maciek

[0]http://kufaya.googlepages.com/v.bufferbug%232765

[1]http://kufaya.googlepages.com/ditch_1205.png

[2]http://kufaya.googlepages.com/ditch_1205_b1.png
[3]http://kufaya.googlepages.com/ditch_1205_b4.png
[4]http://kufaya.googlepages.com/ditch_1205_edt1.png
[5]http://kufaya.googlepages.com/ditch_1205_edt2.png
[6]http://kufaya.googlepages.com/ditch_1205_edt3.png
[7]http://kufaya.googlepages.com/ditch_1205_edt_b1.png
[8]http://kufaya.googlepages.com/ditch_1205_edt_b4.png


-------------------------------------------- Managed by Request Tracker




More information about the grass-dev mailing list