質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

1021閲覧

国旗を幾何変換を用いて描く

Chuchuchu

総合スコア16

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2018/05/18 09:44

編集2018/05/20 07:56

今回質問させていただくのは中国の国旗を幾何変換を用いてどのように描くことが出来るのかについてです。この国旗の左上の星部分の集まりを幾何変換で描くことが可能みたいですがやり方が思い浮かびません。一応普通に描くだけのコードは書けたのですがもう少し工夫したものを作りたいと思い質問させていただきました。(コードはアメリカ合衆国の国旗を作りましたが中国も同じような作り方で作成することはできます)

Processing

1size(1900,1000); 2int i,j; 3background(255,255,255); 4smooth(); 5 6noStroke(); 7 8fill(60,59,110); 9rect(0,0,760,538.5); 10 11fill(178,34,52); 12for(i=0;i<4;i++){ //4Line 13 rect(760,153.8*i,1140,76.9); 14} 15for(i=4;i<7;i++){ //3Line 16 rect(0,153.8*i,1900,76.9); 17} 18 19fill(255); //WHITE 20 21for(i=0;i<6;i++){ 22 for(j=0;j<5;j++){ 23beginShape(); 24vertex(32*cos(radians(-90))+63.3+126.6*i,32*sin(radians(-90))+53.8+107.6*j); 25vertex(32*cos(radians(144-90))+63.3+126.6*i,32*sin(radians(144-90))+53.8+107.6*j); 26vertex(32*cos(radians(2*144-90))+63.3+126.6*i,32*sin(radians(2*144-90))+53.8+107.6*j); 27vertex(32*cos(radians(3*144-90))+63.3+126.6*i,32*sin(radians(3*144-90))+53.8+107.6*j); 28vertex(32*cos(radians(4*144-90))+63.3+126.6*i,32*sin(radians(4*144-90))+53.8+107.6*j); 29endShape(); 30 } 31} 32 33for(i=0;i<5;i++){ 34 for(j=0;j<4;j++){ 35beginShape(); 36vertex(32*cos(radians(-90))+126.6+126.6*i,32*sin(radians(-90))+107.6+107.6*j); 37vertex(32*cos(radians(144-90))+126.6+126.6*i,32*sin(radians(144-90))+107.6+107.6*j); 38vertex(32*cos(radians(2*144-90))+126.6+126.6*i,32*sin(radians(2*144-90))+107.6+107.6*j); 39vertex(32*cos(radians(3*144-90))+126.6+126.6*i,32*sin(radians(3*144-90))+107.6+107.6*j); 40vertex(32*cos(radians(4*144-90))+126.6+126.6*i,32*sin(radians(4*144-90))+107.6+107.6*j); 41endShape(); 42 } 43}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純な図形なので特に無理して幾何変換しなくてもよい気がしますが・・・

それよりもまず先に「同じことを不必要に繰り返している」点をもっとスッキリと書くとよいと思います。
一つの星を書く処理ですが、5つの頂点は非常に規則的に計算できるにもかかわらずわざわざ5行で個別に書いておられますがループにすればよいですよね?
また「星を一つ描く」という小さな単位でも「メソッド」としておくと全体がスッキリします。

java

1// 座標(0, 0)を中心に星を一つ描く 2void drawStar() { 3 beginShape(); 4 for (int v = 0; v < 5; v++) { 5 float x = 32 * cos(radians(v * 144 - 90)); 6 float y = 32 * sin(radians(v * 144 - 90)); 7 vertex(x, y); 8 } 9 endShape(); 10}

上記のメソッドを呼び出すと固定的な座標にしか星を描けないように見えます。しかしこのように単純に座標固定で表現したコードを手軽に「任意の位置、任意の回転、任意の倍率で色々描けるように」する手として座標変換機能が使えます。本件の例では「位置を任意に変える」のに次のように書けます。

java

1// 座標(cx, cy)を中心に星を一つ描く 2void drawStar(float cx, float cy) { 3 pushMatrix(); // 変換マトリックスを退避する 4 translate(cx, cy); // 座標系をcx, cyだけ移動する 5 beginShape(); 6 for (int v = 0; v < 5; v++) { 7 float x = 32 * cos(radians(v * 144 - 90)); 8 float y = 32 * sin(radians(v * 144 - 90)); 9 vertex(x, y); 10 } 11 endShape(); 12 popMatrix(); // 変換マトリックスを元に戻す 13}

これさえ作っておけば、星の中心座標を計算しつつこのメソッドを呼び出せばよいということになります。

投稿2018/05/18 10:29

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/05/18 10:34

あの・・・質問に足りなかった部分があってそれを補足するのはいいですが、内容を変更しすぎないようにお願いします。解答してみたら「タイトルが変わっていた!」なんてことが起きると「アレレ?」と思っちゃいますので。
Chuchuchu

2018/05/20 06:58

失礼しました。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問