<?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</title>
	<atom:link href="http://hcg.drtoast.com/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>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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 [...]]]></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>Text Spirograph</title>
		<link>http://hcg.drtoast.com/text-spirograph/</link>
		<comments>http://hcg.drtoast.com/text-spirograph/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 08:10:25 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Examples]]></category>
		<category><![CDATA[Text]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=33</guid>
		<description><![CDATA[Text can be positioned and scaled arbitrarily on the canvas, rendered using any font that is installed on your system. #!/usr/local/bin/macruby framework 'cocoa' require 'rubygems' require 'hotcocoa/graphics' include HotCocoa include Graphics # set up the canvas and font canvas = Canvas.new :type =&#62; :image, :filename =&#62; 'spiro.png', :size =&#62; [400,400] canvas.background(Color.beige) canvas.fill(Color.black) canvas.font('Book Antiqua') canvas.fontsize(12) [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/text-spirograph.png"><img class="aligncenter size-full wp-image-34" title="text-spirograph" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/text-spirograph.png" alt="" width="400" height="400" /></a></p>
<p>Text can be positioned and scaled arbitrarily on the canvas, rendered using any font that is installed on your system.</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"># set up the canvas and font</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">spiro.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">beige</span><span class="punct">)</span>
<span class="ident">canvas</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="ident">canvas</span><span class="punct">.</span><span class="ident">font</span><span class="punct">('</span><span class="string">Book Antiqua</span><span class="punct">')</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">fontsize</span><span class="punct">(</span><span class="number">12</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="number">200</span><span class="punct">,</span><span class="number">200</span><span class="punct">)</span>

<span class="comment"># rotate, draw text, repeat</span>
<span class="keyword">for</span> <span class="ident">frame</span> <span class="keyword">in</span> <span class="number">1</span><span class="punct">..</span><span class="number">180</span>
    <span class="ident">canvas</span><span class="punct">.</span><span class="ident">push</span>
    <span class="ident">canvas</span><span class="punct">.</span><span class="ident">rotate</span><span class="punct">((</span><span class="ident">frame</span><span class="punct">*</span><span class="number">2</span><span class="punct">)</span> <span class="punct">+</span> <span class="number">120</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="number">70</span><span class="punct">,</span><span class="number">0</span><span class="punct">)</span>
    <span class="ident">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">Going ...</span><span class="punct">&quot;,</span> <span class="number">80</span><span class="punct">,</span> <span class="number">0</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">frame</span> <span class="punct">*</span> <span class="number">6</span><span class="punct">)</span>
    <span class="ident">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">Around and</span><span class="punct">&quot;,</span> <span class="number">20</span><span class="punct">,</span> <span class="number">0</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="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/text-spirograph/feed/</wfw:commentRss>
		<slash:comments>0</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 [...]]]></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; [...]]]></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 [...]]]></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 [...]]]></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 [...]]]></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>
		<item>
		<title>Image Moving and Scaling</title>
		<link>http://hcg.drtoast.com/image-moving-and-scaling/</link>
		<comments>http://hcg.drtoast.com/image-moving-and-scaling/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 07:53:04 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Examples]]></category>
		<category><![CDATA[Images]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=25</guid>
		<description><![CDATA[Various scaling and moving operations are available for images. You can scale an image proportionally by a percentage, scale it to fit proportionally within a bounding box, or scale width and height to fit exactly within a bounding box. #!/usr/local/bin/macruby framework 'cocoa' require 'rubygems' require 'hotcocoa/graphics' include HotCocoa include Graphics # set up the canvas [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/image-moving.png"><img class="aligncenter size-full wp-image-26" title="image-moving" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/image-moving.png" alt="" width="400" height="400" /></a></p>
<p>Various scaling and moving operations are available for images.  You can scale an image proportionally by a percentage, scale it to fit proportionally within a bounding box, or scale width and height to fit exactly within a bounding box.</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"># set up the canvas and font</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">moving.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="constant">Color</span><span class="punct">.</span><span class="ident">white</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">font</span> <span class="punct">'</span><span class="string">Skia</span><span class="punct">'</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">fontsize</span> <span class="number">14</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">fill</span> <span class="constant">Color</span><span class="punct">.</span><span class="ident">black</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">stroke</span> <span class="constant">Color</span><span class="punct">.</span><span class="ident">red</span>

<span class="comment"># load an image</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="comment"># SCALE (multiply both dimensions by a scaling factor)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">scale</span><span class="punct">(</span><span class="number">0.2</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">img</span><span class="punct">,</span><span class="number">0</span><span class="punct">,</span><span class="number">240</span><span class="punct">)</span>  <span class="comment"># draw the image at the specified coordinates</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">scale to 20%</span><span class="punct">&quot;,</span><span class="number">0</span><span class="punct">,</span><span class="number">220</span><span class="punct">)</span>

<span class="comment"># FIT (scale to fit within the given dimensions, maintaining original aspect ratio)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span>               <span class="comment"># first reset the image to its original size</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="number">100</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">fill</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="ident">canvas</span><span class="punct">.</span><span class="ident">rect</span><span class="punct">(</span><span class="number">120</span><span class="punct">,</span><span class="number">240</span><span class="punct">,</span><span class="number">100</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">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="ident">canvas</span><span class="punct">.</span><span class="ident">draw</span><span class="punct">(</span><span class="ident">img</span><span class="punct">,</span><span class="number">133</span><span class="punct">,</span><span class="number">240</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">fit into 100x100</span><span class="punct">&quot;,</span><span class="number">120</span><span class="punct">,</span><span class="number">220</span><span class="punct">)</span>

<span class="comment"># RESIZE (scale to fit exactly within the given dimensions)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">resize</span><span class="punct">(</span><span class="number">100</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">draw</span><span class="punct">(</span><span class="ident">img</span><span class="punct">,</span><span class="number">240</span><span class="punct">,</span><span class="number">240</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">resize to 100x100</span><span class="punct">&quot;,</span><span class="number">240</span><span class="punct">,</span><span class="number">220</span><span class="punct">)</span>

<span class="comment"># CROP (to the largest square containing image data)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">scale</span><span class="punct">(</span><span class="number">0.2</span><span class="punct">).</span><span class="ident">crop</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">draw</span><span class="punct">(</span><span class="ident">img</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">text</span><span class="punct">(&quot;</span><span class="string">crop max square</span><span class="punct">&quot;,</span><span class="number">0</span><span class="punct">,</span><span class="number">80</span><span class="punct">)</span>

<span class="comment"># CROP (within a rectangle starting at x,y with width,height)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">scale</span><span class="punct">(</span><span class="number">0.3</span><span class="punct">).</span><span class="ident">crop</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="number">100</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">img</span><span class="punct">,</span><span class="number">120</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">text</span><span class="punct">(&quot;</span><span class="string">crop to 100x100</span><span class="punct">&quot;,</span><span class="number">120</span><span class="punct">,</span><span class="number">80</span><span class="punct">)</span>

<span class="comment"># ROTATE</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">origin</span><span class="punct">(</span><span class="symbol">:center</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">rotate</span><span class="punct">(</span><span class="number">45</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">img</span><span class="punct">,</span><span class="number">300</span><span class="punct">,</span><span class="number">140</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">rotate 45 degrees</span><span class="punct">&quot;,</span><span class="number">250</span><span class="punct">,</span><span class="number">50</span><span class="punct">)</span>

<span class="comment">#img.origin(:center)   # center the image</span>
<span class="comment">#img.translate(0,-150)    # move the image</span>

<span class="ident">canvas</span><span class="punct">.</span><span class="ident">save</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/image-moving-and-scaling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Image Effects</title>
		<link>http://hcg.drtoast.com/image-effects/</link>
		<comments>http://hcg.drtoast.com/image-effects/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 07:47:52 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Examples]]></category>
		<category><![CDATA[Images]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=23</guid>
		<description><![CDATA[You can apply various Photoshop-style filters to images, then render them to the canvas. #!/usr/local/bin/macruby framework 'cocoa' require 'rubygems' require 'hotcocoa/graphics' include HotCocoa include Graphics # set up the canvas and font canvas = Canvas.new :type =&#62; :image, :filename =&#62; 'effects.png', :size =&#62; [400,400] canvas.background(Color.white) canvas.font('Skia') canvas.fontsize(14) canvas.fill(Color.black) # load image file img = Image.new('v2.jpg') [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hcg.drtoast.com/wp-content/uploads/2008/07/image-effects.png"><img class="aligncenter size-full wp-image-24" title="image-effects" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/image-effects.png" alt="" width="400" height="400" /></a></p>
<p>You can apply various Photoshop-style filters to images, then render them 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"># set up the canvas and font</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">effects.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="ident">canvas</span><span class="punct">.</span><span class="ident">font</span><span class="punct">('</span><span class="string">Skia</span><span class="punct">')</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">fontsize</span><span class="punct">(</span><span class="number">14</span><span class="punct">)</span>
<span class="ident">canvas</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="comment"># load image file</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="comment"># set image width/height, starting position, and increment position</span>
<span class="ident">w</span><span class="punct">,</span><span class="ident">h</span> <span class="punct">=</span> <span class="punct">[</span><span class="number">100</span><span class="punct">,</span><span class="number">100</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="punct">[</span><span class="number">0</span><span class="punct">,</span><span class="number">290</span><span class="punct">]</span>
<span class="ident">xoffset</span> <span class="punct">=</span> <span class="number">105</span>
<span class="ident">yoffset</span> <span class="punct">=</span> <span class="number">130</span>

<span class="comment"># ORIGINAL image, resized to fit within w,h:</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">original</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># CRYSTALLIZE: apply a &quot;crystallize&quot; effect with the given radius</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">crystallize</span><span class="punct">(</span><span class="number">5.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">crystallize</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># BLOOM: apply a &quot;bloom&quot; effect with the given radius and intensity</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">bloom</span><span class="punct">(</span><span class="number">10</span><span class="punct">,</span> <span class="number">1.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">bloom</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># EDGES: detect edges</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">edges</span><span class="punct">(</span><span class="number">10</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">edges</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># (go to next row)</span>
<span class="ident">x</span> <span class="punct">=</span> <span class="number">0</span>
<span class="ident">y</span> <span class="punct">-=</span> <span class="ident">yoffset</span>

<span class="comment"># POSTERIZE: reduce image to the specified number of colors</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">posterize</span><span class="punct">(</span><span class="number">8</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">posterize</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># TWIRL: rotate around x,y with radius and angle</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">twirl</span><span class="punct">(</span><span class="number">35</span><span class="punct">,</span><span class="number">50</span><span class="punct">,</span><span class="number">40</span><span class="punct">,</span><span class="number">90</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">twirl</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># EDGEWORK: simulate a woodcut print</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">rect</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">img</span><span class="punct">.</span><span class="ident">width</span><span class="punct">,</span><span class="ident">img</span><span class="punct">.</span><span class="ident">height</span><span class="punct">)</span> <span class="comment"># needs a black background</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">edgework</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">draw</span><span class="punct">(</span><span class="ident">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">edgework</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># DISPLACEMENT: use a second image as a displacement map</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img2</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">resize</span><span class="punct">(</span><span class="ident">img</span><span class="punct">.</span><span class="ident">width</span><span class="punct">,</span><span class="ident">img</span><span class="punct">.</span><span class="ident">height</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">displacement</span><span class="punct">(</span><span class="ident">img2</span><span class="punct">,</span> <span class="number">30.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">displacement</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># (go to next row)</span>
<span class="ident">x</span> <span class="punct">=</span> <span class="number">0</span>
<span class="ident">y</span> <span class="punct">-=</span> <span class="ident">yoffset</span>

<span class="comment"># DOTSCREEN: simulate a dot screen: center point, angle(0-360), width(1-50), and sharpness(0-1)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">dotscreen</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">45</span><span class="punct">,</span><span class="number">5</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">draw</span><span class="punct">(</span><span class="ident">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">dotscreen</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># SHARPEN: sharpen using the given radius and intensity</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">sharpen</span><span class="punct">(</span><span class="number">2.0</span><span class="punct">,</span><span class="number">2.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">sharpen</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># BLUR: apply a gaussian blur with the given radius</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">blur</span><span class="punct">(</span><span class="number">3.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">blur</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># MOTION BLUR: apply a motion blur with the given radius and angle</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">motionblur</span><span class="punct">(</span><span class="number">10.0</span><span class="punct">,</span><span class="number">90</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">motion blur</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</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/image-effects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Image Color Adjustments</title>
		<link>http://hcg.drtoast.com/image-color-adjustments/</link>
		<comments>http://hcg.drtoast.com/image-color-adjustments/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 07:42:42 +0000</pubDate>
		<dc:creator>drtoast</dc:creator>
				<category><![CDATA[Color]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[Images]]></category>

		<guid isPermaLink="false">http://rcg.drtoast.com/?p=22</guid>
		<description><![CDATA[You can apply various color adjustments to a loaded image, then render it to the canvas.  You can also grab colors from an image for use in a gradient or to paint objects on the canvas. #!/usr/local/bin/macruby framework 'cocoa' require 'rubygems' require 'hotcocoa/graphics' include HotCocoa include Graphics # set up the canvas and font canvas [...]]]></description>
			<content:encoded><![CDATA[<p><a style="text-decoration: none;" href="http://hcg.drtoast.com/wp-content/uploads/2008/07/image-colors.png"><span style="color: #000000;"><br />
</span><img class="aligncenter size-full wp-image-21" style="text-decoration: underline;" title="image-colors" src="http://hcg.drtoast.com/wp-content/uploads/2008/07/image-colors.png" alt="" width="400" height="400" /></a></p>
<p>You can apply various color adjustments to a loaded image, then render it to the canvas.  You can also grab colors from an image for use in a gradient or to paint objects on 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"># set up the canvas and font</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">colors.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="ident">canvas</span><span class="punct">.</span><span class="ident">font</span><span class="punct">('</span><span class="string">Skia</span><span class="punct">')</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">fontsize</span><span class="punct">(</span><span class="number">14</span><span class="punct">)</span>
<span class="ident">canvas</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="comment"># LOAD IMAGE</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">w</span><span class="punct">,</span><span class="ident">h</span> <span class="punct">=</span> <span class="punct">[</span><span class="number">100</span><span class="punct">,</span><span class="number">100</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="punct">[</span><span class="number">0</span><span class="punct">,</span><span class="number">290</span><span class="punct">]</span>
<span class="ident">xoffset</span> <span class="punct">=</span> <span class="number">105</span>
<span class="ident">yoffset</span> <span class="punct">=</span> <span class="number">130</span>

<span class="comment"># ORIGINAL image, resized to fit within w,h:</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">original</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># HUE: rotate color wheel by degrees</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">hue</span><span class="punct">(</span><span class="number">45</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">hue</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># EXPOSURE: increase/decrease exposure by f-stops</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">exposure</span><span class="punct">(</span><span class="number">1.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">exposure</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># SATURATION: adjust saturation by multiplier</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">saturation</span><span class="punct">(</span><span class="number">2.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">saturation</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># (go to next row)</span>
<span class="ident">x</span> <span class="punct">=</span> <span class="number">0</span>
<span class="ident">y</span> <span class="punct">-=</span> <span class="ident">yoffset</span>

<span class="comment"># CONTRAST: adjust contrast by multiplier</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">contrast</span><span class="punct">(</span><span class="number">2.0</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">contrast</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># BRIGHTNESS: adjust brightness</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">brightness</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">draw</span><span class="punct">(</span><span class="ident">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">brightness</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># MONOCHROME: convert to a monochrome image</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">monochrome</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">orange</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">monochrome</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># WHITEPOINT: remap the white point</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">whitepoint</span><span class="punct">(</span><span class="constant">Color</span><span class="punct">.</span><span class="ident">whiteish</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">white point</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># (go to next row)</span>
<span class="ident">x</span> <span class="punct">=</span> <span class="number">0</span>
<span class="ident">y</span> <span class="punct">-=</span> <span class="ident">yoffset</span>

<span class="comment"># CHAINING: apply multiple effects at once</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">hue</span><span class="punct">(</span><span class="number">60</span><span class="punct">).</span><span class="ident">saturation</span><span class="punct">(</span><span class="number">2.0</span><span class="punct">).</span><span class="ident">contrast</span><span class="punct">(</span><span class="number">2.5</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">img</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">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">multi effects</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="comment"># COLORS: sample random colors from the image and render as a gradient</span>
<span class="ident">img</span><span class="punct">.</span><span class="ident">reset</span><span class="punct">.</span><span class="ident">fit</span><span class="punct">(</span><span class="ident">w</span><span class="punct">,</span><span class="ident">h</span><span class="punct">)</span>              <span class="comment"># reset the image and scale to fit within w,h</span>
<span class="ident">colors</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">10</span><span class="punct">).</span><span class="ident">sort!</span>   <span class="comment"># select 10 random colors and sort by brightness</span>
<span class="ident">gradient</span> <span class="punct">=</span> <span class="constant">Gradient</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="ident">colors</span><span class="punct">)</span> <span class="comment"># create a new gradient using the selected colors</span>
<span class="ident">rect</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">rect</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">img</span><span class="punct">.</span><span class="ident">width</span><span class="punct">,</span><span class="ident">img</span><span class="punct">.</span><span class="ident">height</span><span class="punct">)</span> <span class="comment"># create a rectangle the size of the image</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">beginclip</span><span class="punct">(</span><span class="ident">rect</span><span class="punct">)</span>          <span class="comment"># begin clipping so the gradient will only fill the rectangle</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">gradient</span><span class="punct">(</span><span class="ident">gradient</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">x</span><span class="punct">+</span><span class="ident">img</span><span class="punct">.</span><span class="ident">width</span><span class="punct">,</span><span class="ident">y</span><span class="punct">+</span><span class="ident">img</span><span class="punct">.</span><span class="ident">height</span><span class="punct">)</span> <span class="comment"># draw the gradient between opposite corners of the rectangle</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">endclip</span>                  <span class="comment"># end clipping so we can draw on the rest of the canvas</span>
<span class="ident">canvas</span><span class="punct">.</span><span class="ident">text</span><span class="punct">(&quot;</span><span class="string">get colors</span><span class="punct">&quot;,</span><span class="ident">x</span><span class="punct">,</span><span class="ident">y</span><span class="punct">-</span><span class="number">15</span><span class="punct">)</span>    <span class="comment"># add text label</span>
<span class="ident">x</span> <span class="punct">+=</span> <span class="ident">xoffset</span>

<span class="ident">canvas</span><span class="punct">.</span><span class="ident">save</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://hcg.drtoast.com/image-color-adjustments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
