見出し画像

「数学アート」をC++とOpenCVを使って描いてみました

48×45÷2=1080本。。正48角形の対角線の本数です。我が家のチビから、Scratchで書いた、N角形の星「N芒星」を描画するアプリ「星を書く機械 ( https://scratch.mit.edu/projects/419242332/ ) 」での描画アルゴリズムを教えてもらいました。そのアルゴリズムを参考にして、正N角形の対角線を描画するプログラムを、C++で作って描画してみました。これもアートな感じですので、干渉色にしたくなりますね。

211023_47角形の対角線

描画はOpenCVライブラリを使っています。統合開発環境アプリVisual Studio 上でのC++とOpenCVの開発環境の構築については、こちらの動画を参考にしました。動画だと、とても分かりやすいですね。以前ハマった「Path」の設定も、迷わずサクッと出来ました。

●WindowsのVisual C++を利用したOpenCVプログラミング入門
http://www.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/tech0118.html

line関数によるグラフィックの描画は上の「お絵かきプログラミング」の項目を参考にしています。C++のソースコードはこちらです。

#if _DEBUG
#pragma comment(lib, "opencv_world454d.lib") //「454」はOpecCVのバージョン「4.5.4」を表す
#else
#pragma comment(lib, "opencv_world454.lib")  // 同上
#endif

#include <iostream>
#include <math.h>
#include <windows.h>
using namespace std;

#include <opencv2/opencv.hpp>
using namespace cv;

int main(){
   double height = 1024;    //画面サイズ 高さ
   double width = 1920;     //           幅
   double r = height / 2;   //外接円半径
   double xc = width / 2;   //画面中心 X座標 
   double yc = height / 2;  //     Y
   double th = 2 * 3.14159265358979; //360度をラジアンで表す( 2π )
   int n;   //n角形か

   while (true) {  //無限ループ
       cout << "\n何角形にしますか(数字)? ";
       cin >> n;
       Mat img = Mat::zeros(height, width, CV_8UC3);      //画像 cv2.Mat の定義
       circle(img, Point(xc, yc), r, Scalar(255, 0, 0));  //外接円を描く
       for (int k = 1; k < n; k++) {       //始点から時計回りにk個となりの頂点終点とする
           for (int i = 0; i < n; i++) {    //始点は開始点のi個となりとする
               int j = (i + k) % n;
               double xs = r * cos(i * th / n);        //始点X座標
               double ys = r * sin(i * th / n);        //  Y
               double xe = r * cos(j * th / n);        //終点X座標
               double ye = r * sin(j * th / n);        //  Y
               Point2i PS = Point(xc - ys, yc - xs);   //始点のポイント
               Point2i PE = Point(xc - ye, yc - xe);   //終点のポイント
               line(img, PS, PE, Scalar(0, 0, 255));   //始点から終点まで線をひく
           }
       }
       imshow("opencv program", img);
       waitKey();
   }
   return 0;
}

いいなと思ったら応援しよう!