用OpenGL中的solid cone来模拟VORONOI图

  • voronoi模拟方法
    随机画多个圆锥,则圆锥的顶部的那个点就是voronoi中的种子点,同一颜色区域就表示该点所在的cell; 如图示

用OpenGL中的solid cone来模拟VORONOI图_第1张图片

 

  • 说明:
  1. 将圆锥尽量画大些,并且画出圆锥顶端的点;
  2. 由rand()得到的随机数又称伪随机数,因为一旦定了它的种子srand()之后,这个随机数序列就是固定了的,只是数与数之间没有特别规律可循;
  3. 由于OpenGL中坐标在【-1,1】之间,于是需要将从随机数得来的值折算到该区间;OpenGL中的颜色值在用【0,1】中的数值表示,所以同理得折算;

 

  • 对于加权图图示如下:

 

  • 代码如下:

//function for the action of drawing cones void DrawConeAtWithColor( double x, double y, double r, double g, double b) const { glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_LINE_BIT); glDisable(GL_LIGHTING); //disable lighting, so that we can see the color of the object glPushMatrix(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //确保坐标变换不起作用,比如不能平移,旋转等操作 glTranslated(x, y, 0);//locate the position of cones glColor3d(r, g, b); //designate the color of cones glutSolidCone(5, 5, 500, 500); //draw glPopMatrix(); glPopAttrib(); //draw the top point of the cone glPushMatrix(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(x, y, 5); glutSolidSphere(0.007, 500, 500); glPopMatrix(); } 加权voronoi图,这里的加权只是将圆锥的底圆和高度加了一个随机的扰动;如图示 //for weighted/additive voronoi void DrawConeAtWithColor( double x, double y, double r, double g, double b) const { double epsilon = 10 * rand() / (double)RAND_MAX; glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_LINE_BIT); glDisable(GL_LIGHTING); glPushMatrix(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //确保坐标变换不起作用,比如不能平移,旋转等操作 glTranslated(x, y, 0); glColor3d(r, g, b); glutSolidCone(5+epsilon, 5+epsilon, 500, 500); glPopMatrix(); glPopAttrib(); ////////////////////////////////////////////////////////////////////////// glPushMatrix(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(x, y, 5+epsilon); glutSolidSphere(0.007, 500, 500); glPopMatrix(); } //function for rendering void TheOnlyRender() { srand(0); for (int i = 0; i < 100; ++i) { double random_x = 2 * rand() / (double)RAND_MAX - 1;//确保值在【-1,1】间 double random_y = 2 * rand() / (double)RAND_MAX - 1; double random_r = rand() / (double)RAND_MAX; double random_g = rand() / (double)RAND_MAX; double random_b = rand() / (double)RAND_MAX; DrawConeAtWithColor(random_x, random_y, random_r, random_g, random_b); } }

 

你可能感兴趣的:(用OpenGL中的solid cone来模拟VORONOI图)