Thanks a lot to all for enlightening me!

> DATA=: ".;._2]0 :0  0 0 1 1 1 1 2 2 2 2 2 4 4 4 5 5  5 0 7 8 9 2 2 5 5 5 3 8 
> 0 0 5 6)
> 
>    6 (</./@] #inv~ i.@[ e. {.@] ) DATA
>    6 {. (</./ #inv~ (e.~ i.@(1 + >./))@{. ) DATA
> I could not choose between these options without better understanding
> your application.

Well, my application ... continue reading at your own risk.

I have (say) a million points (x,y,z) and I use software that makes a Delaunay 
triangulation (http://www.cs.cmu.edu/~quake/triangle.html): approximately two 
million triangles. Each triangle consists of three point numbers. Although my 
points are 3D, the triangulation is 2D and z is merely an attribute (it is 
terrain height, but it could also be temperature). 

With each point I want to do "something" , which also depends on the point's 
neighbours: those points that are together with the considered point in a 
triangle.  This is going to happen very often (different things that I want to 
do), and therefore I wondered whether it makes sense to find each point's set 
of neighbours only once and store that. Since the number of neighbours is not 
the same for each point (on average it is six), I was thinking of a boxed list. 
Occasionally  an (x,y) occurs twice in the input data. Then only one of these 
points is used in the triangulation and for the other I get an empty slot in my 
list. 

Suppose $tri = 3 1000000.  I start off by making a 3x3000000 matrix
    
   tri,.(1|.tri),.2|.tri

I sort it from left to right according to the top row and then something like 
</. comes in. After that it gets again a bit complicated since I want the 
neighbours to be ordered (counter-clockwise). Fortunately all input triangles 
have the same orientation.

One of the things I want to do is check how well a point and its neighbours fit 
in a 3D plane. If they fit very well, I might remove the point and 
re-triangulate locally, and do this smart & recursively. Depending on the 
scene, most of the data might get removed without losing much information. I 
wonder how this will look in J :-) 

Another envisaged use for storing the neighbours with each point is answering 
the question: which triangle contains a given (x,y). Normally this requires 
visiting half of the triangles on average (one million), or using a spatial 
index. Now it will be possible to start at an arbitrary location, step through 
a sequence of adjacent triangles in the right direction, and arrive after one 
thousand steps or so.

If anybody read till here and thinks this is interesting:  suggestions will be 
highly appreciated!
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to