/* jCAE stand for Java Computer Aided Engineering. Features are : Small CAD
modeler, Finite element mesher, Plugin architecture.
Copyright (C) 2009, by EADS France
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
package org.jcae.mesh.amibe.projection;
import org.jcae.mesh.amibe.algos3d.SphereBuilder;
import org.jcae.mesh.amibe.ds.AbstractHalfEdge;
import org.jcae.mesh.amibe.ds.Mesh;
import org.jcae.mesh.amibe.ds.Triangle;
import org.jcae.mesh.amibe.ds.Vertex;
import org.jcae.mesh.amibe.traits.MeshTraitsBuilder;
import org.junit.Test;
import static org.junit.Assert.*;
public class MeshLiaisonTest
{
private Mesh mesh;
private Vertex [] v;
private Triangle [] T;
// m Vertex on rows, n Vertex on columns
private void createMxNShell(int m, int n)
{
v = new Vertex[m*n];
for (int j = 0; j < n; j++)
for (int i = 0; i < m; i++)
v[m*j+i] = mesh.createVertex(i, j, 0.0);
T = createMxNTriangles(m, n, v);
}
private Triangle [] createMxNTriangles(int m, int n, Vertex [] vv)
{
/* v3 v4 v5
* +---------+---------+
* | \ | \ |
* | \ T1 | \ T3 |
* | \ | \ |
* | T0 \ | T2 \ |
* +---------+---------+
* v0 v1 v2
* or
* v3 v4 v5
* +---------+---------+
* | / | / |
* | T0 / | T2 / |
* | / | / |
* | / T1 | / T3 |
* +---------+---------+
* v0 v1 v2
*/
Triangle [] tt = new Triangle[2*(m-1)*(n-1)];
for (int j = 0; j < n-1; j++)
{
if (j%2 == 0)
{
for (int i = 0; i < m-1; i++)
{
tt[2*(m-1)*j+2*i] = mesh.createTriangle(vv[m*j+i], vv[m*j+i+1], vv[m*(j+1)+i]);
tt[2*(m-1)*j+2*i+1] = mesh.createTriangle(vv[m*j+i+1], vv[m*(j+1)+i+1], vv[m*(j+1)+i]);
vv[m*j+i].setLink(tt[2*(m-1)*j+2*i]);
}
vv[m*j+m-1].setLink(tt[2*(m-1)*j+2*m-3]);
}
else
{
for (int i = 0; i < m-1; i++)
{
tt[2*(m-1)*j+2*i] = mesh.createTriangle(vv[m*j+i], vv[m*(j+1)+i+1], vv[m*(j+1)+i]);
tt[2*(m-1)*j+2*i+1] = mesh.createTriangle(vv[m*j+i+1], vv[m*(j+1)+i+1], vv[m*j+i]);
vv[m*j+i].setLink(tt[2*(m-1)*j+2*i]);
}
vv[m*j+m-1].setLink(tt[2*(m-1)*j+2*m-3]);
}
}
// Last row
for (int i = 0; i < m-1; i++)
vv[m*(n-1)+i].setLink(tt[2*(m-1)*(n-2)+2*i]);
vv[m*n-1].setLink(tt[2*(m-1)*(n-1)-1]);
for (Triangle t: tt)
mesh.add(t);
return tt;
}
@Test public void finderOnPlane()
{
mesh = new Mesh();
createMxNShell(3, 3);
mesh.buildAdjacency();
assertTrue("Wrong number of triangles after buildAdjacency: "+mesh.getTriangles().size(), 16 == mesh.getTriangles().size());
MeshLiaison liaison = MeshLiaison.create(mesh);
Mesh newMesh = liaison.getMesh();
Vertex vTest = newMesh.createVertex(2.1, 1.8, 0.1);
AbstractHalfEdge ref = liaison.findSurroundingTriangle(vTest, v[0], -1.0, true);
assertTrue("findSurroundingTriangle failed", ref != null);
AbstractHalfEdge ot = liaison.findSurroundingTriangle(vTest, v[0], 0.2, true);
assertTrue("findSurroundingTriangle failed", ot != null);
assertTrue("findSurroundingTriangle failed", ref == ot);
}
@Test public void finderOnSphere()
{
mesh = SphereBuilder.createShuffledSphereMesh(3);
assertTrue("Mesh is not valid", mesh.isValid());
MeshLiaison liaison = MeshLiaison.create(mesh, MeshTraitsBuilder.getDefault3D().addNodeList());
Mesh newMesh = liaison.getMesh();
// Find poles
Vertex northPole = null;
Vertex vPos = newMesh.createVertex(0, 0, 1);
double dmin = Double.MAX_VALUE;
for (Vertex vP : newMesh.getNodes())
{
double d = vPos.sqrDistance3D(vP);
if (d < dmin)
{
northPole = vP;
dmin = d;
}
}
// Start from South Pole
Vertex vTest = newMesh.createVertex(0, 0, -1);
AbstractHalfEdge ref = liaison.findSurroundingTriangle(northPole, vTest, -1.0, false);
assertTrue("findSurroundingTriangle failed", ref != null);
AbstractHalfEdge ot = liaison.findSurroundingTriangle(northPole, vTest, 0.2, false);
assertTrue("findSurroundingTriangle failed", ot != null);
assertTrue("findSurroundingTriangle failed", ref == ot);
Triangle tRes = ot.getTri();
assertTrue("North Pole not found", tRes.getV0() == northPole || tRes.getV1() == northPole || tRes.getV2() == northPole);
}
}