初学opengl(三) 通过dart throwing的思想进行点采样
来源:互联网 发布:php在线报名系统 编辑:程序博客网 时间:2024/06/06 08:36
本次是想实现一堆点进行采样,使得点两两之间的距离能够大于某个值。关于dart throwing进行采样的思想,我只是按照自己的理解做的。可能理解有偏差,或者算法有错误,还请大神指教。
采样:我的理解是,对散点图进行采样,就是从一堆点中选出一部分点,使得这些选出的点满足特定的要求。这里我们的要求就是要使这些点不交叉不重合,并且每两点之间的距离能够大于特定值。
dart throwing:我的理解,就是遍历。先随机从那堆点中选择一个点,然后以这个点为圆心以那个特定的距离值为半径画圆。如果下一个点落在这个圆中就换一个点,再进行尝试。直到找到一个不落在这个圆中的点,把它选出来。下次再进行尝试时要使得选出的点不落在以之前选出的所有点为圆心形成的任何一个圆中。如此遍历所有点,选出符合条件的点,然后结束。
算法的设计也非常简单,就是双重循环。我一开始是这么写的。
glBegin(GL_POINTS);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 0.0f, 0.0f);int start = rand() % 500;int seletedPN = 1;//glVertex2f(x_real[start], y_real[start]);glVertex2f(x[start], y[start]);for (i = 0; i < n; i++){if (i == start)continue;if (pow(x[i] - x[start], 2) + pow(y[i] - y[start], 2) > pow(r, 2))for (j = 0; j < i; j++){if (pow(x[j] - x[i], 2) + pow(y[j] - y[i], 2) <= pow(r, 2))break;if (j == i-2){glVertex2f(x[i], y[i]);seletedPN ++;}};}glEnd();有发现问题吗?其实我一开始是没有发现的。直到我写这篇记录的时候才想明白。上面这样写,是把每个点都遍历了。不论选出来的点还是没有选出来的点,都给它们画出来一个圆面的范围,使点不可落在其中。这样选出来的是距离所有点的距离都大于定值r的点。而不是选出一部分点使得被选出的点之间的距离大于定值r。
程序修正为
glBegin(GL_POINTS);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 0.0f, 0.0f);int start = rand() % 500;int seletedPN = 1;//glVertex2f(x_real[start], y_real[start]);glVertex2f(x[start], y[start]);GLfloat xs[n], ys[n];for (i = 0; i < n; i++){xs[i] = 0.0f;ys[i] = 0.0f;}xs[0] = x[start];ys[0] = y[start];for (i = 0; i < n; i++){if (i == start)continue;if (pow(x[i] - x[start], 2) + pow(y[i] - y[start], 2) > pow(r, 2)){j = 0;while (pow(xs[j] - x[i], 2) + pow(ys[j] - y[i], 2) > pow(r, 2) && !(xs[j] == 0.0f && ys[j] == 0.0f)){j++;}if (xs[j] == 0.0f || ys[j] == 0.0f){glVertex2f(x[i], y[i]);xs[j] = x[i];ys[j] = y[i]; seletedPN++;}}}glEnd();
我还想明白一个细节。我上次写的,显示的面板有一个坐标系,然后自己画散点图的时候自己再定义一个坐标系,二者再进行转换。这样很麻烦而且容易算错。其实可以让二者用一个坐标系。只需要定义一下自己想设置的坐标系的长宽。然后进行矩阵映射的时候将左下角的坐标映射到负值。这样的话从零开始就有了留白。
#define COORDINATE_WIDTH 200#define COORDINATE_HEIGHT 150gluOrtho2D(-10.0, COORDINATE_WIDTH + 10, -10.0, COORDINATE_HEIGHT + 10);
本次程序得到的结果如下
本次的程序http://download.csdn.net/detail/u011636440/9461744
0 0
- 初学opengl(三) 通过dart throwing的思想进行点采样
- VTK对点进行采样
- 三线性插值计算重采样点数值
- OpenGL多重采样的初始化问题
- java初学(三) 面向对象设计思想
- opengl学习笔记(三)-点和线段的绘制
- opengl对三种光源(方向光,点光源,聚光灯)进行特写并分屏渲染
- PCL:使用VoxelGrid filter对点云进行下采样
- Dart 出现不能识别.dart的文件
- Dart的数据库操作
- Dart的路径操作
- opengl点的绘制
- OpenGL通过顶点绘制点和直线
- OpenGL中的多重采样
- OpenGL中的多重采样
- 随机模拟的基本思想和常用采样方法(sampling)
- 随机模拟的基本思想和常用采样方法…
- OpenGL初学
- linux TC
- Android Services简介
- golang - concurrency
- 12C-OCP升级1z-060-003
- 正则表达式匹配多行
- 初学opengl(三) 通过dart throwing的思想进行点采样
- 资源的最小单位是什么
- next_permutation函数
- 数据库语句
- 12C-OCP升级1z-060-004
- Power iteration clustering (PIC)
- 使用profile解决maven不同的环境deploy到不同的repositories
- Ubuntu装机
- have error with saxParser on android(not well-formed (invalid token))问题解决