<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>Lab.</title>
	<atom:link href="http://ksmda.tmya.name/Lab/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://ksmda.tmya.name/Lab</link>
	<description>ksmda.tmya (パーソナル)ラボラトリー</description>
	<lastBuildDate>Wed, 23 Sep 2009 06:27:36 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/" />
		<item>
		<title>inClip..『Hands On -Prototyping Prototypes』展</title>
		<link>http://ksmda.tmya.name/Lab/?p=776</link>
		<comments>http://ksmda.tmya.name/Lab/?p=776#comments</comments>
		<pubDate>Fri, 18 Sep 2009 16:24:30 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=776</guid>
		<description><![CDATA[今回の「inClip」の仕様

アプリケーション・アイコン・プレート
黒枠のアイコン・プレートで、コンピュータ上のアプリケーションに対応している。デバイスではさむことでの起動と、離すことによる終了を行う。アプリケーション [...]]]></description>
			<content:encoded><![CDATA[<p>今回の「inClip」の仕様</p>
<ul>
<li>アプリケーション・アイコン・プレート<br />
黒枠のアイコン・プレートで、コンピュータ上のアプリケーションに対応している。デバイスではさむことでの起動と、離すことによる終了を行う。アプリケーション・ランチャー</li>
<li>ファイル・アイコン・プレート<br />
枠なしの透明なアイコン・プレートで、コンピュータ上のファイルひとつひとつに対応している。デバイスではさむことでファイルの内容に応じてアプリケーションを起動して、コンテンツを表示・再生する。デバイスをプレートから離すとファイルは閉じられる。</li>
</ul>
<p>想定した使用例</p>
<ul>
<li>アプリケーション・アイコン・プレート on Desk (OR, in Room)<br />
アプリケーション・アイコン・プレートに限らず、双方のプレートにねらったものだが、プレートはデスク上や部屋の棚などに置いたり並べたりして生活空間に配置されることを想定した。人が生活の中でその場所にあった（パソコンで扱ってきたような）コンテンツを扱えるようになる。</li>
<li>ファイル・アイコン・プレート with Binder<br />
ファイル・アイコン・プレートはB5変型のバインダーに収納できるようになっている。コンピュータ内にフォルダの階層構造によって管理していたデータファイルを、書類をファイリングするように物理的に整理でき、視覚的にデータファイルを確認できる。一枚のバインダーに１２枚のプレートが収納。</li>
<li>ファイル・アイコン・プレート with Book<br />
ファイル・アイコン・プレートは４隅のうち１点だけをネジ止めしてあり、紙ならばプレートをはさみ止めておくことができる。書籍に関連する動画や、ウェブホームページのブックマークをプレートに登録し、しおりの様に本にはさんでおくことができる。こうすることで本というアナログメディアと動画やブックマークといったデジタルコンテンツを一緒に管理し、いままで通り本棚に本を並べることで、間接的にデータファイルを本棚に整理することができる。</li>
</ul>
<p>展示中にいただいたコメントなどから</p>
<ul>
<li>プレートの使い方として、キーボードにスロットがついていて、それにはめる。プレートが並ぶことでアプリケーションやファイルの状態を俯瞰でき、それらはタンジブルである。</li>
<li>アプリケーション・アイコン・プレートではなく、アプリケーション・アイコン・<span style="color: #ff0000;">クリップ</span>としたらどうか。そのクリップを使って、ディスプレイにはさんでいくことでアプリケーションが立ち上がり、状態を確認できる。また、ファイル・アイコン・プレートをはさむことで、そのファイルをクリップの対応したアプリケーションで開くなど。</li>
<li>カラフルなプレートを使っていることについて、視覚的に好印象を得られた。（化粧品のパレットのよう。きれい。ながめて楽しい。子供は色だけでファイルを識別できるかも。）</li>
<li>同じファイル・アイコン・プレートでも、複数のクリップデバイスではさむことで、開くファイルや挙動が変わるとか。</li>
<li>デジタルデータをプレートに登録する方法。いかに簡単に登録ができるか。</li>
<li>ネットワークと繋がったシステムを考えてみては？</li>
<li>出力装置をコンピュータの画面ではなく、フォトフレームやオーディオセットなどの他の機器で行えるようしたらどうか。</li>
<li>プレート以外のモノへの登録。</li>
<li>クリップデバイスとプレートをはさむ方向の不自然さ。説明なしでは使えないレベル。</li>
<li>クリップデバイススタンド（サイン灯）のサインを説明するボードかなにかしらが必要。</li>
</ul>
<p>次回バージョンアップ</p>
<ul>
<li>プレートへの登録機能を実装（AppleScriptによるドロップレットを使用）<br />
コンピュータのデスクトップ画面上に、ドロップレットを常駐させ、そのアイコンへ登録したいファイルをドロップする。そのときにクリップデバイスがはさんでいるプレートへ登録。</li>
<li>クリップデバイスの再設計</li>
<li>クリップデバイスの充電スタンドの制作</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=776</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=776" />
	</item>
		<item>
		<title>FMC2nd_p56_Blobs01</title>
		<link>http://ksmda.tmya.name/Lab/?p=774</link>
		<comments>http://ksmda.tmya.name/Lab/?p=774#comments</comments>
		<pubDate>Sun, 21 Jun 2009 11:43:59 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=774</guid>
		<description><![CDATA[p56_Blobs01
イメージからアプレットを起動

円が重なると円の外郭が一緒になる表現
FlashでのMovieClipにあたるオブジェクトをクラスで生成するのがポイント。これからこのような書き換えが基本的なメソッ [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p56_Blobs01/"><img alt="p56_Blobs01" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p56_Blobs01/p56_Blobs01.jpg" title="p56_Blobs01" width="400" height="400" /></a><p class="wp-caption-text">p56_Blobs01</p></div><br />
イメージからアプレットを起動</p>
<p>
<strong>円が重なると円の外郭が一緒になる表現</strong><br />
FlashでのMovieClipにあたるオブジェクトをクラスで生成するのがポイント。これからこのような書き換えが基本的なメソッドになると思う。<br />
Flashの方ではMovieClipのインスタンス名によってレイヤーが操作でき、白抜きのための円オブジェクト群を外郭にあたるオブジェクトより上の階層に位置するようにすれば、難しいことは無いサンプルプログラムでした。<br />
Processingでは、フレーム毎にプログラムでは上から順に描画して行くのが一般で、先に描画されたものはそのあとに描画されるものによって上書きされてしまいます。<br />
一つの円ごとに描画すると、外郭がひとつになるのではなく円が単に重なるようになってしまうので、まず、外郭となる円を描画してから、白抜きとなる円を描画するという順番になりました。<br />
難しいと感じたポイントは、クラス設計でContainerとBallとEdgeという３つのクラスを用意したのですが、Containerにどんな役割を持たせるかが難しいところでした。
</p>
<p><a id="more-774"></a><br />
クラスをファイルで分けるのを止めてみました。いまいちどちらが良いのが判断のつかないプログラムです。02, 03,..と続けてみて、良くなさそうだったらファイルで分けるのに戻そうと思っています。<br />
[java]<br />
int total = 20;</p>
<p>Container container;</p>
<p>void setup(){<br />
  size(400, 400);<br />
  colorMode(HSB, 360, 100, 100, 100);<br />
  ellipseMode(CENTER);<br />
  noStroke();<br />
  smooth();<br />
  frameRate(20);</p>
<p>  background(0, 0, 100);</p>
<p>  container = new Container(width, height);</p>
<p>}</p>
<p>void draw(){<br />
  background(0, 0, 100);<br />
  container.bdraw();<br />
}</p>
<p>class Container{<br />
  //property<br />
  int canvasWidth, canvasHeight;<br />
  float leftBounds, rightBounds;</p>
<p>  Ball[] ball;<br />
  Edge[] edge;<br />
  int ballSize = 98;<br />
  int edgeSize = 100;<br />
  float posX, posY;<br />
  float vx, vy;</p>
<p>  //constructor<br />
  Container(int canvasWidth, int canvasHeight){<br />
    this.canvasWidth = canvasWidth;<br />
    this.canvasHeight = canvasHeight;<br />
    leftBounds = -edgeSize;<br />
    rightBounds = edgeSize + canvasWidth;</p>
<p>    ball = new Ball[total];<br />
    edge = new Edge[total];<br />
    for(int i=0; i<total; i++){<br />
      posX = random(0, canvasWidth/2);<br />
      posY = random(0, canvasHeight/2) + canvasHeight/4;<br />
      vx = random(0, 60);</p>
<p>      ball[i] = new Ball(ballSize, posX, posY);<br />
      ball[i].setVelocity(vx, 0);<br />
      edge[i] = new Edge(edgeSize, posX, posY);<br />
    }<br />
  }</p>
<p>  //method<br />
  void bdraw(){<br />
    for(int i=0; i<total; i++){<br />
      ball[i].posX += ball[i].vx;<br />
      if(ball[i].posX > rightBounds) ball[i].posX = leftBounds;</p>
<p>      edge[i].posX = ball[i].posX;</p>
<p>      ball[i].vx *= 0.8;<br />
      if(ball[i].vx < 0.00001) {<br />
        ball[i].vx = random(0, 60);<br />
      }<br />
    }</p>
<p>    for(int i=0; i<total; i++){<br />
      edge[i].bdraw();<br />
    }<br />
    for(int i=0; i<total; i++){<br />
      ball[i].bdraw();<br />
    }<br />
  }<br />
}</p>
<p>class Ball{<br />
  //property<br />
  int objSize;<br />
  float posX, posY;//position<br />
  float vx, vy;//velocity</p>
<p>  //constructor<br />
  Ball(int objSize, float posX, float posY){<br />
    this.objSize = objSize;<br />
    this.posX = posX;<br />
    this.posY = posY;<br />
  }</p>
<p>  //method<br />
  void setVelocity(float vx, float vy){<br />
    this.vx = vx;<br />
    this.vy = vy;<br />
  }</p>
<p>  void bdraw(){//begin draw<br />
    fill(0, 0, 100);<br />
    ellipse(posX, posY, objSize, objSize);<br />
  }<br />
}</p>
<p>class Edge extends Ball{<br />
  //constructor<br />
  Edge(int objSize, float posX, float posY){<br />
    super(objSize, posX, posY);<br />
  }</p>
<p>  //method<br />
  void bdraw(){<br />
    fill(0, 60, 60);<br />
    ellipse(posX, posY, objSize, objSize);<br />
  }<br />
}</p>
<p>void keyPressed(){<br />
  if(key ==&#8217;q'){<br />
    save(&#8220;p56_Blobs01.jpg&#8221;);<br />
    exit();<br />
  }</p>
<p>}<br />
[/java]
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=774</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=774" />
	</item>
		<item>
		<title>FMC2nd_p43_Lines16</title>
		<link>http://ksmda.tmya.name/Lab/?p=766</link>
		<comments>http://ksmda.tmya.name/Lab/?p=766#comments</comments>
		<pubDate>Mon, 08 Jun 2009 21:45:29 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=766</guid>
		<description><![CDATA[p43_Lines16 イメージからアプレットを起動 Lines12をもとに、線が伸びていくときにアルファ値を設定 ただアルファ値を設定してあげるだけ。 見た目にもあまりおもしろくないので、Lines14の回転も加えた。こっちのがおもしろい。 p43_Lines16.pde [java] int leftBounds = 20; int topBounds = 20; float x = leftBounds; float y = topBounds; int rightBounds = 380; int bottomBounds = 380; int baseMax = 20; int randomMax = 10; int maxLines = 1000; int counter = 0; //int steps = 20; //boolean nextLine = false; [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p43_Lines16/"><img alt="p43_Lines16" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p43_Lines16/p43_Lines16.jpg" title="p43_Lines16" width="400" height="400" /></a><p class="wp-caption-text">p43_Lines16</p></div><br />
イメージからアプレットを起動</p>
<p>
<strong>Lines12をもとに、線が伸びていくときにアルファ値を設定</strong><br />
ただアルファ値を設定してあげるだけ。<br />
見た目にもあまりおもしろくないので、Lines14の回転も加えた。<a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p43_Lines16plus/">こっち</a>のがおもしろい。
</p>
<p><a id="more-766"></a><br />
p43_Lines16.pde<br />
[java]<br />
int leftBounds = 20;<br />
int topBounds = 20;<br />
float x = leftBounds;<br />
float y = topBounds;<br />
int rightBounds = 380;<br />
int bottomBounds = 380;<br />
int baseMax = 20;<br />
int randomMax = 10;<br />
int maxLines = 1000;<br />
int counter = 0;</p>
<p>//int steps = 20;<br />
//boolean nextLine = false;<br />
//int alpha = 0;</p>
<p>Line[] Lines;<br />
//Ellipse[] Ellipses;</p>
<p>void setup(){<br />
  size(400, 400);<br />
  frameRate(30);<br />
  colorMode(HSB, 360, 100, 100);<br />
  background(0, 0, 100);</p>
<p>  Lines = new Line[maxLines];<br />
//  Ellipses = new Ellipse[maxLines];</p>
<p>  strokeWeight(1);<br />
  smooth();<br />
}</p>
<p>void draw(){<br />
  background(0,0,100);</p>
<p>//  if(steps > 20 &#038;&#038; !nextLine) nextLine = true;</p>
<p>  if(counter < maxLines){// &#038;&#038; nextLine){<br />
    float maxDistance = baseMax * random(0, 1) * randomMax;<br />
    float minDistance = 2;<br />
    int direction = random(0, 1) < 0.5 ? -1 : 1;<br />
    float xEnd = x + (direction * (minDistance + ( random(0, 1) * maxDistance)) );<br />
    direction =  random(0, 1) < 0.5 ? -1 : 1;<br />
    float yEnd = y + (direction * (minDistance + ( random(0, 1) * maxDistance)) );</p>
<p>    if(xEnd < leftBounds) xEnd = leftBounds;<br />
    if(xEnd > rightBounds) xEnd = rightBounds;<br />
    if(yEnd < topBounds) yEnd = topBounds;<br />
    if(yEnd > bottomBounds) yEnd = bottomBounds;</p>
<p>    Lines[counter] = new Line(x, y, xEnd, yEnd);</p>
<p>//    Lines[counter].setAlpha(alpha);<br />
//    Ellipses[counter] = new Ellipse(x, y, maxDistance * .2, maxDistance * .2);</p>
<p>    x = xEnd;<br />
    y = yEnd;</p>
<p>//    steps = 0;<br />
//    nextLine = false;</p>
<p>    counter++;<br />
  }<br />
//  steps++;<br />
//  alpha++;<br />
//  if(alpha > 255) alpha = 0;</p>
<p>//  if(counter >= 10 &#038;&#038; counter<maxLines) Lines[counter - 10].disappear();<br />
//  else if(counter > maxLines &#038;&#038; counter < maxLines+10) {<br />
//    Lines[counter-10].disappear();<br />
//  }<br />
//  else if(counter > maxLines+10) noLoop();</p>
<p>  if(counter < maxLines){<br />
    for(int i=0; i<counter &#038;&#038; i < maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
  else{<br />
    for(int i=0; i< maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
}</p>
<p>void keyPressed(){<br />
  if(key == 'r'){<br />
    background(255);<br />
    counter = 0;<br />
    Lines = new Line[maxLines];<br />
//    Ellipses = new Ellipse[maxLines];<br />
  }<br />
  if(key =='q'){<br />
    saveFrame("p43_Lines16.jpg");<br />
    exit();<br />
  }<br />
}<br />
[/java]<br />
Line.pde<br />
[java]<br />
public class Line{<br />
  //member<br />
  float x, y, xEnd, yEnd;<br />
  int alpha;<br />
  int steps;<br />
  float[] scl;<br />
  float r;<br />
  float nowR;<br />
  //constructor<br />
  Line(float x, float y, float xEnd, float yEnd){<br />
    this.x = x;<br />
    this.y = y;<br />
    this.xEnd = xEnd;<br />
    this.yEnd = yEnd;<br />
    alpha = 255;<br />
    steps = 0;<br />
//    r = 2*PI/20;<br />
//    nowR = 0;<br />
//    scl = new float[steps];<br />
//    scl[0] = 0;<br />
//    for(int i=0; i < steps; i++){<br />
//      float pre = 100000/(i+1);<br />
//      scl[i] = pre/100000;<br />
//      println(i+" = "+scl[i]);<br />
//    }<br />
  }<br />
  //method<br />
  void setAlpha(int alpha){<br />
    this.alpha = alpha;<br />
    bdraw();<br />
  }</p>
<p>  void bdraw(){<br />
//    stroke(0, alpha);<br />
//    if(steps > 0){<br />
    if(steps < 20){<br />
      pushMatrix();<br />
      translate(x, y);<br />
//      scale(scl[steps-1]);<br />
//      line(0, 0, (xEnd &#8211; x)/steps, (yEnd &#8211; y)/steps);<br />
//      nowR += r;<br />
//      rotate(nowR);<br />
      stroke(0, 255/20 * steps);<br />
      line(0, 0, ((xEnd &#8211; x)/20)*steps, ((yEnd &#8211; y)/20)*steps);<br />
      popMatrix();<br />
//      steps&#8211;;<br />
      steps++;<br />
    }<br />
    else {<br />
      stroke(0, alpha);<br />
      line(x, y, xEnd, yEnd);<br />
    }</p>
<p>  }</p>
<p>  void disappear(){<br />
    x = y = xEnd = yEnd = 1000;<br />
    bdraw();<br />
  }<br />
}<br />
[/java]
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=766</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=766" />
	</item>
		<item>
		<title>FMC2nd_p43_Lines14</title>
		<link>http://ksmda.tmya.name/Lab/?p=764</link>
		<comments>http://ksmda.tmya.name/Lab/?p=764#comments</comments>
		<pubDate>Mon, 08 Jun 2009 21:35:22 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=764</guid>
		<description><![CDATA[p43_Lines14 イメージからアプレットを起動 Lines13を元に、線が延びていく時に回転。 Lines13のメインはそのまま、再びLines.pde（クラス）の変更。 Lines.pde（クラス） [java] public class Line{ //member float x, y, xEnd, yEnd; int alpha; int steps; float[] scl; float r; float nowR; //constructor Line(float x, float y, float xEnd, float yEnd){ this.x = x; this.y = y; this.xEnd = xEnd; this.yEnd = yEnd; alpha = 255; steps = 0; r = 2*PI/20; [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p43_Lines14/"><img alt="p43_Lines14" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p43_Lines14/p43_Lines14.jpg" title="p43_Lines14" width="400" height="400" /></a><p class="wp-caption-text">p43_Lines14</p></div><br />
イメージからアプレットを起動</p>
<p>
<strong>Lines13を元に、線が延びていく時に回転。</strong><br />
Lines13のメインはそのまま、再びLines.pde（クラス）の変更。
</p>
<p><a id="more-764"></a><br />
Lines.pde（クラス）<br />
[java]<br />
public class Line{<br />
  //member<br />
  float x, y, xEnd, yEnd;<br />
  int alpha;<br />
  int steps;<br />
  float[] scl;<br />
  float r;<br />
  float nowR;<br />
  //constructor<br />
  Line(float x, float y, float xEnd, float yEnd){<br />
    this.x = x;<br />
    this.y = y;<br />
    this.xEnd = xEnd;<br />
    this.yEnd = yEnd;<br />
    alpha = 255;<br />
    steps = 0;<br />
    r = 2*PI/20;<br />
    nowR = 0;<br />
//    scl = new float[steps];<br />
//    scl[0] = 0;<br />
//    for(int i=0; i < steps; i++){<br />
//      float pre = 100000/(i+1);<br />
//      scl[i] = pre/100000;<br />
//      println(i+" = "+scl[i]);<br />
//    }<br />
  }<br />
  //method<br />
  void setAlpha(int alpha){<br />
    this.alpha = alpha;<br />
    bdraw();<br />
  }</p>
<p>  void bdraw(){<br />
    stroke(0, alpha);<br />
//    if(steps > 0){<br />
    if(steps < 20){<br />
      pushMatrix();<br />
      translate(x, y);<br />
//      scale(scl[steps-1]);<br />
//      line(0, 0, (xEnd &#8211; x)/steps, (yEnd &#8211; y)/steps);<br />
      nowR += r;<br />
      rotate(nowR);<br />
      line(0, 0, ((xEnd &#8211; x)/20)*steps, ((yEnd &#8211; y)/20)*steps);<br />
      popMatrix();<br />
//      steps&#8211;;<br />
      steps++;<br />
    }<br />
    else line(x, y, xEnd, yEnd);</p>
<p>  }</p>
<p>  void disappear(){<br />
    x = y = xEnd = yEnd = 1000;<br />
    bdraw();<br />
  }<br />
}<br />
[/java]
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=764</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=764" />
	</item>
		<item>
		<title>FMC2nd_p43_Lines13</title>
		<link>http://ksmda.tmya.name/Lab/?p=762</link>
		<comments>http://ksmda.tmya.name/Lab/?p=762#comments</comments>
		<pubDate>Mon, 08 Jun 2009 21:09:38 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=762</guid>
		<description><![CDATA[p43_Lines13 イメージからアプレットを起動 Lines12を元に、線の描画を１本ずつ。 Lines12で変更したLines.pde（クラス）はそのままに、インスタンス化しているメインだけの変更。 [java] int leftBounds = 20; int topBounds = 20; float x = leftBounds; float y = topBounds; int rightBounds = 380; int bottomBounds = 380; int baseMax = 20; int randomMax = 10; int maxLines = 1000; int counter = 0; int steps = 20; boolean nextLine = false; //int alpha [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p43_Lines13/"><img alt="p43_Lines13" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p43_Lines13/p43_Lines13.jpg" title="p43_Lines13" width="400" height="400" /></a><p class="wp-caption-text">p43_Lines13</p></div><br />
イメージからアプレットを起動</p>
<p>
<strong>Lines12を元に、線の描画を１本ずつ。</strong><br />
Lines12で変更したLines.pde（クラス）はそのままに、インスタンス化しているメインだけの変更。
</p>
<p><a id="more-762"></a><br />
[java]<br />
int leftBounds = 20;<br />
int topBounds = 20;<br />
float x = leftBounds;<br />
float y = topBounds;<br />
int rightBounds = 380;<br />
int bottomBounds = 380;<br />
int baseMax = 20;<br />
int randomMax = 10;<br />
int maxLines = 1000;<br />
int counter = 0;</p>
<p>int steps = 20;<br />
boolean nextLine = false;<br />
//int alpha = 0;</p>
<p>Line[] Lines;<br />
//Ellipse[] Ellipses;</p>
<p>void setup(){<br />
  size(400, 400);<br />
//  frameRate(10);<br />
  colorMode(HSB, 360, 100, 100);<br />
  background(0, 0, 100);</p>
<p>  Lines = new Line[maxLines];<br />
//  Ellipses = new Ellipse[maxLines];</p>
<p>  strokeWeight(1);<br />
  smooth();<br />
}</p>
<p>void draw(){<br />
  background(0,0,100);</p>
<p>  if(steps > 20 &#038;&#038; !nextLine) nextLine = true;</p>
<p>  if(counter < maxLines &#038;&#038; nextLine){<br />
    float maxDistance = baseMax * random(0, 1) * randomMax;<br />
    float minDistance = 2;<br />
    int direction = random(0, 1) < 0.5 ? -1 : 1;<br />
    float xEnd = x + (direction * (minDistance + ( random(0, 1) * maxDistance)) );<br />
    direction =  random(0, 1) < 0.5 ? -1 : 1;<br />
    float yEnd = y + (direction * (minDistance + ( random(0, 1) * maxDistance)) );</p>
<p>    if(xEnd < leftBounds) xEnd = leftBounds;<br />
    if(xEnd > rightBounds) xEnd = rightBounds;<br />
    if(yEnd < topBounds) yEnd = topBounds;<br />
    if(yEnd > bottomBounds) yEnd = bottomBounds;</p>
<p>    Lines[counter] = new Line(x, y, xEnd, yEnd);</p>
<p>//    Lines[counter].setAlpha(alpha);<br />
//    Ellipses[counter] = new Ellipse(x, y, maxDistance * .2, maxDistance * .2);</p>
<p>    x = xEnd;<br />
    y = yEnd;</p>
<p>    steps = 0;<br />
    nextLine = false;</p>
<p>    counter++;<br />
  }<br />
  steps++;<br />
//  alpha++;<br />
//  if(alpha > 255) alpha = 0;</p>
<p>//  if(counter >= 10 &#038;&#038; counter<maxLines) Lines[counter - 10].disappear();<br />
//  else if(counter > maxLines &#038;&#038; counter < maxLines+10) {<br />
//    Lines[counter-10].disappear();<br />
//  }<br />
//  else if(counter > maxLines+10) noLoop();</p>
<p>  if(counter < maxLines){<br />
    for(int i=0; i<counter &#038;&#038; i < maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
  else{<br />
    for(int i=0; i< maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
}</p>
<p>void keyPressed(){<br />
  if(key == &#8216;r&#8217;){<br />
    background(255);<br />
    counter = 0;<br />
    Lines = new Line[maxLines];<br />
//    Ellipses = new Ellipse[maxLines];<br />
  }<br />
  if(key ==&#8217;q'){<br />
    saveFrame(&#8220;p43_Lines13.jpg&#8221;);<br />
    exit();<br />
  }<br />
}<br />
[/java]
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=762</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=762" />
	</item>
		<item>
		<title>FMC2nd_p42_LInes12</title>
		<link>http://ksmda.tmya.name/Lab/?p=760</link>
		<comments>http://ksmda.tmya.name/Lab/?p=760#comments</comments>
		<pubDate>Mon, 08 Jun 2009 21:02:53 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=760</guid>
		<description><![CDATA[p42_Lines12
イメージからアプレットを起動

Lines11を元に、線が伸びる様子を一定にする。
Lines11では加速度的に線が延びていたが、その速度を一定に変更。
コードはLine.pde（クラス）のみ変更 [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p42_Lines12/"><img alt="p42_Lines12" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p42_Lines12/p42_Lines12.jpg" title="p42_Lines12" width="400" height="400" /></a><p class="wp-caption-text">p42_Lines12</p></div><br />
イメージからアプレットを起動</p>
<p>
<strong>Lines11を元に、線が伸びる様子を一定にする。</strong><br />
Lines11では加速度的に線が延びていたが、その速度を一定に変更。<br />
コードはLine.pde（クラス）のみ変更したので、そちらだけ記述することにする。
</p>
<p><a id="more-760"></a><br />
Line.pde<br />
[java]<br />
public class Line{<br />
  //member<br />
  float x, y, xEnd, yEnd;<br />
  int alpha;<br />
  int steps;<br />
  float[] scl;<br />
  //constructor<br />
  Line(float x, float y, float xEnd, float yEnd){<br />
    this.x = x;<br />
    this.y = y;<br />
    this.xEnd = xEnd;<br />
    this.yEnd = yEnd;<br />
    alpha = 255;<br />
    steps = 0;<br />
//    scl = new float[steps];<br />
//    scl[0] = 0;<br />
//    for(int i=0; i < steps; i++){<br />
//      float pre = 100000/(i+1);<br />
//      scl[i] = pre/100000;<br />
//      println(i+" = "+scl[i]);<br />
//    }<br />
  }<br />
  //method<br />
  void setAlpha(int alpha){<br />
    this.alpha = alpha;<br />
    bdraw();<br />
  }</p>
<p>  void bdraw(){<br />
    stroke(0, alpha);<br />
//    if(steps > 0){<br />
    if(steps < 20){<br />
      pushMatrix();<br />
      translate(x, y);<br />
//      scale(scl[steps-1]);<br />
//      line(0, 0, (xEnd &#8211; x)/steps, (yEnd &#8211; y)/steps);<br />
      line(0, 0, ((xEnd &#8211; x)/20)*steps, ((yEnd &#8211; y)/20)*steps);<br />
      popMatrix();<br />
//      steps&#8211;;<br />
      steps++;<br />
    }<br />
    else line(x, y, xEnd, yEnd);</p>
<p>  }</p>
<p>  void disappear(){<br />
    x = y = xEnd = yEnd = 1000;<br />
    bdraw();<br />
  }<br />
}<br />
[/java]
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=760</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=760" />
	</item>
		<item>
		<title>FMC2nd_p42_Lines11</title>
		<link>http://ksmda.tmya.name/Lab/?p=758</link>
		<comments>http://ksmda.tmya.name/Lab/?p=758#comments</comments>
		<pubDate>Mon, 08 Jun 2009 20:51:18 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=758</guid>
		<description><![CDATA[p42_Lines11
イメージからアプレットを起動
Lines01を元に、線を伸びていくように描画
FlashのコードではMovieClip._xscale （_yscale）を使ったプロパティの変更だけでコードの書き [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p42_Lines11/"><img alt="p42_Lines11" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p42_Lines11/p42_Lines11.jpg" title="p42_Lines11" width="400" height="400" /></a><p class="wp-caption-text">p42_Lines11</p></div><br />
イメージからアプレットを起動</p>
<p><strong>Lines01を元に、線を伸びていくように描画</strong><br />
FlashのコードではMovieClip._xscale （_yscale）を使ったプロパティの変更だけでコードの書き替えは完了であったが、ProcessingではMovieClipオブジェクトから存在しないので、Lines05などで行ったLineのクラス作成とインスタンス化、さらにそれらに対して、scale()を使ってサイズの変更と、スケール変更に伴う座標位置の調整をpushMatrix()、popMatrix()とtranslate()で行った。<br />
僕自身が座標の扱いに慣れていないため、書いてみれば簡素なコードに気づくまで時間がかかってしまった。<br />
今回のポイントは、Line.pde内に集約されているといっても過言でないと思う。
</p>
<p><a id="more-758"></a><br />
p42_Lines11.pde<br />
[java]<br />
int leftBounds = 20;<br />
int topBounds = 20;<br />
float x = leftBounds;<br />
float y = topBounds;<br />
int rightBounds = 380;<br />
int bottomBounds = 380;<br />
int baseMax = 20;<br />
int randomMax = 10;<br />
int maxLines = 1000;<br />
int counter = 0;<br />
//int alpha = 0;</p>
<p>Line[] Lines;<br />
//Ellipse[] Ellipses;</p>
<p>void setup(){<br />
  size(400, 400);<br />
  frameRate(10);<br />
  colorMode(HSB, 360, 100, 100);<br />
  background(0, 0, 100);</p>
<p>  Lines = new Line[maxLines];<br />
//  Ellipses = new Ellipse[maxLines];</p>
<p>  strokeWeight(1);<br />
  smooth();<br />
}</p>
<p>void draw(){<br />
  background(0,0,100);<br />
  if(counter < maxLines){<br />
    float maxDistance = baseMax * random(0, 1) * randomMax;<br />
    float minDistance = 2;<br />
    int direction = random(0, 1) < 0.5 ? -1 : 1;<br />
    float xEnd = x + (direction * (minDistance + ( random(0, 1) * maxDistance)) );<br />
    direction =  random(0, 1) < 0.5 ? -1 : 1;<br />
    float yEnd = y + (direction * (minDistance + ( random(0, 1) * maxDistance)) );</p>
<p>    if(xEnd < leftBounds) xEnd = leftBounds;<br />
    if(xEnd > rightBounds) xEnd = rightBounds;<br />
    if(yEnd < topBounds) yEnd = topBounds;<br />
    if(yEnd > bottomBounds) yEnd = bottomBounds;</p>
<p>    Lines[counter] = new Line(x, y, xEnd, yEnd);</p>
<p>//    Lines[counter].setAlpha(alpha);<br />
//    Ellipses[counter] = new Ellipse(x, y, maxDistance * .2, maxDistance * .2);</p>
<p>    x = xEnd;<br />
    y = yEnd;</p>
<p>  }<br />
  counter++;<br />
//  alpha++;<br />
//  if(alpha > 255) alpha = 0;</p>
<p>//  if(counter >= 10 &#038;&#038; counter<maxLines) Lines[counter - 10].disappear();<br />
//  else if(counter > maxLines &#038;&#038; counter < maxLines+10) {<br />
//    Lines[counter-10].disappear();<br />
//  }<br />
//  else if(counter > maxLines+10) noLoop();</p>
<p>  if(counter < maxLines){<br />
    for(int i=0; i<counter &#038;&#038; i < maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
  else{<br />
    for(int i=0; i< maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
}</p>
<p>void keyPressed(){<br />
  if(key == 'r'){<br />
    background(255);<br />
    counter = 0;<br />
    Lines = new Line[maxLines];<br />
//    Ellipses = new Ellipse[maxLines];<br />
  }<br />
  if(key =='q'){<br />
    saveFrame("p42_Lines11.jpg");<br />
    exit();<br />
  }<br />
}<br />
[/java]
<p>Lines.pde<br />
[java]<br />
public class Line{<br />
  //member<br />
  float x, y, xEnd, yEnd;<br />
  int alpha;<br />
  int steps;<br />
  float[] scl;<br />
  //constructor<br />
  Line(float x, float y, float xEnd, float yEnd){<br />
    this.x = x;<br />
    this.y = y;<br />
    this.xEnd = xEnd;<br />
    this.yEnd = yEnd;<br />
    alpha = 255;<br />
    steps = 20;<br />
    scl = new float[steps];<br />
    scl[0] = 0;<br />
    for(int i=0; i < steps; i++){<br />
      float pre = 100000/(i+1);<br />
      scl[i] = pre/100000;<br />
//      println(i+" = "+scl[i]);<br />
    }<br />
  }<br />
  //method<br />
  void setAlpha(int alpha){<br />
    this.alpha = alpha;<br />
    bdraw();<br />
  }</p>
<p>  void bdraw(){<br />
    stroke(0, alpha);<br />
    if(steps > 0){<br />
      pushMatrix();<br />
      translate(x, y);<br />
      scale(scl[steps-1]);<br />
      line(0, 0, xEnd &#8211; x, yEnd &#8211; y);<br />
      popMatrix();<br />
      steps&#8211;;<br />
    }<br />
    else<br />
    line(x, y, xEnd, yEnd);<br />
  }</p>
<p>  void disappear(){<br />
    x = y = xEnd = yEnd = 1000;<br />
    bdraw();<br />
  }<br />
}<br />
[/java]</p>
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=758</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=758" />
	</item>
		<item>
		<title>FMC2nd_p41_Lines10</title>
		<link>http://ksmda.tmya.name/Lab/?p=754</link>
		<comments>http://ksmda.tmya.name/Lab/?p=754#comments</comments>
		<pubDate>Sat, 06 Jun 2009 06:51:53 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=754</guid>
		<description><![CDATA[p41_Lines10 イメージからアプレットを起動 [java] int leftBounds = 20; int topBounds = 20; float x = 200; float y = 200; int rightBounds = 380; int bottomBounds = 380; int baseMax = 4; int randomMax = 4; int maxLines = 2000; int counter = 0; void setup(){ size(400, 400); colorMode(HSB, 360, 100, 100); background(0,0,100); strokeWeight(1); smooth(); } [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines10/"><img alt="p41_Lines10" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines10/p41_Lines10.jpg" title="p41_Lines10" width="400" height="400" /></a><p class="wp-caption-text">p41_Lines10</p></div><br />
イメージからアプレットを起動<br />
<a id="more-754"></a><br />
[java]<br />
int leftBounds = 20;<br />
int topBounds = 20;<br />
float x = 200;<br />
float y = 200;<br />
int rightBounds = 380;<br />
int bottomBounds = 380;<br />
int baseMax = 4;<br />
int randomMax = 4;<br />
int maxLines = 2000;<br />
int counter = 0;</p>
<p>void setup(){<br />
  size(400, 400);<br />
  colorMode(HSB, 360, 100, 100);<br />
  background(0,0,100);</p>
<p>  strokeWeight(1);<br />
  smooth();<br />
}</p>
<p>void draw(){<br />
  if(counter < maxLines){<br />
    int maxDistance = baseMax * int(random(0, 1) * randomMax);<br />
    int minDistance = 2;<br />
    int direction = random(0, 1) < 0.5 ? -1 : 1;<br />
    float xEnd = x + (cos(counter*0.1) * maxDistance );<br />
    direction =  random(0, 1) < 0.5 ? -1 : 1;<br />
    float yEnd = y + (sin(counter*0.1) * maxDistance );</p>
<p>    if(xEnd < leftBounds) xEnd = leftBounds;<br />
    if(xEnd > rightBounds) xEnd = rightBounds;<br />
    if(yEnd < topBounds) yEnd = topBounds;<br />
    if(yEnd > bottomBounds) yEnd = bottomBounds;</p>
<p>    line(x, y, xEnd, yEnd);<br />
    x = xEnd;<br />
    y = yEnd;<br />
    counter++;<br />
  }<br />
  else noLoop();<br />
}</p>
<p>void keyPressed(){<br />
  if(key == &#8216;r&#8217;){<br />
    loop();<br />
    background(0, 0, 100);<br />
    counter = 0;<br />
  }<br />
  if(key ==&#8217;q'){<br />
    saveFrame(&#8220;p41_Lines10.jpg&#8221;);<br />
    exit();<br />
  }<br />
}<br />
[/java]
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=754</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=754" />
	</item>
		<item>
		<title>FMC2nd_p41_Lines09</title>
		<link>http://ksmda.tmya.name/Lab/?p=741</link>
		<comments>http://ksmda.tmya.name/Lab/?p=741#comments</comments>
		<pubDate>Fri, 05 Jun 2009 03:25:06 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=741</guid>
		<description><![CDATA[p41_Lines09
イメージからアプレットを起動

描画され回転する画面と、それをマスクした表現。の再現
マスクの方法はp41_Lines08と同じです。用意したマスク用外部ファイルはこちら。（真っ白画像。右クリック [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines09/"><img alt="p41_Lines09" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines09/p41_Lines09.jpg" title="p41_Lines09" width="400" height="400" /></a><p class="wp-caption-text">p41_Lines09</p></div><br />
イメージからアプレットを起動</p>
<p>
<strong>描画され回転する画面と、それをマスクした表現。の再現</strong><br />
マスクの方法はp41_Lines08と同じです。<br />用意したマスク用外部ファイルは<a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines09/mask.png" rel='lytebox[fmc2nd_p41_lines09]'>こちら</a>。（真っ白画像。右クリックなどで「リンク先を別名で保存」などでダウンロードしてください。）<br />
しかし、この方法ではrotate()を使って画面を回転させたとき、マスクとなる画像も含めすべて回ってしまうので、レイヤーとしてマスクの下にあるLineだけを回すには、他の処理が必要となった。<br />
その方法は、Lineをオブジェクト化して一本一本にx,yの座標情報を持たせ、そのオブジェクト群の座標をrotate()で更新させていく。さらに一方で「見せかけマスク」となる画像を上書きするときには座標を戻して、常に同じ位置で描画するようpushMatrix()とpopMatrix()を使いました。
</p>
<p><a id="more-741"></a><br />
p41_Lines09.pde（メイン）<br />
[java]<br />
int leftBounds = 20 -200;<br />
int topBounds = 20 -200;<br />
int x = leftBounds;<br />
int y = topBounds;<br />
int rightBounds = 380 -200;<br />
int bottomBounds = 380 -200;<br />
int baseMax = 20;<br />
int randomMax = 10;<br />
int maxLines = 400;<br />
int counter = 0;<br />
int alpha = 20;</p>
<p>Line[] Lines;<br />
//Ellipse[] Ellipses;</p>
<p>PImage myMask;</p>
<p>void setup(){<br />
  size(400, 400);<br />
  colorMode(HSB, 360, 100, 100);<br />
  background(0, 0, 100);</p>
<p>  Lines = new Line[maxLines];<br />
//  Ellipses = new Ellipse[maxLines];</p>
<p>  myMask = loadImage(&#8220;mask.png&#8221;);</p>
<p>  strokeWeight(1);<br />
  smooth();<br />
}</p>
<p>void draw(){<br />
  pushMatrix();<br />
  background(0,0,100);<br />
  if(counter < maxLines){<br />
    int maxDistance = baseMax * floor(random(0, 1) * randomMax);<br />
    int minDistance = 2;<br />
    int direction = random(0, 1) < 0.5 ? -1 : 1;<br />
    int xEnd = x + (direction * (minDistance + int( random(0, 1) * maxDistance)) );<br />
    direction =  random(0, 1) < 0.5 ? -1 : 1;<br />
    int yEnd = y + (direction * (minDistance + int( random(0, 1) * maxDistance)) );</p>
<p>    if(xEnd < leftBounds) xEnd = leftBounds;<br />
    if(xEnd > rightBounds) xEnd = rightBounds;<br />
    if(yEnd < topBounds) yEnd = topBounds;<br />
    if(yEnd > bottomBounds) yEnd = bottomBounds;</p>
<p>    translate(200, 200);<br />
    rotate(counter/PI/360);</p>
<p>    Lines[counter] = new Line(x, y, xEnd, yEnd);<br />
    Lines[counter].setAlpha(alpha);<br />
    Lines[counter].setWeight(maxDistance/20);<br />
//    Ellipses[counter] = new Ellipse(x, y, maxDistance * .2, maxDistance * .2);</p>
<p>    x = xEnd;<br />
    y = yEnd;</p>
<p>  }<br />
  else {<br />
    translate(200, 200);<br />
    rotate(counter/PI/360);<br />
  }<br />
  counter++;<br />
//  alpha++;<br />
//  if(alpha > 100) alpha = 0;</p>
<p>//  if(counter >= 10 &#038;&#038; counter<maxLines) Lines[counter - 10].disappear();<br />
//  else if(counter > maxLines &#038;&#038; counter < maxLines+10) {<br />
//    Lines[counter-10].disappear();<br />
//  }<br />
//  else if(counter > maxLines+10) noLoop();</p>
<p>  if(counter < maxLines){<br />
    for(int i=0; i<counter &#038;&#038; i < maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
  else{<br />
    for(int i=0; i< maxLines; i++){<br />
      Lines[i].bdraw();<br />
//      Ellipses[i].bdraw();<br />
    }<br />
  }<br />
  popMatrix();<br />
  image(myMask, 0, 0);<br />
}</p>
<p>void keyPressed(){<br />
  if(key == &#8216;r&#8217;){<br />
    background(255);<br />
    counter = 0;<br />
    Lines = new Line[maxLines];<br />
//    Ellipses = new Ellipse[maxLines];<br />
  }<br />
  if(key ==&#8217;q'){<br />
    save(&#8220;p41_Lines09.jpg&#8221;);<br />
    exit();<br />
  }</p>
<p>}<br />
[/java]
<p>Line.pde（クラス）<br />
[java]<br />
public class Line{<br />
  //member<br />
  int x, y, xEnd, yEnd;<br />
  color sColor;<br />
  int alpha;<br />
  int sWeight;<br />
  int counter;<br />
  //constructor<br />
  Line(int x, int y, int xEnd, int yEnd){<br />
    this.x = x;<br />
    this.y = y;<br />
    this.xEnd = xEnd;<br />
    this.yEnd = yEnd;<br />
    sColor = #006699;<br />
    alpha = 100;<br />
    sWeight = 10;<br />
  }<br />
  //method<br />
  void setAlpha(int alpha){<br />
    this.alpha = alpha;<br />
//    bdraw();<br />
  }</p>
<p>  void setWeight(int sWeight){<br />
    this.sWeight = sWeight;<br />
//    bdraw();<br />
  }</p>
<p>  void bdraw(){<br />
    stroke(sColor, alpha);<br />
    strokeWeight(sWeight);<br />
    line(x, y, xEnd, yEnd);<br />
  }<br />
  void disappear(){<br />
    x = y = xEnd = yEnd = 1000;<br />
    bdraw();<br />
  }<br />
}<br />
[/java]</p>
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=741</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=741" />
	</item>
		<item>
		<title>FMC2nd_p41_Lines08</title>
		<link>http://ksmda.tmya.name/Lab/?p=739</link>
		<comments>http://ksmda.tmya.name/Lab/?p=739#comments</comments>
		<pubDate>Fri, 05 Jun 2009 03:22:48 +0000</pubDate>
		<dc:creator>ksmda.tmya</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://ksmda.tmya.name/Lab/?p=739</guid>
		<description><![CDATA[p41_Lines08
イメージからアプレットを起動

マスクを利用した描画のサンプル。の再現。
実は、マスクと言っても今回は見せかけです。background()と同色の切り抜き画像を用意し、フレーム毎に描画されたもの [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 410px"><a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines08/"><img alt="p41_Lines08" src="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines08/p41_Lines08.jpg" title="p41_Lines08" width="400" height="400" /></a><p class="wp-caption-text">p41_Lines08</p></div><br />
イメージからアプレットを起動</p>
<p>
<strong>マスクを利用した描画のサンプル。の再現。</strong><br />
実は、マスクと言っても今回は見せかけです。background()と同色の切り抜き画像を用意し、フレーム毎に描画されたものに画像を貼付けて、抜けているように見せているだけです。</p>
<p>
最初は、コード内でマスクとなる画像を生成し、その画像をPImageのmask()を使ってマスクを実現しようとしましたが、それは断念しました。<br />
理由は、コードでマスクとなる画像も生成しようとしたが、円形の画像保存ができず、すべて四角形になってしまう。（その方法がわからなかった。）<br />
次に外部ファイルとして円形の画像を用意しmask()を使った方法を試みたが、 フレーム毎の処理がとても重く現実的でないので断念。mask()の処理は「同じサイズの二つの画像を用意し、マスクとする画像でもう片方の画像を切り抜く」といったもののようだが、今回の場合はline()で描画した画面を一度save()で画像出力し、その画像を読み込んでマスクされる画像とするという手順を試みたため、この手順がよくない原因だと思いました。<br />
ということで最終的に、見せたくない部分を白く塗りつぶすという「見せかけマスク」の方法をとりました。<br />
用意したマスク用外部ファイルは<a href="http://ksmda.tmya.name/Lab/processing/FMC2nd/p41_Lines08/mask.png" rel='lytebox[fmc2nd_p41_lines08]'>こちら</a>。（といっても真っ白なのが表示されるだけですね。万が一使うようだったら右クリックなどで「リンク先を別名で保存」などでダウンロードしてください。）<a id="more-739"></a><br />
[java]<br />
int leftBounds = 20;<br />
int topBounds = 20;<br />
int x = leftBounds;<br />
int y = topBounds;<br />
int rightBounds = 380;<br />
int bottomBounds = 380;<br />
int baseMax = 20;<br />
int randomMax = 10;<br />
int maxLines = 200;<br />
int counter = 0;</p>
<p>PImage myImage, myMask;</p>
<p>void setup(){<br />
  size(400, 400);<br />
  background(255);<br />
  smooth();</p>
<p>  myMask = loadImage(&#8220;mask.png&#8221;);</p>
<p>}</p>
<p>void draw(){<br />
   if(counter < maxLines){<br />
    int maxDistance = baseMax * int(random(0, 1) * randomMax);<br />
    int minDistance = 2;<br />
    int direction = random(0, 1) < 0.5 ? -1 : 1;<br />
    int xEnd = x + (direction * (minDistance + int( random(0, 1) * maxDistance)) );<br />
    direction =  random(0, 1) < 0.5 ? -1 : 1;<br />
    int yEnd = y + (direction * (minDistance + int( random(0, 1) * maxDistance)) );</p>
<p>    if(xEnd < leftBounds) xEnd = leftBounds;<br />
    if(xEnd > rightBounds) xEnd = rightBounds;<br />
    if(yEnd < topBounds) yEnd = topBounds;<br />
    if(yEnd > bottomBounds) yEnd = bottomBounds;</p>
<p>    stroke(#006699, 20);<br />
    strokeWeight(maxDistance/20);<br />
    line(x, y, xEnd, yEnd);<br />
    x = xEnd;<br />
    y = yEnd;</p>
<p>    image(myMask, 0, 0);</p>
<p>    counter++;<br />
  }<br />
//  if(counter == maxLines){<br />
//    save(&#8220;img.png&#8221;);<br />
//    background(255);<br />
//    myImage = loadImage(&#8220;img.png&#8221;);<br />
//    myImage.mask(myMask);<br />
//    image(myImage, 0, 0);<br />
//    noLoop();<br />
//  }<br />
}</p>
<p>void keyPressed(){<br />
  if(key == &#8216;r&#8217;){<br />
    background(255);<br />
    counter = 0;<br />
  }<br />
  if(key ==&#8217;q'){<br />
    save(&#8220;p41_Lines08.jpg&#8221;);<br />
    exit();<br />
  }<br />
}<br />
[/java]
]]></content:encoded>
			<wfw:commentRss>http://ksmda.tmya.name/Lab/?feed=rss2&amp;p=739</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ksmda.tmya.name/Lab/?p=739" />
	</item>
	</channel>
</rss>
