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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

Q&A

解決済

3回答

1978閲覧

1次元配列、オートマンセルをつかってチェルピンスキーのギャスゲットを描画したいのですが、、、

bjbjeknr

総合スコア26

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

0グッド

0クリップ

投稿2016/09/04 07:52

###前提・実現したいこと

1次元配列、オートマンセルをつかってチェルピンスキーのギャスゲットを描画したいのですが、、、
プログラミングの独学を始めたばっかりで全く分かりません。。。
できれば、ソースコードの例を貼ってほしいのですが、、、
急いでいます。どうかよろしくお願いいたします・・・

配列bを配列aにコピーするとおもうのですが。。。

###該当のソースコード
int[] a = new int[201];

int[] b = new int[201];

int i
void setup() {
size(300, 300);
i = 100;
a[i]=1;
for (i=0; i<200; i++) {
b[i]=0;
}
}
void draw(){

for(i=1; i<200; i++){
if((a[i-1]==1) && (a[i]==1) && (a[i+1]==1)){
b[i]=0;
}
if((a[i-1]==1) && (a[i]==1) && (a[i+1]==0)){
b[i]=1;
}
if((a[i-1]==1) && (a[i]==0) && (a[i+1]==1)){
b[i]=0;
}
if((a[i-1]==1) && (a[i]==0) && (a[i+1]==0)){
b[i]=1;
}
if((a[i-1]==0) && (a[i]==1) && (a[i+1]==1)){
b[i]=1;
}
if((a[i-1]==0) && (a[i]==1) && (a[i+1]==0)){
b[i]=0;
}
if((a[i-1]==0) && (a[i]==0) && (a[i+1]==1)){
b[i]=1;
}
if((a[i-1]==0) && (a[i]==0 ) && (a[i+1]==0)){
b[i]=0;
}
}

}

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

yskz44

2016/09/04 13:26

「描画したい」は、何に描画したいのですか? 何が分からないのかを書いてください。
bjbjeknr

2016/09/05 02:36

processingで実行して、実行画面(実行ボタンを押すと、表示されるアイコン)にチェルピンスキーのギャスゲット(補足:ネットで見るとおそらくルール90と関係がある)を描画したいのです。
退会済みユーザー

退会済みユーザー

2016/09/10 00:30

一次元配列を何を目的に使うかわかりません... セルオートマトンは、再帰関数というものを使うと解釈していいですかね? 詳しくないんで、ごめんなさい... それでOKならソースコードを書いてみますが。
guest

回答3

0

ベストアンサー

オートマンセル→セルオートマトン
チェルピンスキーのギャスゲット→シェルピンスキーのギャスケット
だと思いますが...

あなたのコードはほぼ正しいですが描画に必要なものがいろいろと足りません
なるべくあなたのコードは生かしつつ描画できるようにしてみました

追加変更点

  • 画面全体に描画できるように200から300に変更
  • setup()内でaを初期化する部分を追加
  • 画面の真ん中にかけるようにa[100]のみ1にするところをa[150]のみ1にする形に変更
  • draw()内でaを元に1行だけ描画する部分を追加(毎フレームごとに下にずれます)
  • draw()最後に配列bをaにコピーする処理を追加

bの配列はdraw()の中だけで使い毎回書き換えるため
外側で宣言したり初期化する必要はありませんが
(b[0]とb[300-1]は0を入れる必要があります)
変更部分が多くなるのでそのままにしました

あなたがdraw()の中に書いたコードは「ルール90」に相当するものです
「ルール110」にするとより複雑な図形がかけます(チューリング完全らしいです)

セルオートマトンは2次元にするとライフゲームがつくれます

フラクタル図形を描く時は再帰もよく使われます
これはセルオートマトンとは別の考え方です
腕が上がったら再帰にもチャレンジしてみてください

Processing

1int[] a = new int[300];//201 -> 画面の幅300用意 2int[] b = new int[300];//201 -> 画面の幅300用意 3 4int i ;//セミコロンが抜けてたので追加 5void setup() { 6 size(300, 300); 7 background(255);//背景を白にする 8 9 //配列aを初期化するfor文を追加 10 for (i=0; i<300; i++) {//200 -> 300に変更 11 a[i]=0; 12 } 13 14 i = 150;//100 -> 150に変更 15 a[i]=1; 16 17 for (i=0; i<300; i++) {//200 -> 300に変更 18 b[i]=0; 19 } 20} 21 22void draw() { 23 24 //描画するためのfor文を追加 25 //loadPixels()とupdatePixels関数を使っても良いのですが 26 //ここでは分かりやすくするため1ドットの四角を書いてます 27 28 int yi = frameCount;//frameCountは1から始まりdraw関数が呼ばれるたびに自動的に1ずつ増えます 29 noStroke();//四角を線で囲まない 30 fill(0);//四角を黒で書く 31 for (i=0; i<300; i++) { 32 if(a[i] == 1){//a[i]が1の時だけ四角を描画します 33 rect(i,yi,1,1);//四角を描画する関数 rect(左上頂点のx座標,左上頂点のy座標,横幅,縦幅) です 34 } 35 } 36 37 for (i=1; i<300-1; i++) {//200 -> 300-1に変更(-1がついてるのは300だとi+1が300となった時エラーが出るため) 38 if ((a[i-1]==1) && (a[i]==1) && (a[i+1]==1)) { 39 b[i]=0; 40 } 41 if ((a[i-1]==1) && (a[i]==1) && (a[i+1]==0)) { 42 b[i]=1; 43 } 44 if ((a[i-1]==1) && (a[i]==0) && (a[i+1]==1)) { 45 b[i]=0; 46 } 47 if ((a[i-1]==1) && (a[i]==0) && (a[i+1]==0)) { 48 b[i]=1; 49 } 50 if ((a[i-1]==0) && (a[i]==1) && (a[i+1]==1)) { 51 b[i]=1; 52 } 53 if ((a[i-1]==0) && (a[i]==1) && (a[i+1]==0)) { 54 b[i]=0; 55 } 56 if ((a[i-1]==0) && (a[i]==0) && (a[i+1]==1)) { 57 b[i]=1; 58 } 59 if ((a[i-1]==0) && (a[i]==0 ) && (a[i+1]==0)) { 60 b[i]=0; 61 } 62 } 63 64 //for文を使って配列bの値をすべてaにコピーします 65 for (i=0; i<300; i++) { 66 a[i] = b[i]; 67 } 68}

投稿2016/09/10 07:17

e-cube

総合スコア284

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

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

bjbjeknr

2016/09/17 08:08

分かりやすく丁寧な説明ありがとうございました。 とても参考になりました。
e-cube

2016/09/17 11:15

ありがとうございます Processingを楽しんでください
guest

0

コピペして色々いじってみたらわかると思います。
もっと綺麗に書けるところも多々あると思いますが目をつぶってください(笑)

float[] px = new float[3]; float[] py = new float[3]; //三角形の3頂点の座標 float triSize = 150; //大元の三角形の大きさ int n = 6; //繰り返す回数 void setup() { size(300, 300); } void draw() { background(0); stroke(0, 255, 0); noFill(); float cx = width/2; float cy = height/2 + 30; for (int i=0; i<3; i++) { px[i] = cx + triSize * cos(i*PI*2/3 - PI/2); py[i] = cy + triSize * sin(i*PI*2/3 - PI/2); } triangle(px[0], py[0], px[1], py[1], px[2], py[2]); fracTri(n, cx, cy, triSize/2); } //fracTri(残り複製回数、中心x座標、中心y座標、三角形の大きさ) void fracTri(int n, float x, float y, float triSize) { if (n > 0) { for (int i=0; i<3; i++) { px[i] = x + triSize * cos(i*PI*2/3 + PI/2); py[i] = y + triSize * sin(i*PI*2/3 + PI/2); } triangle(px[0], py[0], px[1], py[1], px[2], py[2]); for (int i=0; i<3; i++) { float cx = x + triSize * cos(i*PI*2/3 - PI/2); float cy = y + triSize * sin(i*PI*2/3 - PI/2); //次の三角形の中心座標 fracTri(n-1, cx, cy, triSize/2); } } }

投稿2016/09/10 01:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bjbjeknr

2016/09/17 08:09

ありがとうございました。 とても参考になりました。
guest

0

オートマトンではありませんが、フラクタル図形を描画するプログラムが掲載されています。
[http://qiita.com/kiuyas/items/dee169b7fea69519a18d]

投稿2016/09/08 16:12

yskz44

総合スコア100

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問