OpenGL de プログラミング - OpenCV::中点変位法
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::中点変位法

問題


ある2点間の中点を求め、適当に上下させ、その後、その点とそれぞれの2点で、
それぞれ中点をもとめそれを上下させ...
をくりかえし、ある2点間をギザギザに結ぶようにせよ。

答え


#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cv.h>
#include <highgui.h>

using namespace std;



/**************[プロトタイプ宣言]************************/
void DRAW_FRACTAL(IplImage *imgA);
void DRAW_FRACTAL_MIDDLE(IplImage *imgA, CvPoint p1,CvPoint p2, int dim);


/************* [メイン関数] *************/
int main( int argc, char **argv)
{

static CvSize window_size={300,300};
IplImage *imgA = cvCreateImage(window_size,IPL_DEPTH_8U,3);
cvSet (imgA, cvScalarAll (255), 0);


DRAW_FRACTAL(imgA);


cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);


cvWaitKey(0); // 0秒待つ => ずっと入力待ち


cvReleaseImage(& imgA);
cvDestroyWindow("window");

return 0;
}


/**************[ここから、各種関数]****************/
void DRAW_FRACTAL(IplImage *imgA)
{

CvPoint p1=cvPoint(30,170),p2=cvPoint(270,120);//スタート地点

const int dim = 8; //階層の深さ

srand(unsigned int(time(NULL)));


DRAW_FRACTAL_MIDDLE(imgA,p1,p2,dim); //ここから再帰


}


const int MOVEMENT = 20; //移動量
int flag = 1; //正負の確定
void DRAW_FRACTAL_MIDDLE(IplImage *imgA, CvPoint p1,CvPoint p2, int dim)
{

if(dim<=0)
{
cvLine(imgA,p1,p2,CV_RGB(255,0,0));
return;
}

CvPoint middle = cvPoint(int ( ( (p1.x + p2.x)/2.0 ) + 0.5), int( ( (p1.y + p2.y) / 2.0 ) + 0.5 ) );

( (rand() % 2 ) == 0 ) ? (flag = -1) : (flag = 1);//正負決定

middle.y += flag * (rand() % MOVEMENT);
if(middle.y > imgA->height) //画面端対策
{
middle.y = imgA->height - 1;
}else if(middle.y < 0)
{
middle.y = 0;
}

DRAW_FRACTAL_MIDDLE(imgA,p1,middle,dim-1);
DRAW_FRACTAL_MIDDLE(imgA,p2,middle,dim-1);
}

メモ


中点変位法みたいなもの。
揺らし方とか、全般にてきとう。