diff options
Diffstat (limited to 'logo/src/xlogo/kernel/perspective/ElementLine.java')
-rw-r--r-- | logo/src/xlogo/kernel/perspective/ElementLine.java | 206 |
1 files changed, 103 insertions, 103 deletions
diff --git a/logo/src/xlogo/kernel/perspective/ElementLine.java b/logo/src/xlogo/kernel/perspective/ElementLine.java index 6a80557..09a0108 100644 --- a/logo/src/xlogo/kernel/perspective/ElementLine.java +++ b/logo/src/xlogo/kernel/perspective/ElementLine.java @@ -1,29 +1,29 @@ /* XLogo4Schools - A Logo Interpreter specialized for use in schools, based on XLogo by Loic Le Coq * Copyright (C) 2013 Marko Zivkovic - * + * * Contact Information: marko88zivkovic at gmail dot com - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. This program 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 program; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. This program 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 program; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. - * - * + * + * * This Java source code belongs to XLogo4Schools, written by Marko Zivkovic * during his Bachelor thesis at the computer science department of ETH Zurich, * in the year 2013 and/or during future work. - * + * * It is a reengineered version of XLogo written by Loic Le Coq, published * under the GPL License at http://xlogo.tuxfamily.org/ - * + * * Contents of this file were initially written by Loic Le Coq, - * modifications, extensions, refactorings might have been applied by Marko Zivkovic + * modifications, extensions, refactorings might have been applied by Marko Zivkovic */ package xlogo.kernel.perspective; @@ -50,7 +50,7 @@ import javax.vecmath.Vector3d; import xlogo.kernel.LogoError; /** - * + * * @author Marko Zivkovic - I decoupled this from Application * */ @@ -58,20 +58,20 @@ public class ElementLine extends Element3D { /** * This float stores the line Width for each 3D line - * + * * @uml.property name="lineWidth" */ - private float lineWidth; - - public ElementLine(Viewer3D v3d, float lineWidth) + private final float lineWidth; + + public ElementLine(final Viewer3D v3d, final float lineWidth) { super(v3d); this.lineWidth = lineWidth; //app.getKernel().getActiveTurtle().getPenWidth(); } - + public void addToScene() throws LogoError { - int size = vertex.size(); + final int size = vertex.size(); if (size > 1) { if (lineWidth == 0.5) @@ -80,25 +80,25 @@ public class ElementLine extends Element3D createComplexLine(size); } } - + /** * This method draws a line with width 1 - * + * * @param size */ - private void createSimpleLine(int size) + private void createSimpleLine(final int size) { - int[] tab = { size }; - LineStripArray line = new LineStripArray(size, LineStripArray.COORDINATES | LineStripArray.COLOR_3, tab); + final int[] tab = { size }; + final LineStripArray line = new LineStripArray(size, GeometryArray.COORDINATES | GeometryArray.COLOR_3, tab); for (int i = 0; i < size; i++) { line.setCoordinate(i, vertex.get(i)); // System.out.println("sommet "+(2*i-1)+" "+vertex.get(i).x+" "+vertex.get(i).y+" "+vertex.get(i).z+" "); line.setColor(i, new Color3f(color.get(i))); } - Shape3D s = new Shape3D(line); - Appearance appear = new Appearance(); - Material mat = new Material(new Color3f(1.0f, 1.0f, 1.0f), new Color3f(0.0f, 0f, 0f), new Color3f(1f, 1.0f, + final Shape3D s = new Shape3D(line); + final Appearance appear = new Appearance(); + final Material mat = new Material(new Color3f(1.0f, 1.0f, 1.0f), new Color3f(0.0f, 0f, 0f), new Color3f(1f, 1.0f, 1.0f), new Color3f(1f, 1f, 1f), 64); appear.setMaterial(mat); appear.setLineAttributes(new LineAttributes(2 * lineWidth, LineAttributes.PATTERN_SOLID, false)); @@ -115,27 +115,27 @@ public class ElementLine extends Element3D * } */ } - + /** * This method draws a sequence of lines with a width different from 1 * Draws a cylinder around the line - * + * * @param size */ - - private void createComplexLine(int size) + + private void createComplexLine(final int size) { for (int i = 0; i < size - 1; i++) { createLine(vertex.get(i), vertex.get(i + 1), new Color3f(color.get(i + 1))); } - + } - + /** * This method creates an elementary line with a width different from 1 * It draws a cylinder around the line and two spheres on each extremities - * + * * @param p1 * the first point * @param p2 @@ -143,93 +143,93 @@ public class ElementLine extends Element3D * @param color * the sphere color */ - private void createLine(Point3d p1, Point3d p2, Color3f color) + private void createLine(final Point3d p1, final Point3d p2, final Color3f color) { // create a new CylinderTransformer between the two atoms - CylinderTransformer cT = new CylinderTransformer(p1, p2); - + final CylinderTransformer cT = new CylinderTransformer(p1, p2); + // get the length - double length = cT.getLength(); - float radius = lineWidth / 1000; + final double length = cT.getLength(); + final float radius = lineWidth / 1000; // holds the translation - Transform3D transform1 = new Transform3D(); + final Transform3D transform1 = new Transform3D(); // ...move the coordinates there transform1.setTranslation(cT.getTranslation()); - + // get the axis and angle for rotation - AxisAngle4d rotation = cT.getAxisAngle(); - Transform3D transform2 = new Transform3D(); + final AxisAngle4d rotation = cT.getAxisAngle(); + final Transform3D transform2 = new Transform3D(); transform2.setRotation(rotation); - + // combine the translation and rotation into transform1 transform1.mul(transform2); - + // create a new Cylinder - Appearance appear = new Appearance(); - Material mat = new Material(new Color3f(1.0f, 1.0f, 1.0f), color, new Color3f(1f, 1.0f, 1.0f), new Color3f(1f, + final Appearance appear = new Appearance(); + final Material mat = new Material(new Color3f(1.0f, 1.0f, 1.0f), color, new Color3f(1f, 1.0f, 1.0f), new Color3f(1f, 1f, 1f), 64); appear.setMaterial(mat); - PolygonAttributes pa = new PolygonAttributes(); + final PolygonAttributes pa = new PolygonAttributes(); pa.setCullFace(PolygonAttributes.CULL_NONE); pa.setBackFaceNormalFlip(true); appear.setPolygonAttributes(pa); - Cylinder cyl = new Cylinder(radius, (float) length, appear); - + final Cylinder cyl = new Cylinder(radius, (float) length, appear); + // and add it to the TransformGroup - TransformGroup tg = new TransformGroup(); + final TransformGroup tg = new TransformGroup(); tg.setTransform(transform1); tg.addChild(cyl); v3d.add2DText(tg); - + // Add Sphere to the line extremities. - Sphere sphere1 = new Sphere(radius, appear); - TransformGroup tg2 = new TransformGroup(); - Transform3D transform3 = new Transform3D(); + final Sphere sphere1 = new Sphere(radius, appear); + final TransformGroup tg2 = new TransformGroup(); + final Transform3D transform3 = new Transform3D(); transform3.setTranslation(new Vector3d(p1)); tg2.setTransform(transform3); tg2.addChild(sphere1); v3d.add2DText(tg2); - - Sphere sphere2 = new Sphere(radius, appear); - TransformGroup tg3 = new TransformGroup(); - Transform3D transform4 = new Transform3D(); + + final Sphere sphere2 = new Sphere(radius, appear); + final TransformGroup tg3 = new TransformGroup(); + final Transform3D transform4 = new Transform3D(); transform4.setTranslation(new Vector3d(p2)); tg3.setTransform(transform4); tg3.addChild(sphere2); v3d.add2DText(tg3); - + } - + public boolean isLine() { return true; } - + public boolean isPoint() { return false; } - + public boolean isPolygon() { return false; } - + public boolean isText() { return false; } - + /** * A class to calculate the length and transformations necessary to produce * a cylinder to connect two points. Useful for Java3D and VRML where a * cylinder object is created aligned along the y-axis. - * + * * @author Alastair Hill */ class CylinderTransformer { - + /** point A */ private final Point3d pointA; /** point B */ @@ -240,7 +240,7 @@ public class ElementLine extends Element3D private double angle; /** * the axis around which to rotate the cylinder - * + * */ private Vector3d axis; /** @@ -250,119 +250,119 @@ public class ElementLine extends Element3D private Vector3d translation; /** * The length of the cylinder required to join the two points - * + * */ private double length; - + /** * Creates a new instance of CylinderTransformer - * + * * @param a * point a * @param b * point b */ - CylinderTransformer(Point3d a, Point3d b) + CylinderTransformer(final Point3d a, final Point3d b) { pointA = a; pointB = b; - + // carry out the calculations doCalculations(); } - + /** * Carries out the necessary calculations so that values may be returned */ private void doCalculations() { length = pointA.distance(pointB); - - double[] arrayA = new double[3]; + + final double[] arrayA = new double[3]; pointA.get(arrayA); - double[] arrayB = new double[3]; + final double[] arrayB = new double[3]; pointB.get(arrayB); - double[] arrayMid = new double[3]; - + final double[] arrayMid = new double[3]; + for (int i = 0; i < arrayA.length; i++) { arrayMid[i] = (arrayA[i] + arrayB[i]) / 2f; } - + // the translation needed is translation = new Vector3d(arrayMid); - + // the initial orientation of the bond is in the y axis - Vector3d init = new Vector3d(0.0f, 1.0f, 0.0f); - + final Vector3d init = new Vector3d(0.0f, 1.0f, 0.0f); + // the vector needed is the same as that from a to b - Vector3d needed = new Vector3d(pointB.x - pointA.x, pointB.y - pointA.y, pointB.z - pointA.z); - + final Vector3d needed = new Vector3d(pointB.x - pointA.x, pointB.y - pointA.y, pointB.z - pointA.z); + // so the angle to rotate the bond by is: angle = needed.angle(init); - + // and the axis to rotate by is the cross product of the initial and // needed vectors - ie the vector orthogonal to them both axis = new Vector3d(); axis.cross(init, needed); } - + /** * Returns the angle (in radians) through which to rotate the cylinder - * + * * @return the angle. */ double getAngle() { return angle; } - + /** * The axis around which the cylinder must be rotated - * + * * @return the axis */ Vector3d getAxis() { return axis; } - + /** * The length required for the cylinder to join the two points - * + * * @return the length */ double getLength() { return length; } - + /** * The translation required to move the cylinder to the midpoint of the * two points - * + * * @return the translation */ Vector3d getTranslation() { return translation; } - + /** * Generates a (pretty) string representation of the the * CylinderTransformer - * + * * @return the string representation */ public String toString() { return "tr: " + translation + ", ax: " + axis + ", an: " + angle + ", le: " + length; } - + /** * Generates the required axis and angle combined into an AxisAngle4f * object - * + * * @return the axis and angle */ public AxisAngle4d getAxisAngle() @@ -370,5 +370,5 @@ public class ElementLine extends Element3D return new AxisAngle4d(axis.x, axis.y, axis.z, angle); } } - + } |