Я должен рекурсивно создать ландшафт, начинающийся с одного двумерного треугольника (путем печати треугольников в файле stl), путем вычисления средних точек краев треугольника и назначения «случайных» значений высоты (z) точке , «Случайный», потому что для того, чтобы ландшафт не имел отверстий, если я вычисляю среднюю точку тех же точек в рекурсивном процессе, необходимо назначить одно и то же значение z. Я пытаюсь выполнить sh это с помощью setSeed («параметр двух точек, из которых я вычисляю среднюю точку») моего генератора случайных чисел. Кажется, это работает, созданный ландшафт не имеет дыр и не выглядит слишком плохо с размером рекурсии 2 или 3.
Однако я должен передать размер рекурсии 8, и когда я создаю это, он это просто очень заостренная поверхность.
Ниже вы можете найти мой код (класс Point, класс Triangle, Main class "Aufgabe 3). Было бы замечательно, если у кого-то есть идея, что я могу сделать, я думаю, проблема лежит в семени или в границах / вычислении моего созданного случайного числа (коэффициент шероховатости).
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Random;
class Point{
double x, y, z;
public Point(double dx, double dy, double dw) {
x = dx;
y = dy;
z = dw;
}
public long seed(Point p1) {
return (long) (this.x*p1.x + this.y*p1.y + this.z*p1.z);
}
Point middlePoint(Point p) {
Point m = new Point(0.0, 0.0, 0.0);
m.x = (x + p.x) / 2.0;
m.y = (y + p.y) / 2.0;
m.z = (z + p.z) /2.0;
return m;
}
}
class Triangle{
Point p1, p2, p3;
Random random;
public Triangle(Point p1, Point p2, Point p3) {
this.p1=p1;
this.p2=p2;
this.p3=p3;
random = new Random();
}
public void elevate(int n) {
int roughness = 9;
elevateUtil( n, roughness);
}
public void elevateUtil(int n, int r) {
Point p4 = p1.middlePoint(p2);
random.setSeed(p1.seed(p2));
p4.z = random.nextInt(r);
Point p5 = p2.middlePoint(p3);
random.setSeed(p2.seed(p3));
p5.z = random.nextInt(r);
Point p6 = p3.middlePoint(p1);
random.setSeed(p3.seed(p1));
p6.z = random.nextInt(r);
Triangle first = new Triangle (p1, p4, p6);
Triangle second = new Triangle (p4, p2, p5);
Triangle third = new Triangle (p6, p5, p3);
Triangle fourth = new Triangle (p5, p6, p4);
if (n == 1) {
first.print();
second.print();
third.print();
fourth.print();
} else {
first.elevateUtil(n-1, r);
second.elevateUtil(n-1, r);
third.elevateUtil(n-1, r);
fourth.elevateUtil(n-1, r);
}
}
public void print() {
System.out.println(" facet normal 0.0 0.0 0.0");
System.out.println(" outer loop");
System.out.println(" vertex " + p1.x + " " + p1.y + " " + p1.z);
System.out.println(" vertex " + p2.x + " " + p2.y + " " + p2.z);
System.out.println(" vertex " + p3.x + " " + p3.y + " " + p3.z);
System.out.println(" endloop");
System.out.println(" endfacet");
}
}
public class Aufgabe3 {
public static void main(String[] args) throws FileNotFoundException {
System.setOut(new PrintStream(new FileOutputStream("Aufgabe3.stl")));
Point p4 = new Point(10, 5, 0);
Point p5 = new Point(32, 5, 0);
Point p6 = new Point (21, 26, 0);
Triangle duplicate = new Triangle (p6, p4, p5);
System.out.println("solid Aufgabe2");
//duplicate.print();
duplicate.elevate(2);
//original.elevate(2);
System.out.println("endsolid");
Point p1 = new Point( 15 * Math.cos(Math.toRadians(90)), 15 * Math.sin(Math.toRadians(90)), 0);
Point p2 = new Point( 15* Math.cos(Math.toRadians(210)), 15* Math.sin(Math.toRadians(210)), 0);
Point p3 = new Point( 15* Math.cos(Math.toRadians(330)), 15* Math.sin(Math.toRadians(330)), 0);
Triangle original = new Triangle(p1,p2,p3);
}
}