Java 使分形景观看起来更真实
在STL格式中,这是看起来的样子。这就是我们所支持的景观。我想我知道问题是什么,但我不知道如何解决它 我想我需要设置Z坐标相对于它周围的其他点,这样整个景观的Z坐标不是在0和1之间,而是“相加” 我不想要一个解决方案,只是一个正确方向的提示Java 使分形景观看起来更真实,java,fractals,Java,Fractals,在STL格式中,这是看起来的样子。这就是我们所支持的景观。我想我知道问题是什么,但我不知道如何解决它 我想我需要设置Z坐标相对于它周围的其他点,这样整个景观的Z坐标不是在0和1之间,而是“相加” 我不想要一个解决方案,只是一个正确方向的提示 import java.io.*; import java.util.Random; class Point3D { double x, y, z; Point3D(double dx, double dy, double dz) {
import java.io.*;
import java.util.Random;
class Point3D {
double x, y, z;
Point3D(double dx, double dy, double dz) {
x = dx;
y = dy;
z = dz;
}
Point3D middlePoint(Point3D p) {
Point3D m = new Point3D(0.0, 0.0, 0.0);
m.x = (this.x + p.x) / 2.0;
m.y = (this.y + p.y) / 2.0;
m.z = (this.z + p.z) / 2.0;
return m;
}
}
public class Aufgabe3 {
public static void recursion(Point3D p1, Point3D p2, Point3D p3, int n) {
if (n > 0) {
if (n == 1) {
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");
}
Random r = new Random();
Point3D a = p1.middlePoint(p2);
Point3D b = p3.middlePoint(p1);
Point3D c = p2.middlePoint(p3);
long seedA = (long) ((p1.x + p1.y + p1.z + p2.x + p2.y + p2.z) * 1000000);
r.setSeed(seedA);
a.z = r.nextDouble() / 10;
long seedB = (long) ((p3.x + p3.y + p3.z + p1.x + p1.y + p1.z) * 1000000);
r.setSeed(seedB);
b.z = r.nextDouble() / 10;
long seedC = (long) ((p2.x + p2.y + p2.z + p3.x + p3.y + p3.z) * 1000000);
r.setSeed(seedC);
c.z = r.nextDouble() / 10;
recursion(p1, a, b, n-1);
recursion(a, p2, c, n-1);
recursion(b, c, p3, n-1);
recursion(a, b, c, n-1);
}
}
public static void main(String args[]) throws FileNotFoundException {
int n;
try {
n = Integer.parseInt(args[0]);
}
catch (Exception e) {
n = 7;
}
System.out.println("Aufgabe 3: Landschaftsgenerator");
System.out.println("n = " + n);
Random r = new Random();
Point3D p1 = new Point3D(0.8, -1.2, 0.0);
Point3D p2 = new Point3D(1.0, 1.3, 0.0);
Point3D p3 = new Point3D(-1.0, 0.0, 0.0);
System.setOut(new PrintStream(new FileOutputStream("Aufgabe3.stl")));
System.out.println("solid Aufgabe3");
recursion(p1, p2, p3, n);
System.out.println("endsolid");
}
}
问题是你要添加的位移的频率分布。分形景观的位移必须遵循1/(f^b)分布,否则会产生随机噪声 在这种情况下,无论细分的比例如何,都要添加相同的垂直位移,这将导致由最高频率控制的景观。形式上,分形曲面是具有“分数”或“分形”几何维数的曲面,高于曲面的拓扑维数,但低于嵌入空间的拓扑维数。例如,对于在第三维中置换的二维曲面,分形维数应介于2和3之间 对于细分和置换,分形维数与β相关,如下所示:
Dim = (7 - b)/2
因此,分形行为发生在b=1和b=3之间,随机位移遵循以下轮廓:
displacement = k * rand / (f^b)
这意味着,如果每次将三角形分成两半,则必须至少将位移减半,否则最终将得到一个噪波曲面,而不是分形曲面。景观的最佳选择通常在b=2左右
参考资料:正如您所知,您必须“累计”价值,为什么不这样做呢?新点的
Z
坐标将随机不同于先前的Z
坐标。请记住,您可能需要对值进行上限设置,以避免值过高或过低。a.z+=0.1*r.nextDouble()*Math.pow(2.0,n)
。其他类似points@Progman我很尴尬。我想我在那里有很重的视野@MattTimmermans我不太明白为什么它可以与Math.pow(2.0,n)
一起使用,但是效果非常好。(但我不得不将0.1降低到0.003左右)