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