/* * Open Source Physics software is free software as described near the bottom of this code file. * * For additional information and documentation on Open Source Physics please see: * <http://www.opensourcephysics.org/> */ package org.opensourcephysics.display3d.simple3d.utils; public class TetrahedronUtils extends ShapeUtils { //Static varibles for tetrahedron private static final double SQRT3 = Math.sqrt(3.0); private static final double HEIGHT = Math.sqrt(6.0)/3.0f; private static final double XCENTER = SQRT3/6.0f; private static final double ZCENTER = HEIGHT/3.0f; //Tetrahedron static public double[][][] createStandardTetrahedron(boolean top, boolean bottom, double height) { int totalN = 4; //number of tiles int pointsN = 4; //number of points if(!Double.isNaN(height)) { pointsN += 2; if(top&&bottom) { totalN = 5; } else if(!top&&bottom) { totalN = 4; } else if(!top&&!bottom) { totalN = 3; } else { totalN = 4; } } if(!bottom&&Double.isNaN(height)) { totalN = 3; } double[][][] data = new double[totalN][4][3]; double[][] points = new double[pointsN][3]; //Base points points[0][0] = XCENTER; points[0][1] = 0.5f; points[0][2] = -ZCENTER; //p1 points[1][0] = XCENTER; points[1][1] = -0.5f; points[1][2] = -ZCENTER; //p2 points[2][0] = -XCENTER*2.0f; points[2][1] = 0.0f; points[2][2] = -ZCENTER; //p3 if(Double.isNaN(height)) { points[3][0] = 0.0f; points[3][1] = 0.0f; points[3][2] = HEIGHT-ZCENTER; //p4 if(bottom) { int[] serie = {0, 1, 3, 3, 0, 3, 2, 2, 1, 2, 3, 3, 0, 2, 1, 1}; /*p1, p2, p4, p4 // front face p1, p4, p3, p3 // left, back face p2, p3, p4, p4 // right, back face p1, p3, p2, p2 // bottom face*/ for(int i = 0; i<totalN; i++) { for(int j = 0; j<3; j++) { data[i][0][j] = points[serie[i*4]][j]; data[i][1][j] = points[serie[i*4+1]][j]; data[i][2][j] = points[serie[i*4+2]][j]; data[i][3][j] = points[serie[i*4+3]][j]; } } } else { int[] serie = {0, 1, 3, 3, 0, 3, 2, 2, 1, 2, 3, 3}; /*p1, p2, p4, p4 // front face p1, p4, p3, p3 // left, back face p2, p3, p4, p4 // right, back face*/ for(int i = 0; i<totalN; i++) { for(int j = 0; j<3; j++) { data[i][0][j] = points[serie[i*4]][j]; data[i][1][j] = points[serie[i*4+1]][j]; data[i][2][j] = points[serie[i*4+2]][j]; data[i][3][j] = points[serie[i*4+3]][j]; } } } } if(!Double.isNaN(height)) { points[3][0] = XCENTER*(1-height); points[3][1] = 0.5f-0.5f*height; points[3][2] = HEIGHT*height-ZCENTER; //p4 points[4][0] = XCENTER*(1-height); points[4][1] = -0.5f+0.5f*height; points[4][2] = HEIGHT*height-ZCENTER; //p5 points[5][0] = -XCENTER*2.0f*(1-height); points[5][1] = 0.0f; points[5][2] = HEIGHT*height-ZCENTER; //p6 if(top&&bottom) { int[] serie = {0, 3, 4, 1, 2, 5, 3, 0, 1, 4, 5, 2, 0, 1, 2, 2, 3, 5, 4, 4}; /*p1, p4, p5, p2, // front face p3, p6, p4, p1, // left face p2, p5, p6, p3, // right face p1, p2, p3, p3, // bottom face p4, p6, p5, p5, // top face*/ for(int i = 0; i<totalN; i++) { for(int j = 0; j<3; j++) { data[i][0][j] = points[serie[i*4]][j]; data[i][1][j] = points[serie[i*4+1]][j]; data[i][2][j] = points[serie[i*4+2]][j]; data[i][3][j] = points[serie[i*4+3]][j]; } } } if(!top&&bottom) { int[] serie = {0, 3, 4, 1, 2, 5, 3, 0, 1, 4, 5, 2, 0, 1, 2, 2}; /*p1, p4, p5, p2, // front face p3, p6, p4, p1, // left face p2, p5, p6, p3, // right face p1, p2, p3, p3, // bottom face*/ for(int i = 0; i<totalN; i++) { for(int j = 0; j<3; j++) { data[i][0][j] = points[serie[i*4]][j]; data[i][1][j] = points[serie[i*4+1]][j]; data[i][2][j] = points[serie[i*4+2]][j]; data[i][3][j] = points[serie[i*4+3]][j]; } } } if(!top&&!bottom) { int[] serie = {0, 3, 4, 1, 2, 5, 3, 0, 1, 4, 5, 2}; /*p1, p4, p5, p2, // front face p3, p6, p4, p1, // left face p2, p5, p6, p3, // right face*/ for(int i = 0; i<totalN; i++) { for(int j = 0; j<3; j++) { data[i][0][j] = points[serie[i*4]][j]; data[i][1][j] = points[serie[i*4+1]][j]; data[i][2][j] = points[serie[i*4+2]][j]; data[i][3][j] = points[serie[i*4+3]][j]; } } } if(top&&!bottom) { int[] serie = {0, 3, 4, 1, 2, 5, 3, 0, 1, 4, 5, 2, 3, 5, 4, 4}; /*p1, p4, p5, p2, // front face p3, p6, p4, p1, // left face p2, p5, p6, p3, // right face p4, p6, p5, p5, // top face*/ for(int i = 0; i<totalN; i++) { for(int j = 0; j<3; j++) { data[i][0][j] = points[serie[i*4]][j]; data[i][1][j] = points[serie[i*4+1]][j]; data[i][2][j] = points[serie[i*4+2]][j]; data[i][3][j] = points[serie[i*4+3]][j]; } } } } return data; } } /* * Open Source Physics software is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public License (GPL) as * published by the Free Software Foundation; either version 2 of the License, * or(at your option) any later version. * Code that uses any portion of the code in the org.opensourcephysics package * or any subpackage (subdirectory) of this package must must also be be released * under the GNU GPL license. * * This software 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA * or view the license online at http://www.gnu.org/copyleft/gpl.html * * Copyright (c) 2007 The Open Source Physics project * http://www.opensourcephysics.org */