⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pickresult.java

📁 JAVA3D矩陈的相关类
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	int numint = 0;	int indexCount = geom.getIndexCount();	for (int i=0; i<indexCount;) {	    triVertIdx[0] = i;	    triCoordIdx[0] = geom.getCoordinateIndex(i++);	    triVertIdx[1] = i;	    triCoordIdx[1] = geom.getCoordinateIndex(i++);	    triVertIdx[2] = i;	    triCoordIdx[2] = geom.getCoordinateIndex(i++);	    if (intersectTri(triVertIdx, triCoordIdx, geomIndex, pnts, pi)) {		numint++;		if (firstpick) return true;	    }	} 	if (numint > 0) return true;	return false;    }    /**       Intersect method for TriangleStripArray       */    boolean intersectTSA (TriangleStripArray geom, int geomIndex, 			  Point3d[] pnts, boolean firstpick, PickIntersection pi) {	if (debug) 	    System.out.println ("intersect: TriangleStripArray");	boolean ccw;	int numint = 0;	int[] stripVertexCounts = new int [geom.getNumStrips()];	geom.getStripVertexCounts (stripVertexCounts);	int stripStart = 0;	int start;	int[] triVertIdx = new int[3];	for (int i=0; i<stripVertexCounts.length; i++) {  	    start = stripStart;	    // start a new strip	    ccw = true;	    triVertIdx[0] = start++;	    triVertIdx[1] = start++;	    int end = start + stripVertexCounts[i] - 2;	    for (int j=start; j< end; j++) {	 		/*		if (ccw) {		    triVertIdx[2] = j;   		} else {		    triVertIdx[1] = j;   		}		*/		triVertIdx[2] = j;		if (intersectTri(triVertIdx, triVertIdx, geomIndex, pnts, pi)) {		    numint++;		    if (firstpick) return true;		}		// Advance to the next triangle, keeping the winding of the test		// triangle correct.  		/*		if (ccw) {		    triVertIdx[0] = triVertIdx[1];		    // triVertIdx[2] remains, triVertIdx[1] will be replaced		    ccw = false;		} else {		    triVertIdx[0] = triVertIdx[2];		    // triVertIdx[1] remains, triVertIdx[2] will be replaced		    ccw = true;		}		*/		triVertIdx[0] = triVertIdx[1];		triVertIdx[1] = triVertIdx[2];	    }	    stripStart += stripVertexCounts[i];	}	if (numint > 0) return true;	return false;    }    /**       Intersect method for IndexedTriangleStripArray       */    boolean intersectITSA (IndexedTriangleStripArray geom, int geomIndex, 			   Point3d[] pnts, boolean firstpick, PickIntersection pi) {	if (debug) 	    System.out.println ("intersect: IndexedTriangleStripArray");	int numint = 0;	boolean ccw;	int[] stripVertexCounts = new int [geom.getNumStrips()];	geom.getStripIndexCounts (stripVertexCounts);	int stripStart = 0;	int start;	int[] triVertIdx = new int[3];	int[] triCoordIdx = new int[3];		for (int i=0; i<stripVertexCounts.length; i++) {  	    start = stripStart;	    // start a new strip	    ccw = true;	    triCoordIdx[0] = geom.getCoordinateIndex(start);	    triVertIdx[0] = start++;	    triCoordIdx[1] = geom.getCoordinateIndex(start);	    	    triVertIdx[1] = start++;	    	    int end = start + stripVertexCounts[i] - 2;	    for (int j=start; j<end; j++) {	 		if (ccw) {		    triVertIdx[2] = j;   		    triCoordIdx[2] = geom.getCoordinateIndex(j);		} else {		    triVertIdx[1] = j;   		    triCoordIdx[1] = geom.getCoordinateIndex(j);		}				if (intersectTri(triVertIdx, triCoordIdx, geomIndex, pnts, pi)) {		    numint++;		    if (firstpick) return true;		}		// Advance to the next triangle, keeping the winding of the test		// triangle correct.  		if (ccw) {		    triVertIdx[0] = triVertIdx[1];		    // triVertIdx[2] remains, triVertIdx[1] will be replaced		    triCoordIdx[0] = triCoordIdx[1];		    ccw = false; 		} else { 		    triVertIdx[0] = triVertIdx[2];		    // triVertIdx[1] remains, triVertIdx[2] will be replaced		    triCoordIdx[0] = triCoordIdx[2];		    ccw = true;		}	    }	    stripStart += stripVertexCounts[i];	}	if (numint > 0) return true;	return false;    }    /**       Intersect method for TriangleFanArray       */    boolean intersectTFA (TriangleFanArray geom, int geomIndex, Point3d[] pnts,			  boolean firstpick, PickIntersection pi) {	if (debug) System.out.println("intersect: TriangleFanArray");	int numint = 0;	int[] stripVertexCounts = new int [geom.getNumStrips()];	geom.getStripVertexCounts (stripVertexCounts);	int fanStart = 0;	int start;	int[] triVertIdx = new int[3];		// System.out.println("stripVertexCounts.length " + stripVertexCounts.length);	for (int i=0; i<stripVertexCounts.length; i++) {	    start = fanStart;	    triVertIdx[0] = start++;	    triVertIdx[1] = start++;	    	    int end = start + stripVertexCounts[i] - 2;	    for (int j=start; j<end; j++) {	 		triVertIdx[2] = j;		if (intersectTri(triVertIdx, triVertIdx, geomIndex, pnts, pi)) {		    numint++;		    if (firstpick) return true;		}		triVertIdx[1] = triVertIdx[2];	    }    	    fanStart += stripVertexCounts[i];	}	if (numint > 0) return true;	return false;    }    /**       Intersect method for IndexedTriangleFanArray       */    boolean intersectITFA (IndexedTriangleFanArray geom, int geomIndex, 			   Point3d[] pnts, boolean firstpick, PickIntersection pi) {	if (debug) System.out.println ("intersect: IndexedTriangleFanArray");	int numint = 0;	int[] stripVertexCounts = new int [geom.getNumStrips()];	geom.getStripIndexCounts (stripVertexCounts);	int fanStart = 0;	int start;	int[] triVertIdx = new int[3];	int[] triCoordIdx = new int[3];		for (int i=0; i<stripVertexCounts.length; i++) {	    start = fanStart;	    triCoordIdx[0] = geom.getCoordinateIndex(start);	    triVertIdx[0] = start++;	    triCoordIdx[1] = geom.getCoordinateIndex(start);	    triVertIdx[1] = start++;	    	    int end = start + stripVertexCounts[i] - 2;	    for (int j=start; j<end; j++) {	 		triVertIdx[2] = j;		triCoordIdx[2] = geom.getCoordinateIndex(j);		if (intersectTri(triVertIdx, triCoordIdx, geomIndex, pnts, pi)) {		    numint++;		    if (firstpick) return true;		}		triVertIdx[1] = triVertIdx[2];		triCoordIdx[1] = triCoordIdx[2];	    }    	    fanStart += stripVertexCounts[i];	}	if (numint > 0) return true;	return false;    }    /**       Intersect method for QuadArray       */    boolean intersectQA (QuadArray geom, int geomIndex, Point3d[] pnts,			 boolean firstpick, PickIntersection pi) {	if (debug) System.out.println ("intersect: QuadArray");	int[] quadVertIdx = new int[4];	int numint = 0;	for (int i=0; i<pnts.length;) {	    quadVertIdx[0] = i++;	    quadVertIdx[1] = i++;	    quadVertIdx[2] = i++;	    quadVertIdx[3] = i++;	    if (intersectQuad(quadVertIdx, quadVertIdx, geomIndex, pnts, pi)) {		numint++;		if (firstpick) return true;	    }	} 	if (numint > 0) return true;	return false;    }    /**       Intersect method for IndexedQuadArray       */    final boolean intersectIQA (IndexedQuadArray geom, int geomIndex, 				Point3d[] pnts, boolean firstpick,				PickIntersection pi) {	if (debug) System.out.println ("intersect: IndexedQuadArray");	int[] quadVertIdx = new int[4];	int[] quadCoordIdx = new int[4];	int numint = 0;	int indexCount = geom.getIndexCount();	// System.out.println ("intersect: IndexedQuadArray : indexCount " + indexCount);	for (int i=0; i<indexCount;) {	    quadVertIdx[0] = i;	    quadCoordIdx[0] = geom.getCoordinateIndex(i++);	    quadVertIdx[1] = i;	    quadCoordIdx[1] = geom.getCoordinateIndex(i++);	    quadVertIdx[2] = i;	    quadCoordIdx[2] = geom.getCoordinateIndex(i++);	    quadVertIdx[3] = i;	    quadCoordIdx[3] = geom.getCoordinateIndex(i++);	    if (intersectQuad(quadVertIdx, quadCoordIdx, geomIndex, pnts, pi)) {		numint++;		if (firstpick) return true;	    }	} 	if (numint > 0) return true;	return false;    }    /* ==================================================================== */    /*                      GENERAL INTERSECT METHODS                       */    /* ==================================================================== */    static boolean intersectBoundingBox (Point3d coordinates[], 					 BoundingBox box) {	int i, j;	int out[] = new int[6];      	Point3d lower = new Point3d();	Point3d upper = new Point3d();	box.getLower (lower);	box.getUpper (upper);       	//Do trivial vertex test.	for (i=0; i<6; i++) out[i] = 0;	for (i=0; i<coordinates.length; i++) {	    if ((coordinates[i].x >= lower.x) && 		(coordinates[i].x <= upper.x) &&		(coordinates[i].y >= lower.y) && 		(coordinates[i].y <= upper.y) &&		(coordinates[i].z >= lower.z) && 		(coordinates[i].z <= upper.z)) {		// We're done! It's inside the boundingbox.		return true;	  	    } else {		if (coordinates[i].x < lower.x) out[0]++; // left		if (coordinates[i].y < lower.y) out[1]++; // bottom		if (coordinates[i].z < lower.z) out[2]++; // back		if (coordinates[i].x > upper.x) out[3]++; // right		if (coordinates[i].y > upper.y) out[4]++; // top		if (coordinates[i].z > upper.z) out[5]++; // front	  	    }	}      	if ((out[0] == coordinates.length) || (out[1] == coordinates.length) ||	    (out[2] == coordinates.length) || (out[3] == coordinates.length) ||	    (out[4] == coordinates.length) || (out[5] == coordinates.length)){	    // we're done. primitive is outside of boundingbox.	    return false;	}      	// Setup bounding planes.	Point3d pCoor[] = new Point3d[4];	for (i=0; i<4; i++) pCoor[i] = new Point3d();      	// left plane.	pCoor[0].set(lower.x, lower.y, lower.z);	pCoor[1].set(lower.x, lower.y, upper.z);	pCoor[2].set(lower.x, upper.y, upper.z);	pCoor[3].set(lower.x, upper.y, lower.z);	if (intersectPolygon(pCoor, coordinates, false) == true) return true;	// right plane.	pCoor[0].set(upper.x, lower.y, lower.z);	pCoor[1].set(upper.x, upper.y, lower.z);	pCoor[2].set(upper.x, upper.y, upper.z);	pCoor[3].set(upper.x, lower.y, upper.z);	if (intersectPolygon(pCoor, coordinates, false) == true) return true;	// bottom plane.	pCoor[0].set(upper.x, lower.y, upper.z);	pCoor[1].set(lower.x, lower.y, upper.z);	pCoor[2].set(lower.x, lower.y, lower.z);	pCoor[3].set(upper.x, lower.y, lower.z);	if (intersectPolygon(pCoor, coordinates, false) == true) return true;	// top plane.	pCoor[0].set(upper.x, upper.y, upper.z);	pCoor[1].set(upper.x, upper.y, lower.z);	pCoor[2].set(lower.x, upper.y, lower.z);	pCoor[3].set(lower.x, upper.y, upper.z);	if (intersectPolygon(pCoor, coordinates, false) == true) return true;	// front plane.	pCoor[0].set(upper.x, upper.y, upper.z);	pCoor[1].set(lower.x, upper.y, upper.z);	pCoor[2].set(lower.x, lower.y, upper.z);	pCoor[3].set(upper.x, lower.y, upper.z);	if (intersectPolygon(pCoor, coordinates, false) == true) return true;      	// back plane.	pCoor[0].set(upper.x, upper.y, lower.z);	pCoor[1].set(upper.x, lower.y, lower.z);	pCoor[2].set(lower.x, lower.y, lower.z);	pCoor[3].set(lower.x, upper.y, lower.z);	if (intersectPolygon(pCoor, coordinates, false) == true) return true;	return false;    }    static boolean intersectBoundingSphere (Point3d coordinates[], 					    BoundingSphere sphere) {	int i, j;	Vector3d tempV3D = new Vector3d();	boolean esFlag;	Point3d center = new Point3d();	sphere.getCenter (center);	double radius = sphere.getRadius ();	//Do trivial vertex test.	for (i=0; i<coordinates.length; i++) {	    tempV3D.x = coordinates[i].x - center.x;	    tempV3D.y = coordinates[i].y - center.y;	    tempV3D.z = coordinates[i].z - center.z;		    if (tempV3D.length() <= radius) {		// We're done! It's inside the boundingSphere.		return true;	    }	}	for (i=0; i<coordinates.length; i++) {	    if (i < (coordinates.length-1)) {		esFlag = edgeIntersectSphere(sphere, coordinates[i], 					     coordinates[i+1]);	    } else {		esFlag = edgeIntersectSphere(sphere, coordinates[i], 					     coordinates[0]);	    }	    if (esFlag == true) {		return true;	    }	}	if (coordinates.length < 3) return false; // We're done with line.	// Find rho.	// Compute plane normal.	Vector3d vec0 = new Vector3d(); //Edge vector from point 0 to point 1;	Vector3d vec1 = new Vector3d(); //Edge vector from point 0 to point 2 or 3;	Vector3d pNrm = new Vector3d();	Vector3d pa = new Vector3d();	Point3d q = new Point3d();	double nLenSq, pqLen, pNrmDotPa, tq;	// compute plane normal for coordinates.	for (i=0; i<coordinates.length-1;) {	    vec0.x = coordinates[i+1].x - coordinates[i].x;	    vec0.y = coordinates[i+1].y - coordinates[i].y;	    vec0.z = coordinates[i+1].z - coordinates[i++].z;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -