当前位置: 首页 > 面试题库 >

菱形平方算法

上官鸿祯
2023-03-14
问题内容

我正在尝试用Java 编写Diamond-Square算法以生成随机映射,但无法弄清楚实现方式…

任何有一些Java代码(或其他语言)的人,以便我可以检查循环的制作方式,将不胜感激!

谢谢!


问题答案:

这是用于生成值的有趣算法。这是我根据Wikipedia文章中的参考在本页上给出的说明创建的实现。它将创建“球面值”(包裹在所有边上)。注释中有注释,说明如何更改它以在边缘上生成新值而不是换行(尽管在这些情况下,边缘平均值的含义并不正确)。

//size of grid to generate, note this must be a
//value 2^n+1
final int DATA_SIZE = 9;
//an initial seed value for the corners of the data
final double SEED = 1000.0;
double[][] data = new double[DATA_SIZE][DATA_SIZE];
//seed the data
data[0][0] = data[0][DATA_SIZE-1] = data[DATA_SIZE-1][0] = 
  data[DATA_SIZE-1][DATA_SIZE-1] = SEED;

double h = 500.0;//the range (-h -> +h) for the average offset
Random r = new Random();//for the new value in range of h
//side length is distance of a single square side
//or distance of diagonal in diamond
for(int sideLength = DATA_SIZE-1;
    //side length must be >= 2 so we always have
    //a new value (if its 1 we overwrite existing values
    //on the last iteration)
    sideLength >= 2;
    //each iteration we are looking at smaller squares
    //diamonds, and we decrease the variation of the offset
    sideLength /=2, h/= 2.0){
  //half the length of the side of a square
  //or distance from diamond center to one corner
  //(just to make calcs below a little clearer)
  int halfSide = sideLength/2;

  //generate the new square values
  for(int x=0;x<DATA_SIZE-1;x+=sideLength){
    for(int y=0;y<DATA_SIZE-1;y+=sideLength){
      //x, y is upper left corner of square
      //calculate average of existing corners
      double avg = data[x][y] + //top left
      data[x+sideLength][y] +//top right
      data[x][y+sideLength] + //lower left
      data[x+sideLength][y+sideLength];//lower right
      avg /= 4.0;

      //center is average plus random offset
      data[x+halfSide][y+halfSide] = 
    //We calculate random value in range of 2h
    //and then subtract h so the end value is
    //in the range (-h, +h)
    avg + (r.nextDouble()*2*h) - h;
    }
  }

  //generate the diamond values
  //since the diamonds are staggered we only move x
  //by half side
  //NOTE: if the data shouldn't wrap then x < DATA_SIZE
  //to generate the far edge values
  for(int x=0;x<DATA_SIZE-1;x+=halfSide){
    //and y is x offset by half a side, but moved by
    //the full side length
    //NOTE: if the data shouldn't wrap then y < DATA_SIZE
    //to generate the far edge values
    for(int y=(x+halfSide)%sideLength;y<DATA_SIZE-1;y+=sideLength){
      //x, y is center of diamond
      //note we must use mod  and add DATA_SIZE for subtraction 
      //so that we can wrap around the array to find the corners
      double avg = 
        data[(x-halfSide+DATA_SIZE)%DATA_SIZE][y] + //left of center
        data[(x+halfSide)%DATA_SIZE][y] + //right of center
        data[x][(y+halfSide)%DATA_SIZE] + //below center
        data[x][(y-halfSide+DATA_SIZE)%DATA_SIZE]; //above center
      avg /= 4.0;

      //new value = average plus random offset
      //We calculate random value in range of 2h
      //and then subtract h so the end value is
      //in the range (-h, +h)
      avg = avg + (r.nextDouble()*2*h) - h;
      //update value for center of diamond
      data[x][y] = avg;

      //wrap values on the edges, remove
      //this and adjust loop condition above
      //for non-wrapping values.
      if(x == 0)  data[DATA_SIZE-1][y] = avg;
      if(y == 0)  data[x][DATA_SIZE-1] = avg;
    }
  }
}

//print out the data
for(double[] row : data){
  for(double d : row){
    System.out.printf("%8.3f ", d);
  }
  System.out.println();
}


 类似资料:
  • 两者的区别是什么 和 当我创建一个新的ArrayList时,钻石操作员是必要的吗?

  • 我正在尝试使用diamond运算符,但收到以下消息: Source 1.5中不支持diamond运算符(使用Source 7或更高版本启用diamond运算符) 它在Android的netbeans中是可以修复的吗?

  • 问题内容: 我有一个类型为Patient_class的arraylist,并且用黄色下划线标出了arraylist类型,IDE提到了“新表达式中的冗余类型参数(使用菱形运算符)”。 我的问题是:我应该改用菱形运算符吗?是必须的吗?将记录存储到arraylist时,是否会丢失数据或出现其他任何问题? 这是我的数组列表: 老实说,我不知道钻石经营者实际上是什么。 问题答案: Diamond运算符的目的

  • 本文向大家介绍Python打印“菱形”星号代码方法,包括了Python打印“菱形”星号代码方法的使用技巧和注意事项,需要的朋友参考一下 本人是一名python初学者,刚刚看到一道有趣的python问题,“用python如何在编译器中打印出菱形图案?” 因此决定尝试一下,代码不多,仅供参考。 代码 运行结果:

  • 我有以下情况,我简化了我的实际案例,并创建了最小示例来展示我的案例: 两个空的(在本例中不相关)classess和和映射器继承结构使用一个方法声明将映射到,两个空接口和都扩展,一个实际映射器接口和类实现MapStruct生成的。此设置的问题是mapstruct生成,其内容如下: 所以它不会组合,因为方法声明了两次,一次是通过继承路径,第二次是通过。在不改变我的继承结构的情况下,是否有可能避免这种情

  • 问题内容: Java 7中的菱形运算符允许如下代码: 但是,在Java 5/6中,我可以简单地编写: 我对类型擦除的理解是这些完全相同。(无论如何,泛型都会在运行时删除)。 问题答案: 是在左侧,你使用的是通用类型,而在右侧,你使用的是原始类型LinkedList。Java中的原始类型实际上仅存在于与前泛型代码的兼容性,并且除非绝对必要,否则绝对不能在新代码中使用。 现在,如果Java从一开始就具

  • 本文向大家介绍用python打印菱形的实操方法和代码,包括了用python打印菱形的实操方法和代码的使用技巧和注意事项,需要的朋友参考一下 python怎么打印菱形?下面给大家带来三种方法: 第一种 输出结果: 第二种 输出结果: 第三种 输出结果: 以上就是关于用python来画出菱形的方法总结,感谢大家的阅读和对呐喊教程的支持。

  • 本文向大家介绍python 打印直角三角形,等边三角形,菱形,正方形的代码,包括了python 打印直角三角形,等边三角形,菱形,正方形的代码的使用技巧和注意事项,需要的朋友参考一下 三角形 等腰直角三角形1 2.7 python:打印直角三角形 coding=utf-8 方式一 方式二 #打印实心等边三角形 #打印菱形 #实心正方形 #空心正方形 知识点说明: python ,end=''备注