Рекурсивли, генерирующие треугольники, чтобы сформировать пейзаж - PullRequest
0 голосов
/ 29 апреля 2020

Я должен рекурсивно создать ландшафт, начинающийся с одного двумерного треугольника (путем печати треугольников в файле 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);

    }

}


...