Stefan Steiniger a écrit :
> Can I actually ask how Michael derived the algorithmic complexity 
> empirical? - because if I ever see these things, for instance by M van 
> Kreveld or in some optimiziation books (e.g. Z Michalewicz and DB Fogel 
> 2000)- I don't get how this is really done (and proven - but maybe I 
> just need to read those books in detail).
>   
Hi Stefan. If you knew how empirical my method was, maybe you would'nt 
ask...
The only basics I know are :
O(n^p) better than O(n^q) if p<q
and O(n*log(n)) better than O(n*n^p) if p>0 and n large enough (don't 
ask me to prove...)
I  had 2 series of  5 numbers, one for each algo .
I supposed mine was O(n*log(n)) and tried to find a constant x so that 
n*log(n)*x give the results I observed in seconds, what I could achieved 
whith small errors
For Martin's algo, I observed that for any x, the progession of 
computation times was faster than  n*log(n)*x
so I started to try with n*n^p and found that n*n^0.5 gave results quite 
closed to the observations. In fact, that was my first try ;-).
As you see, I just "tried to touch", no much mathematic...
If I had to find something more complex or with more observations, I 
think I would have tried to use Office or OpenOffice's solver, which, I 
think, can resolve this kind of problem quite well.
Serious work would probably imply to find the complexity out of the 
algorithm, but I suppose this may be a very difficult exercise.
The only tool I'm aware of and which could help is jGRASP. Here is a 
paper about how this soft can help analyze code complexity : 
http://www.stsc.hill.af.mil/crosstalk/1997/12/visualization.asp

Michaël

> thank you guys - if you talk, I always can learn some things
> stefan
>
> Martin Davis schrieb:
>   
>> Right, I see the sorting step now.  Out of curiosity, did you check to 
>> see if it was any faster using an array and Collections.sort, rather 
>> than a TreeSet?  I would have thought building a tree was slower than 
>> doing a single sort of an array, followed by removing duplicates by 
>> traversing the array (perhaps by copying only unique points).
>>
>> Interesting algorithm - that would be great to see a reference for this.
>>
>> So this isn't incremental insertion - the classic incremental insertion 
>> adds points randomly, locating their containing triangle, dividing it 
>> into 3 new triangles, and then restoring the Delaunay property by edge 
>> flipping.  The location step is the potentially slow part.  This sounds 
>> similar to the step you use for adding constraints.
>>
>> If you're adding Steiner points along constraint segments, then you have 
>> a Conformal Delaunay. A Constrained Delaunay contains the constraint 
>> edges exactly in the triangulation (and hence is not fully Delaunay).  
>> Shewchuck has a nice explanation:  
>> http://www.cs.cmu.edu/%7Equake/triangle.defs.html#conform
>>
>> Martin
>>
>> Michaël Michaud wrote:
>>     
>>> Hi
>>>   
>>>       
>>>> I should have looked before I wrote - I just found the link you sent a 
>>>> while ago to your code (for others benefit - 
>>>> http://geo.michaelm.free.fr/OpenJUMP/resources/ ).
>>>>
>>>> So you are using Incremental insertion, with a Triangle- based data 
>>>> structure.  It looks like your code handles Constrained Delaunay - or is 
>>>> it Conformal Delaunay?  I'll have to look a bit more to see.
>>>>   
>>>>     
>>>>         
>>> I'm not sure what incremental insertion is.
>>> In my implementation, I sort points before starting the triangulation 
>>> (sorting points is included in my benchmark).
>>> I think this makes a lot of optimisation possible (just have to walk 
>>> through the convex hull using triangle adjacency)
>>> There is also an "incremental" part used for constrained Delaunay 
>>> triangulation as constraints are added to the
>>> triangulation afterwards (I have no benchmark for this part yet, but it 
>>> should be much slower).
>>> While adding constraints, Delaunay property is kept by adding points 
>>> along segments (steiner points ?).
>>> Constrained triangulation is probably even slower due to new points 
>>> insertion.
>>> If you try it, you must use 3d coordinates.
>>>   
>>>       
>>>> Anyway, very impressive timings.  I'm curious to know where the speed 
>>>> different lies.  It could be the point location search, or the data 
>>>> structure manipulation, or perhaps both?
>>>>   
>>>>     
>>>>         
>>> I can try to find back a more precise description of the implementation.
>>>
>>> Michaël
>>>   
>>>       
>>>> Martin Davis wrote:
>>>>   
>>>>     
>>>>         
>>>>> Interesting comparison, Michael.  Is your code online somewhere?  What 
>>>>> algorithm does it use, and what data structure for the triangulation?
>>>>>
>>>>> In the JTS API you don't have to create the triangles as a MultiPolygon 
>>>>> - that's just provided as a simple option for viewing them in the JTS 
>>>>> TestBuilder.  In OJ I certainly wouldn't do that - I would split them 
>>>>> into one Feature per triangle.
>>>>>
>>>>> I figured that the JTS code was about O(n*sqrt(n)) as well - although 
>>>>> the theoretical performance of incremental insertion is actually 
>>>>> O(n^2)!  But I think this is rarely seen in practice.
>>>>>
>>>>> Martin
>>>>>
>>>>> Michaël Michaud wrote:
>>>>>   
>>>>>     
>>>>>       
>>>>>           
>>>>>> Hi Martin,
>>>>>>
>>>>>> Today, I compared the new JTS triangulation api with the triangulation 
>>>>>> plugin I wrote some years ago.
>>>>>> In my tests, I just compared speed for triangulation of a random set 
>>>>>> of points (no constraint, no real data).
>>>>>> Measures include initialization, triangulation, and feature(s) creation.
>>>>>>
>>>>>> Both libraries worked well. I did not check result correctness.
>>>>>> Processing time was faster with my code (and ratio between two 
>>>>>> consecutive figures are always better).
>>>>>> Of course, triangulation speed is only one thing and may not be the 
>>>>>> most important. Just want to show that there is still room for 
>>>>>> improvement.
>>>>>>  
>>>>>> In OpenJUMP, memory usage was better with JTS api than with my plugin 
>>>>>> (1560Mb vs 2033Mb).
>>>>>> I suppose this is partly due to the number of features created (about 
>>>>>> 1M features in my case, only one feature in your case).
>>>>>> On the other hand, as I told you  before, playing with a MultiPolygon 
>>>>>> composed of 1M triangles is not easy.
>>>>>> In OJ, with a MultiPolygon of 1M triangles, the user interface do not 
>>>>>> respond anymore and I could not explode the MultiPolygon (if I had to 
>>>>>> implement a plugin, I would probably make it possible to explode it 
>>>>>> before it is displayed).
>>>>>>
>>>>>> I did not look at your implementation, but I tried to find its 
>>>>>> complexity in an empiric way. I found that your algo has about a 
>>>>>> n*sqrt(n) complexity, but this deduction may be due to measurement 
>>>>>> errors :
>>>>>> MM : n*log(n)*2.4E-6
>>>>>> MD : n*sqrt(n)*0.1E-6
>>>>>>
>>>>>> Even if it is not yet the fastest, I have no doubt JTS triangulation 
>>>>>> api will soon be a reference in the java world.
>>>>>> Thank you to share your excellent work.
>>>>>>
>>>>>> Michaël
>>>>>>
>>>>>> Figures (times in sec for sets from 50 000 to 1 000 000 points)
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>  
>>>>>>
>>>>>>
>>>>>> Michaël Michaud a écrit :
>>>>>>     
>>>>>>       
>>>>>>         
>>>>>>             
>>>>>>> Hi Martin,
>>>>>>>
>>>>>>> You may already know the benchmark done by Erwan's team with some 
>>>>>>> java implementations 
>>>>>>> (http://conference.osgeo.org/index.php/foss4g/2008/paper/view/282/177)
>>>>>>> It eventually shows the triangulator I have written a few years ago 
>>>>>>> (available on http://geo.michaelm.free.fr/OpenJUMP/resources/) is 
>>>>>>> very fast (I have to add it is not 100% robust as it sometimes fails 
>>>>>>> for large datasets  - more than 100k points)
>>>>>>> They also wrote a more recent paper about their new implementation 
>>>>>>> for orbisgis : 
>>>>>>> http://hal.archives-ouvertes.fr/docs/00/32/95/03/PDF/CDT-paper.pdf
>>>>>>>
>>>>>>> Now about your question :
>>>>>>>
>>>>>>> INPUT
>>>>>>> - should be able to input ponctual (sites) , lineal (breaklines), 
>>>>>>> polygonal geometries (points and breaklines to be extracted)
>>>>>>> - collection of coordinates
>>>>>>>
>>>>>>> INPUT/OUTPUT
>>>>>>> - in my plugin, I decided that when the input was a single polygon, 
>>>>>>> the output should be a triangulation containing only triangles inside 
>>>>>>> the polygon (not all triangles inside the convex hull)
>>>>>>> (may not concern the low level api)
>>>>>>>
>>>>>>> OUTPUT
>>>>>>> - in my Triangulation class, I decided to return a simple 
>>>>>>> Coordinate[] array containing n*3 objects (elements 0, 1 and 2 
>>>>>>> composing the first triangle...)
>>>>>>>  I'm not that sure, but I think this structure just contained 
>>>>>>> references to input coordinates (memory-friendly)
>>>>>>> - i would prefer a collection of Linestrings or a collection of 
>>>>>>> Polygons than a MultiLinestring or MultiPolygon, because I'm not sure 
>>>>>>> a mutigeometry of one million elements is easy to deal with (spatial 
>>>>>>> indexation inefficient for example). Moreover, individual geometries 
>>>>>>> can give the oppurtunity to keep the tin structure with links between 
>>>>>>> elements represented as attributes, or to compute height, slope, 
>>>>>>> orientation on every individual triangle and keep them as attributes. 
>>>>>>> I understand why a Tin structure is interesting (no duplicate), but 
>>>>>>> not a multi-geometry.
>>>>>>>
>>>>>>> My 2 cents
>>>>>>>
>>>>>>> Michaël
>>>>>>>
>>>>>>>
>>>>>>> Martin Davis a écrit :
>>>>>>>       
>>>>>>>         
>>>>>>>           
>>>>>>>               
>>>>>>>> To those that are interested in the upcoming JTS triangulation API, 
>>>>>>>> a question:
>>>>>>>>
>>>>>>>> What type of input and output structures would you find useful?
>>>>>>>>
>>>>>>>> Currently I'm developing the following:
>>>>>>>>
>>>>>>>> INPUT:
>>>>>>>> - Geometry (from which the site/vertex coordinates are extracted)
>>>>>>>> - Collection of Coordinates
>>>>>>>>
>>>>>>>> OUTPUT:
>>>>>>>> - MultiLineString containing triangulation edges
>>>>>>>> - GeometryCollection of Polygons containing triangles
>>>>>>>>
>>>>>>>> You can also work directly with the internal datastructures of the 
>>>>>>>> triangulation (Vertices, QuadEdges, etc), but this requires a higher 
>>>>>>>> level of understanding.
>>>>>>>>
>>>>>>>> Is there any other option I haven't though of?
>>>>>>>>
>>>>>>>>   
>>>>>>>>                 
>
> ------------------------------------------------------------------------------
> Crystal Reports - New Free Runtime and 30 Day Trial
> Check out the new simplified licensing option that enables 
> unlimited royalty-free distribution of the report engine 
> for externally facing server and web deployment. 
> http://p.sf.net/sfu/businessobjects
> _______________________________________________
> Jump-pilot-devel mailing list
> Jump-pilot-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
>
>
>   


------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables 
unlimited royalty-free distribution of the report engine 
for externally facing server and web deployment. 
http://p.sf.net/sfu/businessobjects
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to