return true;
}
private boolean testPolygon(N3Polygon poly) {
// Punto en el interior del poligono proyectado.
N3Point2D inside;
// Obtenemos el plano del poligono representado de la forma Ax + By +Cz
// +D = 0
N3Vector3D polyNormal = poly.getPolygonNormal();
N3Point3D v = (N3Point3D) poly.getVertex(0);
float polyD = -(polyNormal.x * v.x + polyNormal.y * v.y + polyNormal.z
* v.z);
// Primero comprobamos si hay intersecci�n entre el rayo y el plano
// Substituimos (x,y,z)=(px,py,pz) + t(dx,dy,dz) en la ecuacion del
// plano.
// despejamos t = -(Apx + Bpy + Cpz + D)/(Adx + Bdy + Cdz)
float s = (polyNormal.x * d.x + polyNormal.y * d.y + polyNormal.z * d.z);
if (s == 0)
return false;
float t = -(polyNormal.x * src.x + polyNormal.y * src.y + polyNormal.z
* src.z + polyD)
/ s;
if (t <= 0)
return false;
// Ahora hay que comprobar si el punto de corte del rayo con el plano,
// esta dentro del poligono.
// Obtenemos el punto de corte con el plano.
N3Point3D p3D = new N3Point3D(src.x + t * d.x, src.y + t * d.y, src.z
+ t * d.z);
// Utilizamos el metodo de los half-spaces proyectando el pol�gono y el
// punto ortograficamente en 2D,
// seleccionando como plano de proyecci�n aquel en el que el pol�gono
// tenga un mayor �rea.
// El �rea es proporcional al las componentes A,B,C del vector normal
// del pol�gono.
N3Point2D p2D;
// Indica en que plano hemos proyectado. 0 = yz, 1 = zx, 2 = xy.
int plane;
if (Math.abs(polyNormal.x) > Math.abs(polyNormal.y)
&& Math.abs(polyNormal.x) > Math.abs(polyNormal.z)) {
// Si es |A| proyectamos en el plano yz.
p2D = new N3Point2D(p3D.y, p3D.z);
plane = 0;
} else if (Math.abs(polyNormal.y) > Math.abs(polyNormal.x)
&& Math.abs(polyNormal.y) > Math.abs(polyNormal.z)) {
// Si es |B| proyectamos en el plano zx.
p2D = new N3Point2D(p3D.z, p3D.x);
plane = 1;
} else {
// Si es |C| proyectamos en el plano xy.
p2D = new N3Point2D(p3D.x, p3D.y);
plane = 2;
}
// Para cada arista del poligono calculamos la ecuaci�n e(u,v)= au + bv
// + c = 0 que representa un divisi�n del espacio en 2
// partes, "half-space", el pol�gono queda definido por la intersecci�n
// de todos ellos.
// Para un poligono definido en sentido antihorario un punto esta dentro
// de el si para todos las aristas
// e < 0.
for (int i = 0; i < poly.getSides(); i++) {
// Proyectamos los puntos de la arista actual.
N3Point3D v13D = (N3Point3D) poly.getVertex(i);
N3Point3D v23D;
N3Point2D v1, v2;
if (i == poly.getSides() - 1)
v23D = (N3Point3D) poly.getVertex(0);
else
v23D = (N3Point3D) poly.getVertex(i + 1);
if (plane == 0) {
v1 = new N3Point2D(v13D.y, v13D.z);
v2 = new N3Point2D(v23D.y, v23D.z);
inside = new N3Point2D(
(((N3Point3D) poly.getVertex(0)).y
+ ((N3Point3D) poly.getVertex(1)).y + ((N3Point3D) poly
.getVertex(2)).y) / 3.0f,
(((N3Point3D) poly.getVertex(0)).z
+ ((N3Point3D) poly.getVertex(1)).z + ((N3Point3D) poly
.getVertex(2)).z) / 3.0f);
} else if (plane == 1) {
v1 = new N3Point2D(v13D.z, v13D.x);
v2 = new N3Point2D(v23D.z, v23D.x);
inside = new N3Point2D(
(((N3Point3D) poly.getVertex(0)).z
+ ((N3Point3D) poly.getVertex(1)).z + ((N3Point3D) poly
.getVertex(2)).z) / 3.0f,
(((N3Point3D) poly.getVertex(0)).x
+ ((N3Point3D) poly.getVertex(1)).x + ((N3Point3D) poly
.getVertex(2)).x) / 3.0f);
} else {
v1 = new N3Point2D(v13D.x, v13D.y);
v2 = new N3Point2D(v23D.x, v23D.y);
inside = new N3Point2D(
(((N3Point3D) poly.getVertex(0)).x
+ ((N3Point3D) poly.getVertex(1)).x + ((N3Point3D) poly
.getVertex(2)).x) / 3.0f,
(((N3Point3D) poly.getVertex(0)).y
+ ((N3Point3D) poly.getVertex(1)).y + ((N3Point3D) poly