--- /dev/null
+#! /usr/bin/env octave
+
+cv;
+highgui;
+
+function ret = randint(a, b)
+ ret = int32(rand() * (b - a) + a);
+endfunction
+
+function minarea_array(img, count)
+ global cv;
+ global highgui;
+ pointMat = cvCreateMat( count, 1, cv.CV_32SC2 );
+ for i=0:count-1,
+ pointMat(i) = cvPoint( randint(img.width/4, img.width*3/4), randint(img.height/4, img.height*3/4) );
+ endfor
+
+ box = cvMinAreaRect2( pointMat );
+ box_vtx = cvBoxPoints( box );
+ [success, center, radius] = cvMinEnclosingCircle( pointMat );
+ cv.cvZero( img );
+ for i=0:count-1,
+ cvCircle( img, cvGet1D(pointMat,i), 2, CV_RGB( 255, 0, 0 ), \
+ cv.CV_FILLED, cv.CV_AA, 0 );
+ endfor
+
+ box_vtx = {cvPointFrom32f(box_vtx{1}), \
+ cvPointFrom32f(box_vtx{2}), \
+ cvPointFrom32f(box_vtx{3}), \
+ cvPointFrom32f(box_vtx{4})};
+ cvCircle( img, cvPointFrom32f(center), cvRound(radius), CV_RGB(255, 255, 0), 1, cv.CV_AA, 0 );
+ cvPolyLine( img, {box_vtx}, 1, CV_RGB(0,255,255), 1, cv.CV_AA ) ;
+endfunction
+
+
+function minarea_seq(img, count, storage)
+ global cv;
+ global highgui;
+ ptseq = cvCreateSeq( bitor(cv.CV_SEQ_KIND_GENERIC, cv.CV_32SC2), cv.sizeof_CvContour, cv.sizeof_CvPoint, storage );
+ ptseq = cv.CvSeq_CvPoint.cast( ptseq );
+ for i=0:count-1,
+ pt0 = cvPoint( randint(img.width/4, img.width*3/4), randint(img.height/4, img.height*3/4) );
+ cvSeqPush( ptseq, pt0 );
+ endfor
+ box = cvMinAreaRect2( ptseq );
+ box_vtx = cvBoxPoints( box );
+ [success, center, radius] = cvMinEnclosingCircle( ptseq );
+ cv.cvZero( img );
+ for pt = CvSeq_map(ptseq),
+ pt = pt{1};
+ cvCircle( img, pt, 2, CV_RGB( 255, 0, 0 ), cv.CV_FILLED, cv.CV_AA, 0 );
+ endfor
+
+ box_vtx = {cvPointFrom32f(box_vtx{1}), \
+ cvPointFrom32f(box_vtx{2}), \
+ cvPointFrom32f(box_vtx{3}), \
+ cvPointFrom32f(box_vtx{4})};
+ cvCircle( img, cvPointFrom32f(center), cvRound(radius), CV_RGB(255, 255, 0), 1, cv.CV_AA, 0 );
+ cvPolyLine( img, {box_vtx}, 1, CV_RGB(0,255,255), 1, cv.CV_AA );
+ cvClearMemStorage( storage );
+endfunction
+
+img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
+storage = cvCreateMemStorage(0);
+
+cvNamedWindow( "rect & circle", 1 );
+
+use_seq=false;
+
+while (true),
+ count = randint(1,100);
+ if (use_seq)
+ minarea_seq(img, count, storage);
+ else
+ minarea_array(img, count);
+ endif
+
+ cvShowImage("rect & circle", img);
+ key = cvWaitKey();
+ if( key == '\x1b' );
+ break;
+ endif
+
+ use_seq = !use_seq;
+endwhile