public MeshViewer(String title, ArrayList<Triangle> triangles, boolean culling) { super(title); enableCullling = culling; this.setSize(640, 480); ArrayList<PointND> edgePoints = new ArrayList<PointND>(); for (Triangle t : triangles) { edgePoints.add(t.getA()); edgePoints.add(t.getB()); edgePoints.add(t.getC()); } PointND center = DoublePrecisionPointUtil.getGeometricCenter(edgePoints); Translation translation = new Translation(center.getAbstractVector().negated()); double max = 0; for (PointND p : edgePoints) { p.applyTransform(translation); for (int i = 0; i < 3; i++) { if (Math.abs(p.get(i)) > max) { max = Math.abs(p.get(i)); } } } AffineTransform affineTransform = new AffineTransform(SimpleMatrix.I_3.dividedBy(max / 1.0), new SimpleVector(0, 0, 0)); for (Triangle t : triangles) { t.applyTransform(translation); t.applyTransform(affineTransform); } this.triangles = triangles; }