雪の結晶を作る

この記事は、SYSKEN Advent Calendar 2022 12月14日の記事です。

はじめに

皆さん初めまして、こんにちは、赤石匠です。
もう少しでクリスマスですね。私はクリスマス当日は予定があって遊ぶことはできませんが、ホワイトクリスマスになるといいですね。
ということで雪の結晶のような模様を描いてみましょう。プログラムで

本題

手順としては、
・どのようにして模様を描くか考える
今回の場合グラフは使わず、□と■を使ってマスを表します。
・どうやって模様を作るか
今回は、数式を使って、模様を描きます。
・プログラム作成
今回は、C++で、プログラムを組みました。マスを全て□で埋め、式で出てきたマスを■に変えていきます。
と、いう順でやっていきました。

今回使う数式はこちらです。

r=sin(nθ/k)

この式のnとkを変えるといろいろな模様ができます。
そして模様を描いてくれるプログラムがこちらです。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int size,n,k;
    cin>>size>>n>>k;
    vector<vector<int>>f(2*size,vector<int>(2*size));
    for(int i=0;2*size>i;i++){
        for(int j=0;2*size>j;j++){
            f.at(i).at(j)=false;
        }
    }
    for(double i=0;360>n*i/k;i+=0.01){
        double r=sin(n*i/k);
        double x=r*cos(i);
        double y=r*sin(i);
        f.at(floor((double)size*y+size)).at(floor((double)size*x+size))=true;
    }
    for(int i=2*size-1;0<=i;i--){
        for(int j=0;2*size>j;j++){
            if(f.at(i).at(j))
            cout<<"■";
            else{cout<<"□";}
        }
        cout<<endl;
    }
}

遊ぶ

このプログラムにサイズ n kの値を打ち込むと

(例1)

10 2 1

このような模様が現れます。
□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□
□□■■■■■□□□□□□■■■■■□□
□□■□□□■■□□□□■■□□□■□□
□□■□□□□■■□□■■□□□□■□□
□□■□□□□□■■■■□□□□□■□□
□□■■□□□□□■■□□□□□■■□□
□□□■■□□□□■■□□□□■■□□□
□□□□■■□□□■■□□□■■□□□□
□□□□□■■■■■■■■■■□□□□□
□□□□□■■■■■■■■■■□□□□□
□□□□■■□□□■■□□□■■□□□□
□□□■■□□□□■■□□□□■■□□□
□□■■□□□□□■■□□□□□■■□□
□□■□□□□□■■■■□□□□□■□□
□□■□□□□■■□□■■□□□□■□□
□□■□□□■■□□□□■■□□□■□□
□□■■■■■□□□□□□■■■■■□□
□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□

「雪の結晶に見えない!」と思う人もいると思います。
そうです。これは花の模様です。雪の結晶のような花の模様です。
なぜ花の模様になったのかは、聞かないでください。 実力不足です。
そんなことはさておき、つぎは、このように打ち込んでみます。

(例2)

20 3 4

これで、プログラムを実行すると、
□□□□□□□□□□□□□□□■■■□□□□■■■□□□□□□□□□□□□□□□
□□□□□□□□□□□■■■■■□■■■■■■□■■■■■□□□□□□□□□□□
□□□□□□□□□■■■□□□□■■■□□■■■□□□□■■■□□□□□□□□□
□□□□□□□□■■□□□□□■■□□□□□□■■□□□□□■■□□□□□□□□
□□□□□□□■■□□□□□■■□□□□□□□□■■□□□□□■■□□□□□□□
□□□□□□■■□□□□□■■□□□□□□□□□□■■□□□□□■■□□□□□□
□□□□□■■□□□□□□■□□□□□□□□□□□□■□□□□□□■■□□□□□
□□□□■■□□□■■■■■■□□□□□□□□□□■■■■■■□□□■■□□□□
□□□□■□■■■■□□■□■■■□□□□□□■■■□■□□■■■■□■□□□□
□□□□■■■□□□□□■□□□■■■□□■■■□□□■□□□□□■■■□□□□
□□□■■□□□□□□□■□□□□□■■■■□□□□□■□□□□□□□■■□□□
□□■■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■■□□
□□■■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■■□□
□■■■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■■■□
□■□■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■□■□
■■□■■□□□□□□□■■□□□□■■■■□□□□■■□□□□□□□■■□■■
■□□□■□□□□■■■■■■■■□■■■■□■■■■■■■■□□□□■□□□■
■□□□■□□■■■□□□■■□■■■■■■■■□■■□□□■■■□□■□□□■
■□□□■■■■□□□□□□■■■□■■■■□■■■□□□□□□■■■■□□□■
■□□□□■■□□□□□□□□□■■■■■■■■□□□□□□□□□■■□□□□■
■□□□□■■□□□□□□□□□■■■■■■■■□□□□□□□□□■■□□□□■
■□□□■■■■□□□□□□■■■□■■■■□■■■□□□□□□■■■■□□□■
■□□□■□□■■■□□□■■□■■■■■■■■□■■□□□■■■□□■□□□■
■□□□■□□□□■■■■■■■■□■■■■□■■■■■■■■□□□□■□□□■
■■□■■□□□□□□□■■□□□□■■■■□□□□■■□□□□□□□■■□■■
□■□■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■□■□
□■■■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■■■□
□□■■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■■□□
□□■■□□□□□□□□■□□□□□□■■□□□□□□■□□□□□□□□■■□□
□□□■■□□□□□□□■□□□□□■■■■□□□□□■□□□□□□□■■□□□
□□□□■■■□□□□□■□□□■■■□□■■■□□□■□□□□□■■■□□□□
□□□□■□■■■■□□■□■■■□□□□□□■■■□■□□■■■■□■□□□□
□□□□■■□□□■■■■■■□□□□□□□□□□■■■■■■□□□■■□□□□
□□□□□■■□□□□□□■□□□□□□□□□□□□■□□□□□□■■□□□□□
□□□□□□■■□□□□□■■□□□□□□□□□□■■□□□□□■■□□□□□□
□□□□□□□■■□□□□□■■□□□□□□□□■■□□□□□■■□□□□□□□
□□□□□□□□■■□□□□□■■□□□□□□■■□□□□□■■□□□□□□□□
□□□□□□□□□■■■□□□□■■■□□■■■□□□□■■■□□□□□□□□□
□□□□□□□□□□□■■■■■□■■■■■■□■■■■■□□□□□□□□□□□
□□□□□□□□□□□□□□□■■■□□□□■■■□□□□□□□□□□□□□□□

なんだか複雑な模様ができましたね。

おわりに

模様を作ろうとしていたときは、グラフにしてやろうとしていたのですが、グラフにするやり方を知らなかったので、正方形をたくさん並べて方眼紙のようにすることができたので、まあまあ、そこそこいいものが作れたのではないでしょうか。

次回のSYSKEN Advent Calendar 2022は12月16日、担当はmaronnです。お楽しみに。


コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください