初学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
原创粉丝点击