チェック柄画像作成プログラム(3)
ほぼ日常。
土日に参加するイベントないので、時間あるなぁ、と思って、平日はイラスト描くのとTRPGのシナリオを書いていたので、プログラムのほういじろうかな。と思って着手。(ニコ生ゲーのほうはどうした?)
タイトル、チェック柄になっているけど今回はチェック柄ではなく、以前からやりたいと思っていた、装飾の柄作成。
塗りつぶしの丸が段々と大きくなる柄。横でも右下でもあると良いアクセントになる。ただ、自分の手が描くと大きさが不揃いになったり、多くすると時間かかったり。でも繰り返しなのでプログラムのほうが得意です。
え?フリー素材でもアプリでもそんなこと出来るだろう?って?
それはそう。
でも自分で考えるのが好きというか、こういうこと考えることで脳を活性化しているようなものなのでね。あとそういう素材って自分の理想が100%だとすると100%の満点の素材ってなかなかないですからね。
まずバリエーションを考えます。
やりたいのは右下のほうに向かって丸が段々と大きくなる。
丸の密度、色、方向。
密度に関しては、今までのブロック概念を使い回せます。各ブロック内に丸を1つにし、サイズを右下に向かうたびに大きくする。
色に関しては、単色と2色。
方向は、上下左右斜め、と思いますが、画像は反転出来るので横と斜めあれば良いです。が、縦横の比率が1:1とは限らないので、縦、横、斜めにします。
はい、プログラムをVSで開きます。
えーっと、画像処理自体はそれぞれEditに入れているから、これだよな。これをコピーして…
あっ、bmp編集で1ドットずつ色指定していたのだった…
今回は丸を描くということで処理方法が違います。
丸を描くにはBitmapクラスに対してsetなんちゃらだっけ…、んー忘れたな。
こういうときは調べるよりAIだよ。少し前は調べろって感じだったけどね。
>C#でBitmap型で丸を描くコードをつくってください。
GraphicsクラスでdrawEllipseか。そんな感じだったな。
ループはブロック毎だから画像のサイズと入力値のブロックから出します。
ループ1:画像の幅÷ブロック幅の回数
ループ2:画像の高さ÷ブロック幅の回数
で描く位置をオフセットにし、
オフセット1:ループ1のループ数×ブロック幅
オフセット2:ループ2のループ数×ブロック幅
で、座標がオフセット1、オフセット2の位置に丸を描く。
ただ描く丸のサイズはループ数が少ないほど、小さくしたい。
どうするかを考えた結果、ブロックの最後である右下がブロック幅全体で丸になるとするとブロック幅×ループ数/最大ループ数がちょうど良いはず。
こんな感じ。あぁ、drawじゃ塗りつぶしじゃないよね?じゃない、どうしてだ…?ちょこちょこ変えてみても結果変わらず。
うーん??
ん?サイズ?
このfillEllipseに渡しているサイズ、正しいのを確認した。でも描画が違う。
そう、引数の順番。1つ目はブラシだからいいとして、2,3番目に円の大きさ、4,5番目にオフセット、つまり画像を位置を指定している。
これはAIが「中心(100,100)、半径50の丸を描く」のコメントで、"drawEllipse(brush, 50, 50, 100, 100)"を指定していたからそうしたのだが、実際は「50,50の位置から直径100の丸を描く」だったのである。罠かよ。
半径50だから2,3番目がサイズやな。と思い込んでしまいました。
定義をみるとfillEllipse(Brush brush, int x, int y, int width, int height)。つまり2,3番目が座標、4,5番目が幅と高さ。
修正して再度表示。
うまくいったか…?いやなんか丸になってない。
右上と左下が楕円になっている。サイズを「model.HorizontalSize1 * x / wStepCount」、「model.VerticalSize1 * y / hStepCount」にしているがそれだと楕円になるな。真円以外いらないので、サイズは「ブロック幅×ループ1数/最大ループ1数×ループ2数/最大ループ2数」にしてみる。
うん、良さげ。
でもさ、なんか寄ってない?
オフセットを「x * model.HorizontalSize1」、「y * model.VerticalSize1」にしているのでブロック的にいうと、左上に寄る。列で見ると左寄せ、上付き状態。
それでもいいかな…と思いましたが、少しくらいは中央寄せにしたいな…と思い、修正。
丸を描画する位置であるオフセットの位置をさらに「ブロック幅の半分-丸のサイズの半分」の分ずらします。








.png)
コメント
コメントを投稿