2 * Sixth 3D engine demos. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
7 package eu.svjatoslav.sixth.e3d.examples;
9 import eu.svjatoslav.sixth.e3d.geometry.Point2D;
10 import eu.svjatoslav.sixth.e3d.geometry.Point3D;
11 import eu.svjatoslav.sixth.e3d.gui.ViewFrame;
12 import eu.svjatoslav.sixth.e3d.renderer.raster.Color;
13 import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection;
14 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.line.LineAppearance;
15 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.solidpolygon.SolidPolygon;
16 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.Graph;
17 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.wireframe.WireframeSphere;
19 import java.util.ArrayList;
20 import java.util.List;
22 public class GraphDemo {
24 private static final double WAVE_FREQUENCY = 50d;
25 private static final double WAVE_AMPLITUDE = 50d;
26 private static final Color SQUARE_PLATE_COLOR = new Color("88F7");
27 private static final double GRAPH_SCALE = 50d;
29 private static void makeSquarePlate(final ShapeCollection shapeCollection,
30 final double y, final double x, final double z) {
31 final Point3D p1 = new Point3D(x, y, z);
32 final Point3D p2 = new Point3D(x + 20, y, z);
33 final Point3D p3 = new Point3D(x, y, z + 20);
34 final Point3D p4 = new Point3D(x + 20, y, z + 20);
35 final SolidPolygon polygon1 = new SolidPolygon(p1, p2, p3, SQUARE_PLATE_COLOR);
36 final SolidPolygon polygon2 = new SolidPolygon(p4, p2, p3, SQUARE_PLATE_COLOR);
37 shapeCollection.addShape(polygon1);
38 shapeCollection.addShape(polygon2);
42 * @param surfaceElevation surface total elevation
44 private static void addWobblySurface(final ShapeCollection shapeCollection,
45 final double surfaceElevation) {
46 for (double x = -500; x < 500; x += 20)
47 for (double z = -500; z < 500; z += 20) {
49 // use Pythagorean theorem to compute distance from the center
50 final double distanceFromCenter = Math.sqrt((x * x) + (z * z));
52 double plateElevation = Math.sin(distanceFromCenter / WAVE_FREQUENCY) * WAVE_AMPLITUDE;
54 makeSquarePlate(shapeCollection, plateElevation + surfaceElevation, x,
59 private static Graph getCosineGraph(final Point3D location) {
60 final List<Point2D> data = new ArrayList<>();
61 for (double x = 0; x < 20; x += 0.25) {
62 final double y = Math.cos(x);
64 final Point2D p = new Point2D(x, y);
68 return new Graph(GRAPH_SCALE, data, "Cosine", location);
71 private static Graph getFormula1Graph(final Point3D location) {
72 final List<Point2D> data = new ArrayList<>();
73 for (double x = 0; x < 20; x += 0.25) {
74 final double y = Math.sin(Math.tan(x));
76 final Point2D p = new Point2D(x, y);
80 return new Graph(GRAPH_SCALE, data, "y = sin(tan(x))", location);
83 private static Graph getFormula2Graph(final Point3D location) {
84 final List<Point2D> data = new ArrayList<>();
85 for (double x = 0; x < 20; x += 0.25) {
86 final double y = (Math.pow((10 - x), 2) / 30) - 2;
88 final Point2D p = new Point2D(x, y);
92 return new Graph(GRAPH_SCALE, data, "y = ( (10-x)^2 ) / 30", location);
95 private static Graph getFormula3Graph(final Point3D location) {
96 final List<Point2D> data = new ArrayList<>();
97 for (double x = 0; x < 20; x += 0.25) {
98 final double y = Math.sin(x / 2) + Math.sin(x / 1.26);
100 final Point2D p = new Point2D(x, y);
104 return new Graph(GRAPH_SCALE, data, "y = sin(x/2) + sin(x/1.26)", location);
107 private static Graph getSineGraph(final Point3D location) {
108 final List<Point2D> data = new ArrayList<>();
109 for (double x = 0; x < 20; x += 0.25) {
110 final double y = Math.sin(x);
112 final Point2D p = new Point2D(x, y);
116 return new Graph(GRAPH_SCALE, data, "Sine", location);
119 private static Graph getTangentGraph(final Point3D location) {
120 final List<Point2D> data = new ArrayList<>();
121 for (double x = 0; x < 20; x += 0.25) {
122 double y = Math.tan(x);
129 final Point2D p = new Point2D(x, y);
133 return new Graph(GRAPH_SCALE, data, "Tangent", location);
136 public static void main(final String[] args) {
138 final ViewFrame viewFrame = new ViewFrame();
139 final ShapeCollection geometryCollection = viewFrame.getViewPanel()
140 .getRootShapeCollection();
142 addMathFormulas(geometryCollection);
143 addSphere(geometryCollection);
144 addWobblySurface(geometryCollection, 200);
145 addWobblySurface(geometryCollection, -200);
147 setAvatarLocation(viewFrame);
150 private static void addSphere(ShapeCollection geometryCollection) {
152 geometryCollection.addShape(new WireframeSphere(new Point3D(0, 0, 0),
156 new Color(255,0, 0, 30))
160 private static void addMathFormulas(ShapeCollection geometryCollection) {
162 Point3D location = new Point3D(-600, -300, z);
163 geometryCollection.addShape(getSineGraph(location));
165 location = new Point3D(600, -300, z);
166 geometryCollection.addShape(getFormula1Graph(location));
168 location = new Point3D(-600, 0, z);
169 geometryCollection.addShape(getCosineGraph(location));
171 location = new Point3D(600, 0, z);
172 geometryCollection.addShape(getFormula2Graph(location));
174 location = new Point3D(-600, 300, z);
175 geometryCollection.addShape(getTangentGraph(location));
177 location = new Point3D(600, 300, z);
178 geometryCollection.addShape(getFormula3Graph(location));
181 private static void setAvatarLocation(ViewFrame viewFrame) {
182 viewFrame.getViewPanel().getAvatar()
183 .setLocation(new Point3D(0, 0, -500));