エンジニア端くれ。

それに所属してはいるが、末に連なるつまらぬ者。末輩。

Processing 収縮拡大する円

やりたかったこと

動きがあるクラスを作って描画をする。

描画するもの

円クラスを使って、複数個の円に同じ動きをつける。

動き

  • 広がる/縮む
  • 移動する

インスタンス化した円が広がったり、移動したりする。

f:id:daigakuinnsei:20180708180733g:plain

コード

Circle c1,c2,c3,c4,c5,c6;    //decalation
int clr_back = 255;          //color of background. 255 = white

void setup(){
  size(400,400);
  smooth();
  background(clr_back);
  frameRate(50);
  
  c1 = new Circle();        //making 6 instances
  c2 = new Circle();
  c3 = new Circle();
  c4 = new Circle();
  c5 = new Circle();
  c6 = new Circle();
}


void draw(){
 c1.updateMe(255,0,0);    //calling 6 the method of the instance
 c2.updateMe(0,255,0);
 c3.updateMe(0,0,255);  
 c4.updateMe(255,255,0);
 c5.updateMe(0,255,255);
 c6.updateMe(255,0,255);  
}


class Circle {
  float clr_r,clr_g,clr_b;    //for color
  float x, y;                 //for axis
  float radius;
  int rad;      
 
  Circle () {
    x = random(width);
    y = random(height); 
    rad = 10;
  }
  
  void updateMe(float clr_r,float clr_g,float clr_b){
    noStroke();
    fill(clr_back);                                //paint it white the ellipse before writing
    ellipse(x, y, radius * 1.05, radius * 1.05);
    radius = abs(sq(sin(radians(rad)))) * 200;    //caliculate next radius
    rad = rad + 1;                                //caliculate next radian
    if(rad == 170){                               //return the radian
      rad = 10;
      x = random(width);                          //remove
      y = random(height);
      background(clr_back);
    }
    fill(clr_r,clr_g,clr_b);
    ellipse(x, y, radius, radius);                //paint the ellipse       
  }
}

ソースの流れ

  1. setup(ウィンドウやインスタンスの作成)
  2. draw(インスタンスをアップデートし描画する)
  3. その他(Circleクラスの作成)

個人的ポイント

  • abs(sq(sin(radians(rad)))) * 半径

sinの2乗を円の半径にかけることで、円の収縮動作が弾むようになる。

[普及版]ジェネラティブ・アート―Processingによる実践ガイド

Python __init__ コンストラクタ

コンストラクタ

コンストラクタは、インスタンスを作成したときに実行されるメソッド。
実際にインスタンスを作成したときに、その内容が実施されているかどうかを確かめてみる。

#main_1-1.py
class Parent():
	def __init__(self):
		print("こっちはインスタンスのprint")
	def PrintInfo(self):
		print("こっちはPrintInfoメソッド,print")

	
TEST = Parent()	
TEST.PrintInfo()		

'''
[実行結果]
こっちはインスタンスのprint
こっちはPrintInfoメソッド,print
'''

説明

インスタンスの作成文以外には
TEST.PrintInfo()
の1行しかない。

しかし、出力として
「こっちはインスタンスのprint」
「こっちはPrintInfoメソッド,print」
という具合に2行出力されている。

「こっちはインスタンスのprint」が出力されるのは、インスタンス作成時に
"__init__"がコンストラクタとして動作し、def内のprintが実行されているためである。

このようにコンストラクタはインスタンス作成時に動作する。

このコンストラクタを使って、インスタンスを作成したとき、そのインスタンスの初期値(引数)を設定する。

#main_1-2
class Parent():
	def __init__(self,txt1):
		self.txt1 = txt1
		print(str(txt1))

TEST = Parent("コンストラクタ!")	

'''
[実行結果]
コンストラクタ!
'''

入門 Python 3

python クラスの継承 オーバーライド

説明の前に

下記のプログラムだと、親であるParentクラスと子であるChildクラスは同じである。

#親クラス
class Parent():
	def PrintGreeting(self):
		print("どうもこんにちは。")
	def PrintWho(self):
		print("わたしは親です")
	
#子クラス
class Child(Parent):
	pass

オーバライド

子クラス独自の出力をさせるため、PrintWhoメソッドを書き換えて、表示する内容を変えてみる。
これを【オーバーライド】という。

下記の例では、オーバライドでPrintWhoメソッドを変更した後に表示結果を確認し、PrintWhoメソッドが書き換わっていることを確認する。

#main_1-1.py
#親クラス
class Parent():
	def PrintGreeting(self):
		print("どうもこんにちは。")
	def PrintWho(self):
		print("わたしは親です。")
	
#子クラス
class Child(Parent):
	def PrintWho(self):			#←オーバライド
		print("ぼくはこどもです。親ではありません。")
	
suzuki_ichiro = Parent()		#親クラスのオブジェクト
suzuki_taro = Child()			#子クラスのオブジェクト

#内容確認
print("suzuki_ichiro.PrintGreeting():実行結果")
suzuki_ichiro.PrintGreeting()
print("suzuki_ichiro.PrintWho():実行結果")
suzuki_ichiro.PrintWho()	
print("suzuki_taro.PrintGreeting():実行結果")
suzuki_taro.PrintGreeting()	
print("suzuki_taro.PrintWho():実行結果")
suzuki_taro.PrintWho()			#オーバーライドした個所の確認

'''	
【実行結果】
suzuki_ichiro.PrintGreeting():実行結果
どうもこんにちは。
suzuki_ichiro.PrintWho():実行結果
わたしは親です。
suzuki_taro.PrintGreeting():実行結果
どうもこんにちは。
suzuki_taro.PrintWho():実行結果
ぼくはこどもです。親ではありません。
'''


上記の結果から、子クラスでPrintWhoメソッドを書き換えができていることがわかる。
また、オーバライドを行っていないPrintGreetingメソッドは、親メソッドのものと変わっていない。

入門 Python 3