- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想使用等 ionic 分形生成随机地形。我正在浏览 Internet 以找到可以帮助我解决特定问题的解决方案,但没有找到任何东西。事实上,我生成了如下所示的简单等 ionic 分形:
这是分形的图片:
分形并不完美,因为有看到正方形但被我的老师接受。生成这种分形的算法是,给定一个输入正方形,我通过在每个正方形边的中间插入四个点,然后在中心插入一个点,将其分成较小的正方形,从而创建 4 个新正方形。每个新生成的顶点都有它的颜色值,它是一个范围为 [0, 255] 的 float ,它是使用特殊公式计算的。我现在的任务是使用这个分形生成随机地形,并且知道每个点的高度与计数的颜色值成正比。我的问题是我尝试使用生成的正方形角坐标绘制四边形,但我的四边形没有连接(有些地方两个四边形边缘的高度不同,以至于它们之间出现间隙)。
这是我的地形图:
这是我生成这个地形的代码:
#include <iostream>
#include "glut\glut.h"
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <fstream>
int window_width = 600, window_height = 600;
typedef float point2d[2];
struct vertex;
struct square;
std::vector<square> sq; // generated squares
// represents the vertex in 2 D
struct vertex
{
point2d pos;
float c;
};
// represents square in 2D
struct square
{
square() {}
square(vertex x, vertex y, vertex z, vertex w) : a(x), b(y), c(z), d(w)
{
this->x = abs(y.pos[0] - x.pos[0]);
}
vertex a, b, c, d;
float x; // length of the side of the square
};
// deklaracje funkcji glut:
void display_scene();
void reshape(GLsizei width, GLsizei height);
void key_pressed(unsigned char key, int x, int y);
// helper function used when counting color of
// newly generated verticle (point)
float W(float x)
{
return (-1.0 / window_width)*x + (float)(1.0 / 2.0);
}
// the same as above but for middle point
float Wc(float x)
{
return ((-1.0 / 1200.0f)*x + (float)(1.0 / 2.0)) / 2;
}
// converts value of range [0.0, 255.0] to
// the numeber of range [0.0, 1.0]
float rgb_to_float(float rgb)
{
return (1.0f / 255.0f) * rgb;
}
// gets color for a vertex based on the newly created
// square's side length x
float get_color(float c1, float c2, float x)
{
int c_prim = (rand() % 256); // draw any number of range [0, 255]
float w = W(x); // count helper function for given side length
return (1 - 2 * w) * c_prim + c1*w + c2 * w; // color is the result of such equation
}
// similarly for the center point
float get_middle_color(float c1, float c2, float c3, float c4, float x)
{
int c_prim = rand() % 256;
float w = Wc(x);
return (1 - 4 * w)*c_prim + w*c1 + w*c2 + w*c3 + w*c4;
}
// each time the function is invoked five new points
// are counted by which the current square is divided
// so that 4 new squares are created. Four points are
// in the middle length of the side of the square that is
// currently processed and the fifth is in the center of it
// and that brings 4 new squares. The action is repeated for
// each square in the input vector sq.
std::vector<square> divide_square(std::vector<square> sq)
{
vertex c12, c23, c34, c41, cc; // newly generated points
std::vector<square> new_squares; // newly created squares go there
float x = sq[0].x / 2; // length of new squares is half of the length of the original one
// for each square in input vector do the dividing operation
for (int i = 0; i < sq.size(); i++)
{
// initializing new vertices on the sides of old square
c12.pos[0] = sq[i].a.pos[0] + x; c12.pos[1] = sq[i].a.pos[1];
c23.pos[0] = sq[i].b.pos[0]; c23.pos[1] = sq[i].b.pos[1] + x;
c34.pos[0] = sq[i].d.pos[0] + x; c34.pos[1] = sq[i].d.pos[1];
c41.pos[0] = sq[i].a.pos[0]; c41.pos[1] = sq[i].a.pos[1] + x;
// ... and the center one:
cc.pos[0] = c12.pos[0]; cc.pos[1] = c23.pos[1];
// counting color based on above formulas
c12.c = get_color(sq[i].a.c, sq[i].b.c, x); c23.c = get_color(sq[i].b.c, sq[i].c.c, x);
c34.c = get_color(sq[i].c.c, sq[i].d.c, x); c41.c = get_color(sq[i].a.c, sq[i].d.c, x);
cc.c = get_middle_color(sq[i].a.c, sq[i].b.c, sq[i].c.c, sq[i].d.c, x);
// generating and adding four newly generated squares to the container of squares for further processing
square s1(sq[i].a, c12, cc, c41);
square s2(c12, sq[i].b, c23, cc);
square s3(cc, c23, sq[i].c, c34);
square s4(c41, cc, c34, sq[i].d);
new_squares.push_back(s1); new_squares.push_back(s2);
new_squares.push_back(s3); new_squares.push_back(s4);
}
return new_squares;
}
// dynamic two-dimensional array representing matrix for storing all
// generated squares (this array should be ordered
// in such way that each row "i" contains 256 squares
// which A vertex has Y coordinate equal to "i"
// for instance Map[3][0] should represent the first
// square which has A corner vertex coordinates like (0, 3)
square **Map = new square*[256];
// performing the dividing mechanism and filling up the
// Map matrix
void foo()
{
vertex a, b, c, d; // vertices of the entering square of size 256x256
a.pos[0] = 0.0f; a.pos[1] = 0.0f;
b.pos[0] = 256.0f; b.pos[1] = 0.0f;
c.pos[0] = 256.0f; c.pos[1] = 256.0f;
d.pos[0] = 0.0f; d.pos[1] = 256.0f;
a.c = 0.5f; b.c = 0.5f; c.c = 0.5f; d.c = 0.5f;
sq.push_back(square(a, b, c, d)); // adding it as the first the square to the container
// while generated smaller squares have the x length more than 1.0 divide them on smaller ones
while (sq[0].x > 1.0f)
{
sq = divide_square(sq);
}
int tempor = 0; // helper for iterating columns of Map matrix
float curr_y; // represent the y-coordinate of left-upper square corner (A)
for (int j = 0; j < 256; j++)
{
Map[j] = new square[256]; // new row of 256 squares is initialized
// search all squares for finding those which left-upper corner (A)
// y-coordinate is equal to the row numer
for (int i = 0; i < sq.size(); i++)
{
curr_y = sq[i].a.pos[1];
if (curr_y == j)
{
Map[j][tempor++] = sq[i];
}
}
tempor = 0; // setting to first column again
}
}
// helper global variables to set some properties
// for drawing and transforming which can be set
// by pressing some keys (they are set in key_pressed
// function)
double rot = 10.0; // rotation angle;
int rows = 1; // the variable to iterate rows of Map matrix
int columns = 10; // the variable to iterate columns of Map matrix
void key_pressed(unsigned char key, int x, int y)
{
if (key == '>')
glRotated(rot, 1.0, 1.0, 1.0);
if (key == 'z')
rows++;
if (key == 'x')
rows--;
if (key == 't')
glTranslated(-1.0, 0.0, 0.0); // translating to the left
if (key == 's')
columns += 40;
display_scene();
}
int main()
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // inicjalizacja bufora ramki: podwójne buforowanie, RGB
glutInitWindowSize(window_width, window_height);
glutCreateWindow("Terrain");
glutDisplayFunc(display_scene); // przekazanie wskaźnika do funkcji wywoływanej przez GLUT przy wyświetlaniu
glutReshapeFunc(reshape); // jw. ale przy zmianie wielkości okna
glutKeyboardFunc(key_pressed);
// invoking function to generate squares.
foo();
glutMainLoop();
return 0;
}
void display_scene(){
// setting background color
glClearColor(0.4f, 0.4f, 0.4f, 1.0);
// clearing buffer to draw new image
glClear(GL_COLOR_BUFFER_BIT);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
// drawing quads in 3D where X and Z coordinates are just like
// the square A, B, C or D vertices X and Y coordinates and
// the Y coordinate (height) depends on the color of the vertex
// (the darker color the lower height)
glBegin(GL_QUADS);
float col = rgb_to_float(Map[i][j].a.c);
// color may be to brigth (for instance 0.0019) so some
// scalling is done
if (col < 0.1)
col *= 10;
glColor3f(col, col, col); // seting color for drawing the verticle
glVertex3f(Map[i][j].a.pos[0], col * 10, Map[i][j].a.pos[1]);
col = rgb_to_float(Map[i][j].b.c);
if (col < 0.1)
col *= 10;
glColor3f(col, col, col);
glVertex3f(Map[i][j].b.pos[0], col*10, Map[i][j].b.pos[1]);
col = rgb_to_float(Map[i][j].c.c);
if (col < 0.1)
col *= 10;
glColor3f(col, col, col);
glVertex3f(Map[i][j].c.pos[0], col*10, Map[i][j].c.pos[1]);
col = rgb_to_float(Map[i][j].d.c);
if (col < 0.1)
col *= 10;
glColor3f(col, col, col);
glVertex3f(Map[i][j].d.pos[0], col*10, Map[i][j].d.pos[1]);
glEnd();
}
}
glFlush(); // powyższe polecenia zostaną przesłąne do sterownika karty graficznej (lepsza wydajność, bo naraz podaje się wszystkie dane, a nie każdą daną po kolei, co zajmowałoby więcej czasu)
glutSwapBuffers();
}
void reshape(GLsizei width, GLsizei height){
if (height == 0) // omitting diving by zero in counting AspectRatio
height = 1;
// setting view port the same as window size
glViewport(0, 0, width, height);
// switching to projection matrix for setting proper view aspects
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat AspectRatio = (GLfloat)width / (GLfloat)height;
if (width <= height)
glOrtho(-7.5, 7.5, -7.5 / AspectRatio, 7.5 / AspectRatio, 10.0, -10.0);
else
glOrtho(-7.5*AspectRatio, 7.5*AspectRatio, -7.5, 7.5, 10.0, -10.0);
// switching to modelview matrix to enable performing transformations on
// the image such as translating, rotating etc.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
我想知道如何解决四边形断开(损坏)的问题。
最佳答案
您的“正方形”类不是计算此网格中高度的理想模型,因为每次 segmentation 时,您最终都会修改相邻正方形共享的点,也可能由父正方形共享。
至少,让您的方 block 包含对顶点的引用(或指针),并在相邻方 block 之间共享这些引用。
然后,当您修改任何顶点时,所有共享它的正方形都会自动获得更新后的坐标。
关于c++ - 在 OpenGL 中使用等 ionic 分形生成地形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33874170/
我正在尝试使用以下 keytool 命令为我的应用程序生成 keystore : keytool -genkey -alias tomcat -keystore tomcat.keystore -ke
编辑:在西里尔正确解决问题后,我注意到只需将生成轴的函数放在用于生成标签的函数下面就可以解决问题。 我几乎读完了 O'Reilly 书中关于 D3.js 的教程,并在倒数第二页上制作了散点图,但是当添
虽然使用 GraphiQL 效果很好,但我的老板要求我实现一个用户界面,用户可以在其中通过 UI 元素(例如复选框、映射关系)检查呈现给他们的元素并获取数据,这样做将为该人生成 graphql 输入,
我尝试在 Netbean 6.8 中使用 ws-import 生成 Java 类。我想重新生成 jax-ws,因为在 ebay.api.paypalapi 包中发现了一个错误(我认为该错误是由于 Pa
我有一个 perl 脚本,它获取系统日期并将该日期写入文件名。 系统日期被分配给 TRH1 变量,然后它被设置为一个文件名。 $TRH1 =`date + %Y%m%d%H%M`; print "TR
我是 Haskell 的新手,需要帮助。我正在尝试构建一种必须具有某种唯一性的新数据类型,因此我决定使用 UUID 作为唯一标识符: data MyType = MyType { uuid ::
我制作了一个脚本,它可以根据 Mysql 数据库中的一些表生成 XML。 该脚本在 PHP 中运行。 public function getRawMaterials($apiKey, $format
所以这是我的项目中的一个问题。 In this task, we will use OpenSSL to generate digital signatures. Please prepare a f
我在 SAS LIFEREG 中有一个加速故障时间模型,我想绘制它。因为 SAS 在绘图方面非常糟糕,我想实际重新生成 R 中曲线的数据并将它们绘制在那里。 SAS 提出了一个尺度(在指数分布固定为
我正在为 Django 后端制作一个样板,并且我需要能够使它到达下一个下载它的人显然无法访问我的 secret key 的地方,或者拥有不同的 key 。我一直在研究一些选项,并在这个过程中进行了实验
我正在创建一个生成采购订单的应用程序。我可以根据用户输入的详细信息创建文本文件。我想生成一个看起来比普通文本文件好得多的 Excel。有没有可以在我的应用程序中使用的开源库? 最佳答案 目前还没有任何
我正在尝试使用 ScalaCheck 为 BST 创建一个 Gen,但是当我调用 .sample 方法时,它给了我 java.lang.NullPointerException。我哪里错了? seal
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我尝试编写一些代码,例如(在verilog中): parameter N = 128; if (encoder_in[0] == 1) begin 23 binary_out = 1;
我正忙于在 Grails 项目中进行从 MySQL 到 Postgres 的相当复杂的数据迁移。 我正在使用 GORM 在 PostGres 中生成模式,然后执行 MySQL -> mysqldump
如何使用纯 XSLT 生成 UUID?基本上是寻找一种使用 XSLT 创建独特序列的方法。该序列可以是任意长度。 我正在使用 XSLT 2.0。 最佳答案 这是一个good example 。基本上,
我尝试安装.app文件,但是当我安装并单击“同步”(在iTunes中)时,我开始在设备上开始安装,然后停止,这是一个问题,我不知道在哪里,但我看到了我无法解决的奇怪的事情: 最佳答案 似乎您没有在Xc
自从我生成 JavaDocs 以来已经有一段时间了,我确信这些选项在过去 10 年左右的时间里已经得到了改进。 我能否得到一些有关生成器的建议,该生成器将输出类似于 .Net 文档结构的 JavaDo
我想学习如何生成 PDF,我不想使用任何第三方工具,我想自己用代码创建它。到目前为止,我所看到的唯一示例是我通过在第 3 方 dll 上打开反射器查看的代码,以查看发生了什么。不幸的是,到目前为止我看
我正在从 Epplus 库生成 excel 条形图。 这是我成功生成的。 我的 table 是这样的 Mumbai Delhi Financial D
我是一名优秀的程序员,十分优秀!