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");
28 private static void makeSquarePlate(final ShapeCollection shapeCollection,
29 final double y, final double x, final double z) {
30 final Point3D p1 = new Point3D(x, y, z);
31 final Point3D p2 = new Point3D(x + 20, y, z);
32 final Point3D p3 = new Point3D(x, y, z + 20);
33 final Point3D p4 = new Point3D(x + 20, y, z + 20);
34 final SolidPolygon polygon1 = new SolidPolygon(p1, p2, p3, SQUARE_PLATE_COLOR);
35 final SolidPolygon polygon2 = new SolidPolygon(p4, p2, p3, SQUARE_PLATE_COLOR);
36 shapeCollection.addShape(polygon1);
37 shapeCollection.addShape(polygon2);
41 * @param surfaceElevation surface total elevation
43 private static void addWobblySurface(final ShapeCollection shapeCollection,
44 final double surfaceElevation) {
45 for (double x = -500; x < 500; x += 20)
46 for (double z = -500; z < 500; z += 20) {
48 // use Pythagorean theorem to compute distance from the center
49 final double distanceFromCenter = Math.sqrt((x * x) + (z * z));
51 double plateElevation = Math.sin(distanceFromCenter / WAVE_FREQUENCY) * WAVE_AMPLITUDE;
53 makeSquarePlate(shapeCollection, plateElevation + surfaceElevation, x,
58 private static final double scale = 50d;
60 private static Graph getCosineGraph(final Point3D location) {
61 final List<Point2D> data = new ArrayList<>();
62 for (double x = 0; x < 20; x += 0.25) {
63 final double y = Math.cos(x);
65 final Point2D p = new Point2D(x, y);
69 return new Graph(scale, data, "Cosine", location);
72 private static Graph getFormula1Graph(final Point3D location) {
73 final List<Point2D> data = new ArrayList<>();
74 for (double x = 0; x < 20; x += 0.25) {
75 final double y = Math.sin(Math.tan(x));
77 final Point2D p = new Point2D(x, y);
81 return new Graph(scale, data, "y = sin(tan(x))", location);
84 private static Graph getFormula2Graph(final Point3D location) {
85 final List<Point2D> data = new ArrayList<>();
86 for (double x = 0; x < 20; x += 0.25) {
87 final double y = (Math.pow((10 - x), 2) / 30) - 2;
89 final Point2D p = new Point2D(x, y);
93 return new Graph(scale, data, "y = ( (10-x)^2 ) / 30", location);
96 private static Graph getFormula3Graph(final Point3D location) {
97 final List<Point2D> data = new ArrayList<>();
98 for (double x = 0; x < 20; x += 0.25) {
99 final double y = Math.sin(x / 2) + Math.sin(x / 1.26);
101 final Point2D p = new Point2D(x, y);
105 return new Graph(scale, data, "y = sin(x/2) + sin(x/1.26)", location);
108 private static Graph getSineGraph(final Point3D location) {
109 final List<Point2D> data = new ArrayList<>();
110 for (double x = 0; x < 20; x += 0.25) {
111 final double y = Math.sin(x);
113 final Point2D p = new Point2D(x, y);
117 return new Graph(scale, data, "Sine", location);
120 private static Graph getTangentGraph(final Point3D location) {
121 final List<Point2D> data = new ArrayList<>();
122 for (double x = 0; x < 20; x += 0.25) {
123 double y = Math.tan(x);
130 final Point2D p = new Point2D(x, y);
134 return new Graph(scale, data, "Tangent", location);
137 public static void main(final String[] args) {
139 final ViewFrame viewFrame = new ViewFrame();
140 final ShapeCollection geometryCollection = viewFrame.getViewPanel()
141 .getRootShapeCollection();
143 addMathFormulas(geometryCollection);
144 addSphere(geometryCollection);
145 addWobblySurface(geometryCollection, 200);
146 addWobblySurface(geometryCollection, -200);
148 setAvatarLocation(viewFrame);
151 private static void addSphere(ShapeCollection geometryCollection) {
153 geometryCollection.addShape(new WireframeSphere(new Point3D(0, 0, 0),
157 new Color(255,0, 0, 30))
161 private static void addMathFormulas(ShapeCollection geometryCollection) {
163 Point3D location = new Point3D(-600, -300, z);
164 geometryCollection.addShape(getSineGraph(location));
166 location = new Point3D(600, -300, z);
167 geometryCollection.addShape(getFormula1Graph(location));
169 location = new Point3D(-600, 0, z);
170 geometryCollection.addShape(getCosineGraph(location));
172 location = new Point3D(600, 0, z);
173 geometryCollection.addShape(getFormula2Graph(location));
175 location = new Point3D(-600, 300, z);
176 geometryCollection.addShape(getTangentGraph(location));
178 location = new Point3D(600, 300, z);
179 geometryCollection.addShape(getFormula3Graph(location));
182 private static void setAvatarLocation(ViewFrame viewFrame) {
183 viewFrame.getViewPanel().getAvatar()
184 .setLocation(new Point3D(0, 0, -500));