<?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/"
	>

<channel>
	<title>HotCocoa::Graphics &#187; Drawing</title>
	<atom:link href="http://hcg.drtoast.com/category/examples/drawing/feed/" rel="self" type="application/rss+xml" />
	<link>http://hcg.drtoast.com</link>
	<description>A Ruby Library for Bitmap and Vector Graphics on Mac OS X</description>
	<lastBuildDate>Mon, 07 Jun 2010 19:32:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Particles/Flowers</title>
		<link>http://hcg.drtoast.com/particlesflowers/</link>
		<comments>http://hcg.drtoast.com/particlesflowers/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 08:14:32 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Drawing]]></category>
		<category><![CDATA[Examples]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=35</guid>
		<description><![CDATA[
This example uses a system of particles that travel upwards from the bottom of the canvas.  The paths taken by the particles are rendered as stems, and a &#8220;flower&#8221; is drawn at each endpoint.
#!/usr/local/bin/macruby

framework 'cocoa'
require 'rubygems'
require 'hotcocoa/graphics'
include HotCocoa
include Graphics

# initialize canvas
canvas = Canvas.new :type =&#62; :image, :filename =&#62; 'particles.png', :size =&#62; [400,400]
canvas.background(Color.black)

# load images and [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-particles1.png"><img class="size-full wp-image-36 aligncenter" title="drawing-particles1" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-particles1.png" alt="" width="400" height="400" /></a></p>
<p>This example uses a system of particles that travel upwards from the bottom of the canvas.  The paths taken by the particles are rendered as stems, and a &#8220;flower&#8221; is drawn at each endpoint.</p>
<pre><span class="comment">#!/usr/local/bin/macruby</span>

<span class="ident">framework</span> <span class="punct">'</span><span class="string">cocoa</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">hotcocoa/graphics</span><span class="punct">'</span>
<span class="ident">include</span> <span class="constant">HotCocoa</span>
<span class="ident">include</span> <span class="constant">Graphics</span>

<span class="comment"># initialize canvas</span>
<span class="ident">canvas</span> <span class="punct">=</span> <span class="constant">Canvas</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:type</span> <span class="punct">=&gt;</span> <span class="symbol">:image</span><span class="punct">,</span> <span class="symbol">:filename</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">particles.png</span><span class="punct">',</span> <span class="symbol">:size</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="number">400</span><span class="punct">,</span><span class="number">400</span><span class="punct">]</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">background</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">black</span><span class="punct">)</span>

<span class="comment"># load images and grab colors</span>
<span class="ident">img</span> <span class="punct">=</span> <span class="constant">Image</span><span class="punct">.</span><span class="ident">new</span><span class="punct">('</span><span class="string">italy.jpg</span><span class="punct">').</span><span class="ident">saturation</span><span class="punct">(</span><span class="number">1.9</span><span class="punct">)</span>
<span class="ident">redcolors</span> <span class="punct">=</span> <span class="ident">img</span><span class="punct">.</span><span class="ident">colors</span><span class="punct">(</span><span class="number">100</span><span class="punct">)</span>
<span class="ident">img</span> <span class="punct">=</span> <span class="constant">Image</span><span class="punct">.</span><span class="ident">new</span><span class="punct">('</span><span class="string">v2.jpg</span><span class="punct">').</span><span class="ident">saturation</span><span class="punct">(</span><span class="number">1.9</span><span class="punct">)</span>
<span class="ident">bluecolors</span> <span class="punct">=</span> <span class="ident">img</span><span class="punct">.</span><span class="ident">colors</span><span class="punct">(</span><span class="number">100</span><span class="punct">)</span>

<span class="comment"># create flower head shape</span>
<span class="ident">head</span> <span class="punct">=</span> <span class="constant">Path</span><span class="punct">.</span><span class="ident">new</span><span class="punct">.</span><span class="ident">oval</span><span class="punct">(</span><span class="number">0</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">10</span><span class="punct">,</span><span class="number">10</span><span class="punct">,</span><span class="symbol">:center</span><span class="punct">)</span>
<span class="ident">petals</span> <span class="punct">=</span> <span class="number">3</span>
<span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">1</span><span class="punct">..</span><span class="ident">petals</span> <span class="keyword">do</span>
  <span class="ident">head</span><span class="punct">.</span><span class="ident">rotate</span><span class="punct">(</span><span class="number">360</span><span class="punct">/</span><span class="ident">petals</span><span class="punct">)</span>
  <span class="ident">head</span><span class="punct">.</span><span class="ident">oval</span><span class="punct">(</span><span class="number">0</span><span class="punct">,</span><span class="number">10</span><span class="punct">,</span><span class="number">5</span><span class="punct">,</span><span class="number">5</span><span class="punct">,</span><span class="symbol">:center</span><span class="punct">)</span>
  <span class="ident">head</span><span class="punct">.</span><span class="ident">oval</span><span class="punct">(</span><span class="number">0</span><span class="punct">,</span><span class="number">17</span><span class="punct">,</span><span class="number">2</span><span class="punct">,</span><span class="number">2</span><span class="punct">,</span><span class="symbol">:center</span><span class="punct">)</span>
<span class="keyword">end</span>
<span class="comment"># randomize head attributes</span>
<span class="ident">head</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:fill</span><span class="punct">,</span> <span class="ident">redcolors</span>
<span class="ident">head</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:stroke</span><span class="punct">,</span> <span class="ident">bluecolors</span>
<span class="ident">head</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:scale</span><span class="punct">,</span> <span class="number">0.2</span><span class="punct">..</span><span class="number">2.0</span>
<span class="ident">head</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:rotation</span><span class="punct">,</span> <span class="number">0</span><span class="punct">..</span><span class="number">360</span>

<span class="comment"># create particles</span>
<span class="ident">total_particles</span> <span class="punct">=</span> <span class="number">100</span>
<span class="ident">total_iterations</span> <span class="punct">=</span> <span class="number">100</span>
<span class="ident">particles</span> <span class="punct">=</span> <span class="punct">[]</span>
<span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="ident">total_particles</span> <span class="keyword">do</span>
  <span class="comment"># start particle at random point at bottom of canvas</span>
  <span class="ident">x</span> <span class="punct">=</span> <span class="ident">random</span><span class="punct">(</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span><span class="punct">/</span><span class="number">2</span> <span class="punct">-</span> <span class="number">50</span><span class="punct">,</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span><span class="punct">/</span><span class="number">2</span> <span class="punct">+</span> <span class="number">50</span><span class="punct">)</span>
  <span class="ident">p</span> <span class="punct">=</span> <span class="constant">Particle</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="ident">x</span><span class="punct">,</span><span class="number">0</span><span class="punct">)</span>
  <span class="ident">p</span><span class="punct">.</span><span class="ident">velocity_x</span> <span class="punct">=</span> <span class="ident">random</span><span class="punct">(-</span><span class="number">0.5</span><span class="punct">,</span><span class="number">0.5</span><span class="punct">)</span>   <span class="comment"># set initial x velocity</span>
  <span class="ident">p</span><span class="punct">.</span><span class="ident">velocity_y</span> <span class="punct">=</span> <span class="ident">random</span><span class="punct">(</span><span class="number">1.0</span><span class="punct">,</span><span class="number">3.0</span><span class="punct">)</span>    <span class="comment"># set initial y velocity</span>
  <span class="ident">p</span><span class="punct">.</span><span class="ident">acceleration</span> <span class="punct">=</span> <span class="number">0.1</span>            <span class="comment"># set drag or acceleration</span>
  <span class="ident">particles</span><span class="punct">[</span><span class="ident">i</span><span class="punct">]</span> <span class="punct">=</span> <span class="ident">p</span>          <span class="comment"># add particle to array</span>
<span class="keyword">end</span>

<span class="comment"># animate particles</span>
<span class="keyword">for</span> <span class="ident">frame</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="ident">total_iterations</span> <span class="keyword">do</span>
  <span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="ident">total_particles</span> <span class="keyword">do</span>
    <span class="ident">particles</span><span class="punct">[</span><span class="ident">i</span><span class="punct">].</span><span class="ident">move</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>

<span class="comment"># draw particle trails and heads</span>
<span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="ident">total_particles</span> <span class="keyword">do</span>
  <span class="ident">canvas</span><span class="punct">.</span><span class="ident">push</span>
  <span class="comment"># choose a stem color</span>
  <span class="ident">color</span> <span class="punct">=</span> <span class="ident">choose</span><span class="punct">(</span><span class="ident">bluecolors</span><span class="punct">).</span><span class="ident">a</span><span class="punct">(</span><span class="number">0.7</span><span class="punct">).</span><span class="ident">analog</span><span class="punct">(</span><span class="number">20</span><span class="punct">,</span><span class="number">0.7</span><span class="punct">)</span>
  <span class="ident">canvas</span><span class="punct">.</span><span class="ident">stroke</span><span class="punct">(</span><span class="ident">color</span><span class="punct">)</span>
  <span class="ident">canvas</span><span class="punct">.</span><span class="ident">strokewidth</span><span class="punct">(</span><span class="ident">random</span><span class="punct">(</span><span class="number">0.5</span><span class="punct">,</span><span class="number">2.0</span><span class="punct">))</span>
  <span class="comment"># draw the particle</span>
  <span class="ident">particles</span><span class="punct">[</span><span class="ident">i</span><span class="punct">].</span><span class="ident">draw</span><span class="punct">(</span><span class="ident">canvas</span><span class="punct">)</span>
  <span class="comment"># go to the last particle position and draw the flower head</span>
  <span class="ident">canvas</span><span class="punct">.</span><span class="ident">translate</span><span class="punct">(</span><span class="ident">particles</span><span class="punct">[</span><span class="ident">i</span><span class="punct">].</span><span class="ident">points</span><span class="punct">[-</span><span class="number">1</span><span class="punct">][</span><span class="number">0</span><span class="punct">],</span><span class="ident">particles</span><span class="punct">[</span><span class="ident">i</span><span class="punct">].</span><span class="ident">points</span><span class="punct">[-</span><span class="number">1</span><span class="punct">][</span><span class="number">1</span><span class="punct">])</span>
  <span class="ident">canvas</span><span class="punct">.</span><span class="ident">draw</span><span class="punct">(</span><span class="ident">head</span><span class="punct">)</span>
  <span class="ident">canvas</span><span class="punct">.</span><span class="ident">pop</span>
<span class="keyword">end</span>

<span class="ident">canvas</span><span class="punct">.</span><span class="ident">save</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/particlesflowers/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Iterating Paths</title>
		<link>http://hcg.drtoast.com/iterating-paths/</link>
		<comments>http://hcg.drtoast.com/iterating-paths/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 08:05:31 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Drawing]]></category>
		<category><![CDATA[Examples]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=11</guid>
		<description><![CDATA[ 

By sending the &#8220;increment&#8221; method to a Path object, you can specify changes that will continue to add up or &#8220;drift&#8221; each time the path is drawn to the canvas.
#!/usr/local/bin/macruby

framework 'cocoa'
require 'rubygems'
require 'hotcocoa/graphics'
include HotCocoa
include Graphics

# create a new 400x400 pixel canvas to draw on
canvas = Canvas.new :type =&#62; :image, :filename =&#62; 'iterating.png', :size =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/paths-iterating.png"></a><a href="http://rcg.drtoast.com/wp-content/uploads/2008/06/paths-iterating.png"> </a></p>
<p style="text-align: center;"><img class="size-full wp-image-17" title="paths-iterating" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/paths-iterating.png" alt="" width="400" height="400" /></p>
<p>By sending the &#8220;increment&#8221; method to a Path object, you can specify changes that will continue to add up or &#8220;drift&#8221; each time the path is drawn to the canvas.</p>
<pre><span class="comment">#!/usr/local/bin/macruby</span>

<span class="ident">framework</span> <span class="punct">'</span><span class="string">cocoa</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">hotcocoa/graphics</span><span class="punct">'</span>
<span class="ident">include</span> <span class="constant">HotCocoa</span>
<span class="ident">include</span> <span class="constant">Graphics</span>

<span class="comment"># create a new 400x400 pixel canvas to draw on</span>
<span class="ident">canvas</span> <span class="punct">=</span> <span class="constant">Canvas</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:type</span> <span class="punct">=&gt;</span> <span class="symbol">:image</span><span class="punct">,</span> <span class="symbol">:filename</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">iterating.png</span><span class="punct">',</span> <span class="symbol">:size</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="number">400</span><span class="punct">,</span><span class="number">400</span><span class="punct">]</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">background</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">white</span><span class="punct">)</span>

<span class="comment"># create a petal shape with base at (0,0), size 40x150, and bulge at 30px</span>
<span class="ident">shape</span> <span class="punct">=</span> <span class="constant">Path</span><span class="punct">.</span><span class="ident">new</span><span class="punct">.</span><span class="ident">petal</span><span class="punct">(</span><span class="number">0</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">40</span><span class="punct">,</span><span class="number">150</span><span class="punct">,</span><span class="number">30</span><span class="punct">)</span>
<span class="comment"># add a circle</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">oval</span><span class="punct">(-</span><span class="number">10</span><span class="punct">,</span><span class="number">20</span><span class="punct">,</span><span class="number">20</span><span class="punct">,</span><span class="number">20</span><span class="punct">)</span>
<span class="comment"># color it red</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">fill</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">red</span><span class="punct">)</span>

<span class="comment"># increment shape parameters by the specified amount each iteration,</span>
<span class="comment"># or by a random value selected from the specified range</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:rotation</span><span class="punct">,</span> <span class="number">5.0</span><span class="punct">)</span>
<span class="comment">#shape.increment(:scale, 0.95)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:scalex</span><span class="punct">,</span> <span class="number">0.99</span><span class="punct">)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:scaley</span><span class="punct">,</span> <span class="number">0.96</span><span class="punct">)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:x</span><span class="punct">,</span> <span class="number">10.0</span><span class="punct">)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:y</span><span class="punct">,</span> <span class="number">12.0</span><span class="punct">)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:hue</span><span class="punct">,-</span><span class="number">0.02</span><span class="punct">..</span><span class="number">0.02</span><span class="punct">)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:saturation</span><span class="punct">,</span> <span class="punct">-</span><span class="number">0.1</span><span class="punct">..</span><span class="number">0.1</span><span class="punct">)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:brightness</span><span class="punct">,</span> <span class="punct">-</span><span class="number">0.1</span><span class="punct">..</span><span class="number">0.1</span><span class="punct">)</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">increment</span><span class="punct">(</span><span class="symbol">:alpha</span><span class="punct">,</span> <span class="punct">-</span><span class="number">0.1</span><span class="punct">..</span><span class="number">0.1</span><span class="punct">)</span>

<span class="comment"># draw 200 petals on the canvas starting at location 50,200</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">translate</span><span class="punct">(</span><span class="number">50</span><span class="punct">,</span><span class="number">220</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">draw</span><span class="punct">(</span><span class="ident">shape</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">200</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">save</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/iterating-paths/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Randomizing Paths</title>
		<link>http://hcg.drtoast.com/randomizing-paths/</link>
		<comments>http://hcg.drtoast.com/randomizing-paths/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 08:05:27 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Drawing]]></category>
		<category><![CDATA[Examples]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=8</guid>
		<description><![CDATA[
By applying the &#8220;randomize&#8221; method to a Path object, you can specify attributes that should be randomized each time the object is drawn to the canvas.
#!/usr/local/bin/macruby

framework 'cocoa'
require 'rubygems'
require 'hotcocoa/graphics'
include HotCocoa
include Graphics

# create a new 400x400 pixel canvas to draw on
canvas = Canvas.new :type =&#62; :image, :filename =&#62; 'randomizing.png', :size =&#62; [400,400]
canvas.background(Color.white)

# create a flower shape
shape [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://hcg.drtoast.com/wp-content/uploads/2008/06/paths-randomizing1.png"><img class="size-full wp-image-9" title="paths-randomizing1" src="http://hcg.drtoast.com/wp-content/uploads/2008/06/paths-randomizing1.png" alt="" width="400" height="400" /></a></p>
<p>By applying the &#8220;randomize&#8221; method to a Path object, you can specify attributes that should be randomized each time the object is drawn to the canvas.</p>
<pre><span class="comment">#!/usr/local/bin/macruby</span>

<span class="ident">framework</span> <span class="punct">'</span><span class="string">cocoa</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">hotcocoa/graphics</span><span class="punct">'</span>
<span class="ident">include</span> <span class="constant">HotCocoa</span>
<span class="ident">include</span> <span class="constant">Graphics</span>

<span class="comment"># create a new 400x400 pixel canvas to draw on</span>
<span class="ident">canvas</span> <span class="punct">=</span> <span class="constant">Canvas</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:type</span> <span class="punct">=&gt;</span> <span class="symbol">:image</span><span class="punct">,</span> <span class="symbol">:filename</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">randomizing.png</span><span class="punct">',</span> <span class="symbol">:size</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="number">400</span><span class="punct">,</span><span class="number">400</span><span class="punct">]</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">background</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">white</span><span class="punct">)</span>

<span class="comment"># create a flower shape</span>
<span class="ident">shape</span> <span class="punct">=</span> <span class="constant">Path</span><span class="punct">.</span><span class="ident">new</span>
<span class="ident">petals</span> <span class="punct">=</span> <span class="number">5</span>
<span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">1</span><span class="punct">..</span><span class="ident">petals</span> <span class="keyword">do</span>
  <span class="ident">shape</span><span class="punct">.</span><span class="ident">petal</span><span class="punct">(</span><span class="number">0</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">40</span><span class="punct">,</span><span class="number">100</span><span class="punct">)</span>       <span class="comment"># petal at x,y with width,height</span>
  <span class="ident">shape</span><span class="punct">.</span><span class="ident">rotate</span><span class="punct">(</span><span class="number">360</span> <span class="punct">/</span> <span class="ident">petals</span><span class="punct">)</span>    <span class="comment"># rotate by 1/5th</span>
<span class="keyword">end</span>

<span class="comment"># randomize shape parameters</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:fill</span><span class="punct">,</span> <span class="constant">Color</span><span class="punct">.</span><span class="ident">blue</span><span class="punct">.</span><span class="ident">complementary</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:stroke</span><span class="punct">,</span> <span class="constant">Color</span><span class="punct">.</span><span class="ident">blue</span><span class="punct">.</span><span class="ident">complementary</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:strokewidth</span><span class="punct">,</span> <span class="number">1.0</span><span class="punct">..</span><span class="number">10.0</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:rotation</span><span class="punct">,</span> <span class="number">0</span><span class="punct">..</span><span class="number">360</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:scale</span><span class="punct">,</span> <span class="number">0.5</span><span class="punct">..</span><span class="number">1.0</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:scalex</span><span class="punct">,</span> <span class="number">0.5</span><span class="punct">..</span><span class="number">1.0</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:scaley</span><span class="punct">,</span> <span class="number">0.5</span><span class="punct">..</span><span class="number">1.0</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:alpha</span><span class="punct">,</span> <span class="number">0.5</span><span class="punct">..</span><span class="number">1.0</span>
<span class="comment"># shape.randomize :hue, 0.5..0.8</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:saturation</span><span class="punct">,</span> <span class="number">0.0</span><span class="punct">..</span><span class="number">1.0</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:brightness</span><span class="punct">,</span> <span class="number">0.0</span><span class="punct">..</span><span class="number">1.0</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:x</span><span class="punct">,</span> <span class="punct">-</span><span class="number">100.0</span><span class="punct">..</span><span class="number">100.0</span>
<span class="ident">shape</span><span class="punct">.</span><span class="ident">randomize</span> <span class="symbol">:y</span><span class="punct">,</span> <span class="punct">-</span><span class="number">100.0</span><span class="punct">..</span><span class="number">100.0</span>

<span class="comment"># draw 50 flowers starting at the center of the canvas</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">translate</span><span class="punct">(</span><span class="number">200</span><span class="punct">,</span><span class="number">200</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">draw</span><span class="punct">(</span><span class="ident">shape</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">100</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">save</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/randomizing-paths/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Substrate</title>
		<link>http://hcg.drtoast.com/substrate/</link>
		<comments>http://hcg.drtoast.com/substrate/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 08:04:59 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Drawing]]></category>
		<category><![CDATA[Examples]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=31</guid>
		<description><![CDATA[
This example is based on &#8220;Substrate&#8221; by Jared Tarbell (complexification.net).  Some modifications were made to the color rendering algorithm.
Code is shown after the break. (Warning: the new MacRuby version eats a lot more memory than the older RubyCocoa version, so you may want to lower the number of cracks or frames)

#!/usr/local/bin/macruby

# Ported to HotCocoa::Graphics [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-substrate.png"><img class="aligncenter size-full wp-image-32" title="drawing-substrate" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-substrate.png" alt="" width="400" height="400" /></a></p>
<p>This example is based on &#8220;Substrate&#8221; by Jared Tarbell (<a href="http://complexification.net" target="_blank">complexification.net</a>).  Some modifications were made to the color rendering algorithm.</p>
<p>Code is shown after the break. (Warning: the new MacRuby version eats a lot more memory than the older RubyCocoa version, so you may want to lower the number of cracks or frames)<br />
<span id="more-31"></span></p>
<pre><span class="comment">#!/usr/local/bin/macruby</span>

<span class="comment"># Ported to HotCocoa::Graphics by James Reynolds 6/1/2008 from:</span>
<span class="comment"># Substrate Watercolor</span>
<span class="comment"># j.tarbell   June, 2004</span>
<span class="comment"># Albuquerque, New Mexico</span>
<span class="comment"># complexification.net</span>

<span class="ident">include</span> <span class="constant">HotCocoa</span>
<span class="ident">include</span> <span class="constant">Graphics</span>

<span class="constant">FRAMES</span> <span class="punct">=</span> <span class="number">800</span>
<span class="constant">DIMX</span> <span class="punct">=</span> <span class="number">400</span>
<span class="constant">DIMY</span> <span class="punct">=</span> <span class="number">400</span>

<span class="comment"># sand painters</span>
<span class="constant">COLORSIZE</span> <span class="punct">=</span> <span class="number">2.0</span>
<span class="constant">CRACKSIZE</span> <span class="punct">=</span> <span class="number">1.0</span>
<span class="constant">MAXCRACKS</span> <span class="punct">=</span> <span class="number">100</span>
<span class="constant">SANDGRAINS</span> <span class="punct">=</span> <span class="number">64</span>

<span class="comment"># color parameters</span>
<span class="constant">MAXPAL</span> <span class="punct">=</span> <span class="number">256</span>
<span class="constant">NUMPAL</span> <span class="punct">=</span> <span class="number">0</span>
<span class="constant">HUEDRIFT</span> <span class="punct">=</span> <span class="number">0.0</span>

<span class="comment"># grab colors</span>
<span class="ident">i</span> <span class="punct">=</span> <span class="constant">Image</span><span class="punct">.</span><span class="ident">new</span><span class="punct">('</span><span class="string">v2.jpg</span><span class="punct">')</span>
<span class="constant">GOODCOLOR</span> <span class="punct">=</span> <span class="ident">i</span><span class="punct">.</span><span class="ident">colors</span><span class="punct">(</span><span class="constant">MAXPAL</span><span class="punct">)</span>

<span class="comment"># grid of CRACKS</span>
<span class="constant">CGRID</span> <span class="punct">=</span> <span class="constant">Array</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="constant">DIMX</span><span class="punct">*</span><span class="constant">DIMY</span><span class="punct">);</span>
<span class="constant">CRACKS</span> <span class="punct">=</span> <span class="constant">Array</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="constant">MAXCRACKS</span><span class="punct">);</span>
<span class="global">$numcracks</span> <span class="punct">=</span> <span class="number">0</span><span class="punct">;</span>
<span class="constant">C</span> <span class="punct">=</span> <span class="constant">Canvas</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:type</span> <span class="punct">=&gt;</span> <span class="symbol">:image</span><span class="punct">,</span> <span class="symbol">:filename</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">substrate.png</span><span class="punct">',</span> <span class="symbol">:size</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="number">400</span><span class="punct">,</span><span class="number">400</span><span class="punct">]</span>
<span class="constant">C</span><span class="punct">.</span><span class="ident">background</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">white</span><span class="punct">);</span>

<span class="comment"># METHODS --------------------------------------------------</span>

<span class="keyword">def </span><span class="method">makeCrack</span><span class="punct">()</span>
  <span class="keyword">if</span> <span class="punct">(</span><span class="global">$numcracks</span><span class="punct">&lt;</span><span class="constant">MAXCRACKS</span><span class="punct">)</span>
    <span class="comment"># make a new crack instance</span>
    <span class="constant">CRACKS</span><span class="punct">[</span><span class="global">$numcracks</span><span class="punct">]</span> <span class="punct">=</span> <span class="constant">Crack</span><span class="punct">.</span><span class="ident">new</span>
    <span class="global">$numcracks</span> <span class="punct">+=</span> <span class="number">1</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>

<span class="keyword">def </span><span class="method">beginstuff</span>
  <span class="comment"># erase crack grid</span>
  <span class="keyword">for</span> <span class="ident">y</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="constant">DIMY</span> <span class="keyword">do</span>
    <span class="keyword">for</span> <span class="ident">x</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="constant">DIMX</span> <span class="keyword">do</span>
      <span class="constant">CGRID</span><span class="punct">[</span><span class="ident">y</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">x</span><span class="punct">]</span> <span class="punct">=</span> <span class="number">10001</span><span class="punct">;</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>
  <span class="comment"># make random crack seeds</span>
  <span class="keyword">for</span> <span class="ident">k</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="number">16</span> <span class="keyword">do</span>
    <span class="ident">i</span> <span class="punct">=</span> <span class="ident">rand</span><span class="punct">(</span><span class="constant">DIMX</span><span class="punct">*</span><span class="constant">DIMY</span><span class="punct">-</span><span class="number">1</span><span class="punct">)</span>
    <span class="constant">CGRID</span><span class="punct">[</span><span class="ident">i</span><span class="punct">]=</span><span class="ident">rand</span><span class="punct">(</span><span class="number">360</span><span class="punct">)</span>
  <span class="keyword">end</span>

  <span class="comment"># make just three CRACKS</span>
  <span class="global">$numcracks</span><span class="punct">=</span><span class="number">0</span><span class="punct">;</span>
  <span class="keyword">for</span> <span class="ident">k</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="number">3</span> <span class="keyword">do</span>
    <span class="ident">makeCrack</span><span class="punct">()</span>
  <span class="keyword">end</span>
  <span class="constant">C</span><span class="punct">.</span><span class="ident">background</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">white</span><span class="punct">);</span>
<span class="keyword">end</span>

<span class="comment"># OBJECTS -------------------------------------------------------</span>

<span class="keyword">class </span><span class="class">Crack</span>

  <span class="keyword">def </span><span class="method">initialize</span>
    <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">Crack.new</span><span class="punct">&quot;</span>
    <span class="comment"># find placement along existing crack</span>
    <span class="attribute">@sp</span> <span class="punct">=</span> <span class="constant">SandPainter</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="constant">C</span><span class="punct">)</span>
    <span class="attribute">@sp</span><span class="punct">.</span><span class="ident">grains</span> <span class="punct">=</span> <span class="constant">SANDGRAINS</span>
    <span class="attribute">@sp</span><span class="punct">.</span><span class="ident">grainsize</span> <span class="punct">=</span> <span class="constant">COLORSIZE</span>
    <span class="attribute">@sp</span><span class="punct">.</span><span class="ident">huedrift</span> <span class="punct">=</span> <span class="constant">HUEDRIFT</span>
    <span class="attribute">@sp</span><span class="punct">.</span><span class="ident">color</span> <span class="punct">=</span> <span class="ident">choose</span><span class="punct">(</span><span class="constant">GOODCOLOR</span><span class="punct">)</span>
    <span class="attribute">@verbose</span> <span class="punct">=</span> <span class="constant">true</span>
    <span class="ident">findStart</span><span class="punct">();</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">findStart</span><span class="punct">()</span>

    <span class="comment"># pick random point</span>
    <span class="ident">px</span><span class="punct">=</span><span class="number">0</span><span class="punct">;</span>
    <span class="ident">py</span><span class="punct">=</span><span class="number">0</span><span class="punct">;</span>

    <span class="comment"># shift until crack is found</span>
    <span class="ident">found</span><span class="punct">=</span><span class="constant">false</span><span class="punct">;</span>
    <span class="ident">timeout</span> <span class="punct">=</span> <span class="number">0</span><span class="punct">;</span>
    <span class="comment">#while ((!found) &amp;&amp; (timeout &lt; 1000))</span>
    <span class="keyword">while</span> <span class="punct">((!</span><span class="ident">found</span><span class="punct">))</span><span class="comment"># || (timeout &gt; 1000))</span>
      <span class="ident">px</span> <span class="punct">=</span> <span class="ident">rand</span><span class="punct">(</span><span class="constant">DIMX</span><span class="punct">)</span>
      <span class="ident">py</span> <span class="punct">=</span> <span class="ident">rand</span><span class="punct">(</span><span class="constant">DIMY</span><span class="punct">)</span>
      <span class="keyword">if</span> <span class="punct">(</span><span class="constant">CGRID</span><span class="punct">[</span><span class="ident">py</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">px</span><span class="punct">]&lt;</span><span class="number">10000</span><span class="punct">)</span>
        <span class="ident">found</span><span class="punct">=</span><span class="constant">true</span><span class="punct">;</span>
        <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">found crack at <span class="expr">#{px}</span>,<span class="expr">#{py}</span> with angle <span class="expr">#{CGRID[py*DIMX+px]}</span> (<span class="expr">#{found}</span>)</span><span class="punct">&quot;</span> <span class="keyword">if</span> <span class="attribute">@verbose</span>
      <span class="keyword">else</span>
        <span class="comment">#puts &quot;checked #{px},#{py}&quot; if @verbose</span>
      <span class="keyword">end</span>
      <span class="ident">timeout</span> <span class="punct">+=</span> <span class="number">1</span>
    <span class="keyword">end</span>

    <span class="keyword">if</span> <span class="punct">(</span><span class="ident">found</span><span class="punct">)</span>
      <span class="comment"># start crack</span>
      <span class="ident">a</span> <span class="punct">=</span> <span class="constant">CGRID</span><span class="punct">[</span><span class="ident">py</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">px</span><span class="punct">];</span>
      <span class="keyword">if</span> <span class="punct">(</span><span class="ident">random</span><span class="punct">(</span><span class="number">100</span><span class="punct">)&lt;</span><span class="number">50</span><span class="punct">)</span>
        <span class="ident">a</span><span class="punct">-=</span><span class="number">90</span><span class="punct">+</span><span class="ident">random</span><span class="punct">(-</span><span class="number">2</span><span class="punct">,</span><span class="number">2.1</span><span class="punct">)</span><span class="comment">#.to_i;</span>
      <span class="keyword">else</span>
        <span class="ident">a</span><span class="punct">+=</span><span class="number">90</span><span class="punct">+</span><span class="ident">random</span><span class="punct">(-</span><span class="number">2</span><span class="punct">,</span><span class="number">2.1</span><span class="punct">)</span><span class="comment">#.to_i;</span>
      <span class="keyword">end</span>
      <span class="ident">startCrack</span><span class="punct">(</span><span class="ident">px</span><span class="punct">,</span><span class="ident">py</span><span class="punct">,</span><span class="ident">a</span><span class="punct">);</span>
    <span class="keyword">else</span>
      <span class="ident">println</span><span class="punct">(&quot;</span><span class="string">timeout: </span><span class="punct">&quot;+</span><span class="ident">timeout</span><span class="punct">);</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">startCrack</span><span class="punct">(</span><span class="ident">x</span><span class="punct">,</span> <span class="ident">y</span><span class="punct">,</span> <span class="ident">t</span><span class="punct">)</span>
    <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">starting crack at <span class="expr">#{x}</span>,<span class="expr">#{y}</span> with angle <span class="expr">#{t}</span></span><span class="punct">&quot;</span> <span class="keyword">if</span> <span class="attribute">@verbose</span>
    <span class="attribute">@x</span><span class="punct">=</span><span class="ident">x</span><span class="punct">;</span>
    <span class="attribute">@y</span><span class="punct">=</span><span class="ident">y</span><span class="punct">;</span>
    <span class="attribute">@t</span><span class="punct">=</span><span class="ident">t</span><span class="punct">;</span><span class="comment">#%360;</span>
    <span class="attribute">@x</span><span class="punct">+=</span><span class="number">0.61</span><span class="punct">*</span><span class="ident">cos</span><span class="punct">(</span><span class="attribute">@t</span><span class="punct">*</span><span class="constant">PI</span><span class="punct">/</span><span class="number">180</span><span class="punct">);</span>
    <span class="attribute">@y</span><span class="punct">+=</span><span class="number">0.61</span><span class="punct">*</span><span class="ident">sin</span><span class="punct">(</span><span class="attribute">@t</span><span class="punct">*</span><span class="constant">PI</span><span class="punct">/</span><span class="number">180</span><span class="punct">);</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">move</span><span class="punct">()</span>
    <span class="comment"># continue cracking</span>
    <span class="attribute">@x</span><span class="punct">+=</span><span class="number">0.42</span><span class="punct">*</span><span class="ident">cos</span><span class="punct">(</span><span class="attribute">@t</span><span class="punct">*</span><span class="constant">PI</span><span class="punct">/</span><span class="number">180</span><span class="punct">);</span>
    <span class="attribute">@y</span><span class="punct">+=</span><span class="number">0.42</span><span class="punct">*</span><span class="ident">sin</span><span class="punct">(</span><span class="attribute">@t</span><span class="punct">*</span><span class="constant">PI</span><span class="punct">/</span><span class="number">180</span><span class="punct">);</span>

    <span class="comment"># bound check</span>
    <span class="ident">z</span> <span class="punct">=</span> <span class="number">0.33</span><span class="punct">;</span>
    <span class="ident">cx</span> <span class="punct">=</span> <span class="punct">(</span><span class="attribute">@x</span><span class="punct">+</span><span class="ident">random</span><span class="punct">(-</span><span class="ident">z</span><span class="punct">,</span><span class="ident">z</span><span class="punct">)).</span><span class="ident">to_i</span><span class="punct">;</span>  <span class="comment"># add fuzz</span>
    <span class="ident">cy</span> <span class="punct">=</span> <span class="punct">(</span><span class="attribute">@y</span><span class="punct">+</span><span class="ident">random</span><span class="punct">(-</span><span class="ident">z</span><span class="punct">,</span><span class="ident">z</span><span class="punct">)).</span><span class="ident">to_i</span><span class="punct">;</span>

    <span class="comment"># draw sand painter</span>
    <span class="ident">regionColor</span><span class="punct">();</span>

    <span class="comment"># draw black crack</span>
    <span class="constant">C</span><span class="punct">.</span><span class="ident">fill</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">black</span><span class="punct">);</span>
    <span class="constant">C</span><span class="punct">.</span><span class="ident">oval</span><span class="punct">(</span><span class="attribute">@x</span><span class="punct">+</span><span class="ident">random</span><span class="punct">(-</span><span class="ident">z</span><span class="punct">,</span><span class="ident">z</span><span class="punct">),</span><span class="attribute">@y</span><span class="punct">+</span><span class="ident">random</span><span class="punct">(-</span><span class="ident">z</span><span class="punct">,</span><span class="ident">z</span><span class="punct">),</span><span class="constant">CRACKSIZE</span><span class="punct">,</span><span class="constant">CRACKSIZE</span><span class="punct">);</span>

    <span class="keyword">if</span> <span class="punct">((</span><span class="ident">cx</span><span class="punct">&gt;=</span><span class="number">0</span><span class="punct">)</span> <span class="punct">&amp;&amp;</span> <span class="punct">(</span><span class="ident">cx</span><span class="punct">&lt;</span><span class="constant">DIMX</span><span class="punct">)</span> <span class="punct">&amp;&amp;</span> <span class="punct">(</span><span class="ident">cy</span><span class="punct">&gt;=</span><span class="number">0</span><span class="punct">)</span> <span class="punct">&amp;&amp;</span> <span class="punct">(</span><span class="ident">cy</span><span class="punct">&lt;</span><span class="constant">DIMY</span><span class="punct">))</span>
      <span class="comment"># safe to check</span>
      <span class="keyword">if</span> <span class="punct">((</span><span class="constant">CGRID</span><span class="punct">[</span><span class="ident">cy</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">cx</span><span class="punct">]&gt;</span><span class="number">10000</span><span class="punct">)</span> <span class="punct">||</span> <span class="punct">(</span><span class="constant">CGRID</span><span class="punct">[</span><span class="ident">cy</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">cx</span><span class="punct">]-</span><span class="attribute">@t</span><span class="punct">).</span><span class="ident">abs</span><span class="punct">&lt;</span><span class="number">5</span><span class="punct">)</span>
        <span class="comment"># continue cracking</span>
        <span class="constant">CGRID</span><span class="punct">[</span><span class="ident">cy</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">cx</span><span class="punct">]=</span><span class="attribute">@t</span><span class="punct">.</span><span class="ident">to_i</span>
      <span class="keyword">elsif</span> <span class="punct">((</span><span class="constant">CGRID</span><span class="punct">[</span><span class="ident">cy</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">cx</span><span class="punct">]-</span><span class="attribute">@t</span><span class="punct">).</span><span class="ident">abs</span><span class="punct">&gt;</span><span class="number">2</span><span class="punct">)</span>
        <span class="comment"># crack encountered (not self), stop cracking</span>
        <span class="ident">findStart</span><span class="punct">();</span>
        <span class="ident">makeCrack</span><span class="punct">();</span>
      <span class="keyword">end</span>
    <span class="keyword">else</span>
      <span class="comment"># out of bounds, stop cracking</span>
      <span class="ident">findStart</span><span class="punct">();</span>
      <span class="ident">makeCrack</span><span class="punct">();</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">regionColor</span><span class="punct">()</span>
    <span class="comment"># start checking one step away</span>
    <span class="ident">rx</span><span class="punct">=</span><span class="attribute">@x</span><span class="punct">;</span>
    <span class="ident">ry</span><span class="punct">=</span><span class="attribute">@y</span><span class="punct">;</span>
    <span class="ident">openspace</span><span class="punct">=</span><span class="constant">true</span><span class="punct">;</span>

    <span class="comment"># find extents of open space</span>
    <span class="keyword">while</span> <span class="punct">(</span><span class="ident">openspace</span><span class="punct">)</span>
      <span class="comment"># move perpendicular to crack</span>
      <span class="ident">rx</span><span class="punct">+=</span><span class="number">0.81</span><span class="punct">*</span><span class="ident">sin</span><span class="punct">(</span><span class="attribute">@t</span><span class="punct">*</span><span class="constant">PI</span><span class="punct">/</span><span class="number">180</span><span class="punct">);</span>
      <span class="ident">ry</span><span class="punct">-=</span><span class="number">0.81</span><span class="punct">*</span><span class="ident">cos</span><span class="punct">(</span><span class="attribute">@t</span><span class="punct">*</span><span class="constant">PI</span><span class="punct">/</span><span class="number">180</span><span class="punct">);</span>
      <span class="ident">cx</span> <span class="punct">=</span> <span class="ident">rx</span><span class="punct">.</span><span class="ident">to_i</span>
      <span class="ident">cy</span> <span class="punct">=</span> <span class="ident">ry</span><span class="punct">.</span><span class="ident">to_i</span>
      <span class="keyword">if</span> <span class="punct">((</span><span class="ident">cx</span><span class="punct">&gt;=</span><span class="number">0</span><span class="punct">)</span> <span class="punct">&amp;&amp;</span> <span class="punct">(</span><span class="ident">cx</span><span class="punct">&lt;</span><span class="constant">DIMX</span><span class="punct">)</span> <span class="punct">&amp;&amp;</span> <span class="punct">(</span><span class="ident">cy</span><span class="punct">&gt;=</span><span class="number">0</span><span class="punct">)</span> <span class="punct">&amp;&amp;</span> <span class="punct">(</span><span class="ident">cy</span><span class="punct">&lt;</span><span class="constant">DIMY</span><span class="punct">))</span>
        <span class="comment"># safe to check</span>
        <span class="keyword">if</span> <span class="punct">(</span><span class="constant">CGRID</span><span class="punct">[</span><span class="ident">cy</span><span class="punct">*</span><span class="constant">DIMX</span><span class="punct">+</span><span class="ident">cx</span><span class="punct">]&gt;</span><span class="number">10000</span><span class="punct">)</span>
          <span class="comment"># space is open</span>
        <span class="keyword">else</span>
          <span class="ident">openspace</span><span class="punct">=</span><span class="constant">false</span><span class="punct">;</span>
        <span class="keyword">end</span>
      <span class="keyword">else</span>
        <span class="ident">openspace</span><span class="punct">=</span><span class="constant">false</span><span class="punct">;</span>
      <span class="keyword">end</span>
    <span class="keyword">end</span>
    <span class="comment"># draw sand painter</span>
    <span class="attribute">@sp</span><span class="punct">.</span><span class="ident">render</span><span class="punct">(</span><span class="attribute">@x</span><span class="punct">,</span><span class="attribute">@y</span><span class="punct">,</span><span class="ident">rx</span><span class="punct">,</span><span class="ident">ry</span><span class="punct">);</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>

<span class="ident">beginstuff</span>

<span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">..</span><span class="constant">FRAMES</span> <span class="keyword">do</span>
  <span class="comment"># crack all CRACKS</span>
  <span class="keyword">for</span> <span class="ident">n</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">...</span><span class="global">$numcracks</span> <span class="keyword">do</span>
    <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">frame <span class="expr">#{i}</span> moving crack <span class="expr">#{n}</span></span><span class="punct">&quot;</span>
    <span class="constant">CRACKS</span><span class="punct">[</span><span class="ident">n</span><span class="punct">].</span><span class="ident">move</span><span class="punct">();</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>

<span class="constant">C</span><span class="punct">.</span><span class="ident">save</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/substrate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drawing Hair</title>
		<link>http://hcg.drtoast.com/drawing-hair/</link>
		<comments>http://hcg.drtoast.com/drawing-hair/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 07:59:55 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Drawing]]></category>
		<category><![CDATA[Examples]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=29</guid>
		<description><![CDATA[
Applying the &#8220;hair&#8221; method to a Rope object will render organic flowing threads to the canvas.
#!/usr/local/bin/macruby

framework 'cocoa'
require 'rubygems'
require 'hotcocoa/graphics'
include HotCocoa
include Graphics

# create a new 400x400 pixel canvas to draw on
canvas = Canvas.new :type =&#62; :image, :filename =&#62; 'hair.png', :size =&#62; [400,400]

# choose a random color and set the background to a darker variant
clr = Color.random.a(0.5)
canvas.background(clr.copy.darken(0.6))

# [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-hair.png"><img class="size-full wp-image-30 aligncenter" title="drawing-hair" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-hair.png" alt="" width="400" height="400" /></a></p>
<p>Applying the &#8220;hair&#8221; method to a Rope object will render organic flowing threads to the canvas.</p>
<pre><span class="comment">#!/usr/local/bin/macruby</span>

<span class="ident">framework</span> <span class="punct">'</span><span class="string">cocoa</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">hotcocoa/graphics</span><span class="punct">'</span>
<span class="ident">include</span> <span class="constant">HotCocoa</span>
<span class="ident">include</span> <span class="constant">Graphics</span>

<span class="comment"># create a new 400x400 pixel canvas to draw on</span>
<span class="ident">canvas</span> <span class="punct">=</span> <span class="constant">Canvas</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:type</span> <span class="punct">=&gt;</span> <span class="symbol">:image</span><span class="punct">,</span> <span class="symbol">:filename</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">hair.png</span><span class="punct">',</span> <span class="symbol">:size</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="number">400</span><span class="punct">,</span><span class="number">400</span><span class="punct">]</span>

<span class="comment"># choose a random color and set the background to a darker variant</span>
<span class="ident">clr</span> <span class="punct">=</span> <span class="constant">Color</span><span class="punct">.</span><span class="ident">random</span><span class="punct">.</span><span class="ident">a</span><span class="punct">(</span><span class="number">0.5</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">background</span><span class="punct">(</span><span class="ident">clr</span><span class="punct">.</span><span class="ident">copy</span><span class="punct">.</span><span class="ident">darken</span><span class="punct">(</span><span class="number">0.6</span><span class="punct">))</span>

<span class="comment"># create a new rope with 200 fibers</span>
<span class="ident">rope</span> <span class="punct">=</span> <span class="constant">Rope</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="ident">canvas</span><span class="punct">)</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">width</span> <span class="punct">=</span> <span class="number">100</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">fibers</span> <span class="punct">=</span> <span class="number">200</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">strokewidth</span> <span class="punct">=</span> <span class="number">0.4</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">roundness</span> <span class="punct">=</span> <span class="number">3.0</span>

<span class="comment"># randomly rotate the canvas from its center</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">translate</span><span class="punct">(</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span><span class="punct">/</span><span class="number">2</span><span class="punct">,</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">height</span><span class="punct">/</span><span class="number">2</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">rotate</span><span class="punct">(</span><span class="ident">random</span><span class="punct">(</span><span class="number">0</span><span class="punct">,</span><span class="number">360</span><span class="punct">))</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">translate</span><span class="punct">(-</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span><span class="punct">/</span><span class="number">2</span><span class="punct">,-</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">height</span><span class="punct">/</span><span class="number">2</span><span class="punct">)</span>

<span class="comment"># draw 50 ropes</span>
<span class="ident">ropes</span> <span class="punct">=</span> <span class="number">50</span>
<span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">..</span><span class="ident">ropes</span> <span class="keyword">do</span>
    <span class="ident">canvas</span><span class="punct">.</span><span class="ident">stroke</span><span class="punct">(</span><span class="ident">clr</span><span class="punct">.</span><span class="ident">copy</span><span class="punct">.</span><span class="ident">analog</span><span class="punct">(</span><span class="number">20</span><span class="punct">,</span> <span class="number">0.8</span><span class="punct">))</span>   <span class="comment"># rotate hue up to 20 deg left/right, vary brightness/saturation by up to 70%</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">x0</span> <span class="punct">=</span> <span class="punct">-</span><span class="number">100</span>                            <span class="comment"># start rope off bottom left of canvas</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">y0</span> <span class="punct">=</span> <span class="punct">-</span><span class="number">100</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">x1</span> <span class="punct">=</span> <span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span> <span class="punct">+</span> <span class="number">100</span>              <span class="comment"># end rope off top right of canvas</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">y1</span> <span class="punct">=</span> <span class="ident">canvas</span><span class="punct">.</span><span class="ident">height</span> <span class="punct">+</span> <span class="number">100</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">hair</span>                                 <span class="comment"># draw rope in organic &quot;hair&quot; style</span>
<span class="keyword">end</span>

<span class="comment"># save the canvas</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">save</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/drawing-hair/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drawing Ribbons</title>
		<link>http://hcg.drtoast.com/drawing-ribbons/</link>
		<comments>http://hcg.drtoast.com/drawing-ribbons/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 07:57:10 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Drawing]]></category>
		<category><![CDATA[Examples]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=27</guid>
		<description><![CDATA[
Applying the &#8220;ribbon&#8221; method to a Rope object will render smooth, flowing ribbons to the canvas.
#!/usr/local/bin/macruby

framework 'cocoa'
require 'rubygems'
require 'hotcocoa/graphics'
include HotCocoa
include Graphics

# create a new 400x400 pixel canvas to draw on
canvas = Canvas.new :type =&#62; :image, :filename =&#62; 'ribbons.png', :size =&#62; [400,400]

# choose a random color and set the background to a darker variant
clr = Color.random.a(0.5)
canvas.background(clr.copy.darken(0.6))

# [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-ribbons.png"><img class="size-full wp-image-28 aligncenter" title="drawing-ribbons" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/drawing-ribbons.png" alt="" width="400" height="400" /></a></p>
<p>Applying the &#8220;ribbon&#8221; method to a Rope object will render smooth, flowing ribbons to the canvas.</p>
<pre><span class="comment">#!/usr/local/bin/macruby</span>

<span class="ident">framework</span> <span class="punct">'</span><span class="string">cocoa</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">hotcocoa/graphics</span><span class="punct">'</span>
<span class="ident">include</span> <span class="constant">HotCocoa</span>
<span class="ident">include</span> <span class="constant">Graphics</span>

<span class="comment"># create a new 400x400 pixel canvas to draw on</span>
<span class="ident">canvas</span> <span class="punct">=</span> <span class="constant">Canvas</span><span class="punct">.</span><span class="ident">new</span> <span class="symbol">:type</span> <span class="punct">=&gt;</span> <span class="symbol">:image</span><span class="punct">,</span> <span class="symbol">:filename</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">ribbons.png</span><span class="punct">',</span> <span class="symbol">:size</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="number">400</span><span class="punct">,</span><span class="number">400</span><span class="punct">]</span>

<span class="comment"># choose a random color and set the background to a darker variant</span>
<span class="ident">clr</span> <span class="punct">=</span> <span class="constant">Color</span><span class="punct">.</span><span class="ident">random</span><span class="punct">.</span><span class="ident">a</span><span class="punct">(</span><span class="number">0.5</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">background</span><span class="punct">(</span><span class="ident">clr</span><span class="punct">.</span><span class="ident">copy</span><span class="punct">.</span><span class="ident">darken</span><span class="punct">(</span><span class="number">0.6</span><span class="punct">))</span>

<span class="comment"># create a new rope with 200 fibers</span>
<span class="ident">rope</span> <span class="punct">=</span> <span class="constant">Rope</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="ident">canvas</span><span class="punct">)</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">width</span> <span class="punct">=</span> <span class="number">500</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">fibers</span> <span class="punct">=</span> <span class="number">200</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">strokewidth</span> <span class="punct">=</span> <span class="number">1.0</span>
<span class="ident">rope</span><span class="punct">.</span><span class="ident">roundness</span> <span class="punct">=</span> <span class="number">1.5</span>

<span class="comment"># randomly rotate the canvas from its center</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">translate</span><span class="punct">(</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span><span class="punct">/</span><span class="number">2</span><span class="punct">,</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">height</span><span class="punct">/</span><span class="number">2</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">rotate</span><span class="punct">(</span><span class="ident">random</span><span class="punct">(</span><span class="number">0</span><span class="punct">,</span><span class="number">360</span><span class="punct">))</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">translate</span><span class="punct">(-</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span><span class="punct">/</span><span class="number">2</span><span class="punct">,-</span><span class="ident">canvas</span><span class="punct">.</span><span class="ident">height</span><span class="punct">/</span><span class="number">2</span><span class="punct">)</span>

<span class="comment"># draw 20 ropes</span>
<span class="ident">ropes</span> <span class="punct">=</span> <span class="number">20</span>
<span class="keyword">for</span> <span class="ident">i</span> <span class="keyword">in</span> <span class="number">0</span><span class="punct">..</span><span class="ident">ropes</span> <span class="keyword">do</span>
    <span class="ident">canvas</span><span class="punct">.</span><span class="ident">stroke</span><span class="punct">(</span><span class="ident">clr</span><span class="punct">.</span><span class="ident">copy</span><span class="punct">.</span><span class="ident">analog</span><span class="punct">(</span><span class="number">10</span><span class="punct">,</span> <span class="number">0.7</span><span class="punct">))</span>   <span class="comment"># rotate hue up to 10 deg left/right, vary brightness/saturation by up to 70%</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">x0</span> <span class="punct">=</span> <span class="punct">-</span><span class="number">100</span>                            <span class="comment"># start rope off bottom left of canvas</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">y0</span> <span class="punct">=</span> <span class="punct">-</span><span class="number">100</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">x1</span> <span class="punct">=</span> <span class="ident">canvas</span><span class="punct">.</span><span class="ident">width</span> <span class="punct">+</span> <span class="number">200</span>              <span class="comment"># end rope off top right of canvas</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">y1</span> <span class="punct">=</span> <span class="ident">canvas</span><span class="punct">.</span><span class="ident">height</span> <span class="punct">+</span> <span class="number">200</span>
    <span class="ident">rope</span><span class="punct">.</span><span class="ident">ribbon</span>                               <span class="comment"># draw rope in smooth &quot;ribbon&quot; style</span>
<span class="keyword">end</span>

<span class="comment"># save the canvas</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">save</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/drawing-ribbons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
