<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>ŁAPA Soft</title>
	<atom:link href="http://lapasoft.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://lapasoft.wordpress.com</link>
	<description>not only random soft</description>
	<lastBuildDate>Sun, 29 Jan 2012 20:20:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='lapasoft.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>ŁAPA Soft</title>
		<link>http://lapasoft.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://lapasoft.wordpress.com/osd.xml" title="ŁAPA Soft" />
	<atom:link rel='hub' href='http://lapasoft.wordpress.com/?pushpress=hub'/>
		<item>
		<title>RDFa: bring some meaning to your site!</title>
		<link>http://lapasoft.wordpress.com/2011/02/26/rdfa-bring-some-meaning-to-your-site/</link>
		<comments>http://lapasoft.wordpress.com/2011/02/26/rdfa-bring-some-meaning-to-your-site/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 22:07:16 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[search engine optimization]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=227</guid>
		<description><![CDATA[This article is a brief introduction to RDFa semantic metadata used by Google and other search engines.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=227&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re wondering how to make your site look better in Google&#8217;s search result page you are in the right place.</p>
<p>You have probably seen all these fancy <a href="http://www.google.com/search?q=pancake+recipe">recipes</a>, that are available through Google. You can have that kind of attractive links to your site too. How to do that? Let the search engine (SE) understand what is the actual meaning of the information you have on your site. We will use <a href="http://en.wikipedia.org/wiki/RDFa">RDFa</a> for this purpose.</p>
<p>So the thing you need to do to help SE understand your site is mark specific type of information. For example if your site contains some information about certain people:</p>
<p><pre class="brush: xml;">
&lt;div&gt;
Mr. Bob Henderson is the CFO of Fiction Ltd. Friends call him Bob.
&lt;/div&gt;
</pre></p>
<p>There is a huge amount of valuable information in these short sentences. For now, this information is not explicitly visible to SE. </p>
<p><pre class="brush: xml;">
&lt;div xmlns:v=&quot;http://rdf.data-vocabulary.org/#&quot; typeof=&quot;v:Person&quot;&gt;
&lt;span property=&quot;v:title&quot;&gt;Mr.&lt;/span&gt; 
&lt;span property=&quot;v:name&quot;&gt;Bob Henderson&lt;/span&gt; 
is the &lt;span property=&quot;v:role&quot;&gt;CFO&lt;/span&gt; of 
&lt;span property=&quot;v:affiliation&quot;&gt;Fiction Ltd&lt;/span&gt;. 
Friends call him &lt;span property=&quot;v:nickname&quot;&gt;Bob&lt;/span&gt;.
&lt;/div&gt;
</pre></p>
<p>After inserting the code above not only human but also any good SE understands what is the meaning of the key words (like &#8220;CFO&#8221;, &#8220;Bob&#8221;) and their relationship to Bob Henderson. The semantic metadata is added in order for the SE to achieve better understanding of information.</p>
<p>This is only the very first step. Some say that it is the hardest step to make, but you should judge that on your own after studying these:</p>
<ul>
<li><a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;answer=99170">Google&#8217;s information about rich snippets</a>,</li>
<li><a href="http://rdf.data-vocabulary.org/">The definition of things we used in the example</a>,</li>
<li><a href="http://ebiquity.umbc.edu/blogger/2011/02/26/google-recipe-search-exploits-semantic-web-data-in-rdfa/">numerous blog posts about the whole concept</a>.</li>
</ul>
<p>Enjoy!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/227/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=227&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2011/02/26/rdfa-bring-some-meaning-to-your-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>
	</item>
		<item>
		<title>Neon lights inspiration</title>
		<link>http://lapasoft.wordpress.com/2011/02/07/neon-lights-inspiration/</link>
		<comments>http://lapasoft.wordpress.com/2011/02/07/neon-lights-inspiration/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 22:19:07 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[inspiration]]></category>
		<category><![CDATA[photo]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=217</guid>
		<description><![CDATA[I realized how inspiring neon lights can be. Maybe it was because I recently watched Ridley Scott&#8217;s Blade Runner with it&#8217;s extraordinary lighting. Or perhaps it is because of the never ending dark winter in my town allowing neon lights to shine twice as long as usual? Anyway, look at the pictures:<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=217&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I realized how inspiring neon lights can be.</p>
<p>Maybe it was because I recently watched Ridley Scott&#8217;s <a href="http://bladerunnerthemovie.warnerbros.com/">Blade Runner </a>with it&#8217;s extraordinary lighting. Or perhaps it is because of the never ending dark winter in my town allowing neon lights to shine twice as long as usual?</p>
<p>Anyway, look at the pictures:</p>
<p style="text-align:center;"><a href="http://wroclawzwyboru.pl/2010/09/15/neon-dobry-wieczor-we-wroclawiu-zaswiecil.html"><img class="aligncenter" title="the neon light of Wroclaw " src="http://wroclawzwyboru.pl/wp-content/uploads/2010/09/neon3.jpg" alt="Good evening in Wroclaw" width="367" height="246" /></a></p>
<p style="text-align:center;"><a href="http://www.ninjavspenguin.com/blog/2007/10/20/blade-runner-concept-art/"><img class="aligncenter" title="Blade Runner concept art" src="http://www.ninjavspenguin.com/blog/wp-content/uploads/2007/10/downtown2.jpg" alt="" width="504" height="326" /></a></p>
<p style="text-align:center;"><a title="By [2] ([1]) [CC-BY-2.0 (www.creativecommons.org/licenses/by/2.0)], via Wikimedia Commons" href="http://commons.wikimedia.org/wiki/File:HK_Nathan_Road_Jordan_Section_2009.jpg"><img class="aligncenter" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/HK_Nathan_Road_Jordan_Section_2009.jpg/512px-HK_Nathan_Road_Jordan_Section_2009.jpg" alt="HK Nathan Road Jordan Section 2009" width="512" /></a></p>
<p><a href="http://blog.seattlepi.com/ramblinman/archives/236511.asp"><img alt="" src="http://blog.seattlepi.com/ramblinman/library/800px-Fremont_Street_1952.JPG" title="Las Vegas" class="aligncenter" width="470" height="313" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/217/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=217&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2011/02/07/neon-lights-inspiration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>

		<media:content url="http://wroclawzwyboru.pl/wp-content/uploads/2010/09/neon3.jpg" medium="image">
			<media:title type="html">the neon light of Wroclaw </media:title>
		</media:content>

		<media:content url="http://www.ninjavspenguin.com/blog/wp-content/uploads/2007/10/downtown2.jpg" medium="image">
			<media:title type="html">Blade Runner concept art</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/HK_Nathan_Road_Jordan_Section_2009.jpg/512px-HK_Nathan_Road_Jordan_Section_2009.jpg" medium="image">
			<media:title type="html">HK Nathan Road Jordan Section 2009</media:title>
		</media:content>

		<media:content url="http://blog.seattlepi.com/ramblinman/library/800px-Fremont_Street_1952.JPG" medium="image">
			<media:title type="html">Las Vegas</media:title>
		</media:content>
	</item>
		<item>
		<title>Pixel Bender Filters and Algorithms (via Professional Papervision3D Book)</title>
		<link>http://lapasoft.wordpress.com/2010/06/09/pixel-bender-filters-and-algorithms-via-professional-papervision3d-book/</link>
		<comments>http://lapasoft.wordpress.com/2010/06/09/pixel-bender-filters-and-algorithms-via-professional-papervision3d-book/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 21:07:14 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[pixel bender]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/2010/06/09/pixel-bender-filters-and-algorithms-via-professional-papervision3d-book/</guid>
		<description><![CDATA[This post is an introduction to Pixel Bender and it&#8217;s basic capabilities. It has a lot of useful links to other important sites. Intro Lee Brimlow has two really good video tutorials that will help you get over the hump of learning pixel bender &#8211; so I won&#8217;t repeat those. Check them out below! Learn [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=205&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post is an introduction to Pixel Bender and it&#8217;s basic capabilities. It has a lot of useful links to other important sites.</p>
<blockquote style="overflow:hidden;"><p><a title="Visit Post" href="http://professionalpapervision.wordpress.com/?p=1335"><img class="align-left thumbnail alignleft left" style="max-width:100%;" src="http://professionalpapervision.files.wordpress.com/2009/03/imagepxlbnd.png?w=164&#038;h=100&#038;h=100" alt="Pixel Bender Filters and Algorithms" width="164" height="100" /></a> Intro Lee Brimlow has two really good video tutorials that will help you get over the hump of learning pixel bender &#8211; so I won&#8217;t repeat those. Check them out below! Learn Pixel Bender Putting Filters into Flash 10 But in this post, I&#8217;ll give you a ton of pixel bender filter algorithms and programs. Keep in mind pixel bender is extremely easy to use and extremely easy to learn!!! I once took a filters class, never thought I&#8217;d ever use it. I was up … <a title="Visit Post" href="http://professionalpapervision.wordpress.com/?p=1335">Read More</a></p></blockquote>
<p>via <a title="Professional Papervision3D Book" href="http://professionalpapervision.wordpress.com/?p=1335">Professional Papervision3D Book</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/205/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=205&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2010/06/09/pixel-bender-filters-and-algorithms-via-professional-papervision3d-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>

		<media:content url="http://professionalpapervision.files.wordpress.com/2009/03/imagepxlbnd.png?w=164&#38;h=100" medium="image">
			<media:title type="html">Pixel Bender Filters and Algorithms</media:title>
		</media:content>
	</item>
		<item>
		<title>Pixel Bender: Blur with Linear Focus (via Pixelero)</title>
		<link>http://lapasoft.wordpress.com/2010/06/09/pixel-bender-blur-with-linear-focus-via-pixelero/</link>
		<comments>http://lapasoft.wordpress.com/2010/06/09/pixel-bender-blur-with-linear-focus-via-pixelero/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 21:00:48 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[pixel bender]]></category>
		<category><![CDATA[actionscript 3.0]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/2010/06/09/pixel-bender-blur-with-linear-focus-via-pixelero/</guid>
		<description><![CDATA[Nice, clean and inspiring article about creating interesting effect in Pixel Bender. Truly awesome An old effect in photography I wanted to check out as a custom shader for Flash 10 Astro &#8211; beta version needed for this demo to show correctly: Pixel Bender -bytecode. Pixel Bender -source. LinearBlurFilter.as. It works with three parameters: one [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=204&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nice, clean and inspiring article about creating interesting effect in Pixel Bender. Truly awesome <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<blockquote style="overflow:hidden;"><p><a title="Visit Post" href="http://pixelero.wordpress.com/?p=85"><img class="align-left thumbnail alignleft left" style="max-width:100%;" src="http://www.petrileskinen.fi/Actionscript/FocusingLinearBlur/BlurSample01.png?h=100" alt="Pixel Bender: Blur with Linear Focus" height="100" /></a> An old effect in photography I wanted to check out as a custom shader for Flash 10 Astro &#8211; beta version needed for this demo to show correctly: Pixel Bender -bytecode. Pixel Bender -source. LinearBlurFilter.as. It works with three parameters: one float3 for line equation where the picture appears sharp (coefs like in Ax+By+C=0, in the demo there&#8217;s two dragable blue blocks to modify that), two scales for the blur radius, in parallel and perpendicu … <a title="Visit Post" href="http://pixelero.wordpress.com/?p=85">Read More</a></p></blockquote>
<p>via <a title="Pixelero" href="http://pixelero.wordpress.com/?p=85">Pixelero</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/204/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/204/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/204/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=204&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2010/06/09/pixel-bender-blur-with-linear-focus-via-pixelero/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>

		<media:content url="http://www.petrileskinen.fi/Actionscript/FocusingLinearBlur/BlurSample01.png?h=100" medium="image">
			<media:title type="html">Pixel Bender: Blur with Linear Focus</media:title>
		</media:content>
	</item>
		<item>
		<title>Pixel Bender tutorial: circular blur shader</title>
		<link>http://lapasoft.wordpress.com/2010/06/06/pixel-bender-tutorial-circular-blur-shader/</link>
		<comments>http://lapasoft.wordpress.com/2010/06/06/pixel-bender-tutorial-circular-blur-shader/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 17:55:36 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[pixel bender]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3.0]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=160</guid>
		<description><![CDATA[This post describes the way of using PixelBender and actionscript 3.0 to implement circular blur shader useful in animation of rotating objects.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=160&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There is one particular thing missing in the  standard AS3 filters library. The circular blur filter. That kind of a filter would surely come in handy if you wanted to animate rotating elements. If it&#8217;s not there, then we have to implement it ourselves. Using <a title="Adobe Pixel Bender" href="http://www.adobe.com/devnet/pixelbender/">Pixel Bender</a>.</p>
<p><a href="http://lapasoft.files.wordpress.com/2010/06/nysa1.png"><img class="aligncenter size-medium wp-image-191" title="Nysa" src="http://lapasoft.files.wordpress.com/2010/06/nysa1.png?w=300&#038;h=212" alt="" width="300" height="212" /></a></p>
<p>What should be the input data of our shader?</p>
<ul>
<li>First of all the <strong>image </strong>to process.</li>
<li>Then we must know where is the <strong>center </strong>of our circular blur.</li>
<li>It would be nice to know the <strong>blur level</strong>.</li>
<li>Since our effect will be used along with animation we should also know the rotation&#8217;s <strong>direction</strong>.<span id="more-160"></span></li>
</ul>
<p>There is one thing missing here. You can see that in the built-in implementation of the blur filter you can set the <strong>quality</strong> of blurring. In fact, we will include this parameter in our actionscript too, but not in the Pixel Bender shader. We are going to utilize the method presented in <a title="Pixelero" href="http://pixelero.wordpress.com/2008/08/28/pixel-bender-blur-with-linear-focus/">this post</a>, which means that we will be processing the input image several times with several circular blur shaders. The number of passes will be directly connected with the quality parameter. Why do we need several shaders? This is due to the prosaic fact that Pixel Bender doesn&#8217;t support loops.</p>
<p>Let&#8217;s now focus a little bit on the direction and the blur level parameters. The best way to represent the blur level in circular blur is to use the angle of blur. It can be negative or positive. Thus, it can represent clockwise as well as counterclockwise blurring movements.</p>
<p>So here is the shader:</p>
<p><pre class="brush: plain;">
&lt;languageVersion: 1.0;&gt;
kernel CircularBlur
&lt;
	namespace: &quot;com.wordpress.lapasoft&quot;;
	vendor: &quot;LapaSoft&quot;;
	version: 1;
	description: &quot;Circular blur shader&quot;;
&gt;
{
	input image4 source;
	output pixel4 target;

	const float pi = 3.1415;

	parameter float blurLevel
    &lt;
        minValue : -360.0;
        maxValue : 360.0;
        defaultValue : 0.0;
        description : &quot;The angle of blur&quot;;
    &gt;;

    parameter float2 rotationCenter
    &lt;
        defaultValue : float2(0.0, 0.0);
        description : &quot;The center point of rotation&quot;;
    &gt;;

	void evaluatePixel()
	{
		float2 position = outCoord();
		float2 translation = -rotationCenter;

		float angle = radians(blurLevel);

 		float sine = sin(angle);
 		float cosine = cos(angle);
 		float2x2 rotation = float2x2(cosine, -sine,
								sine, cosine);

		position = position + translation;
		position = position * rotation;
		position = position - translation;

		pixel4 thisPixel = sample(source, outCoord());
		pixel4 rotatedPixel = sample(source, position);

		target.rgba = mix(thisPixel.rgba, rotatedPixel.rgba, 0.5);
	}
}
</pre></p>
<p>The shader simply calculates the position of the  currently evaluated pixel rotated by a given angle around a given point. Next, both points are sampled and the output color is calculated as an average of both samples.</p>
<p>If you use the shader right away you&#8217;ll see that it hardly blurs anything. It simply copies the image and rotates it. See the picture below.</p>
<p><a href="http://lapasoft.files.wordpress.com/2010/06/nysa.png"><img class="aligncenter size-medium wp-image-188" title="Nysa" src="http://lapasoft.files.wordpress.com/2010/06/nysa.png?w=300&#038;h=217" alt="" width="300" height="217" /></a></p>
<p>To obtain the desired blur effect we have to use the shader several times using actionscript. Here is the class:</p>
<p><pre class="brush: as3;">
// Code was based on the work of pixelero
// see links on the bottom of this post

package com.lapasoft
{

	import flash.display.Shader;
	import flash.events.*;
	import flash.net.*;
	import spark.filters.ShaderFilter;

	public class CircularBlurFilter extends EventDispatcher {

		private var _quality:int = 1;

		private var _rotationCenterX:Number = 0.0;
		private var _rotationCenterY:Number = 0.0;

		private var _shaders:Array = [];
		private var _blurLevel:Number = 0;

		public var filters:Array = [];

		public var isLoaded:Boolean = false;
		private var shaderLoader:URLLoader;

		public function CircularBlurFilter(rotationCenterX:Number, rotationCenterY:Number, quality:int, blurLevel:Number)
		{
			_quality = quality;
			_blurLevel = blurLevel;
			_rotationCenterX = rotationCenterX;
			_rotationCenterY = rotationCenterY;

			// load shader bytecode
			shaderLoader = new URLLoader();
			shaderLoader.dataFormat = URLLoaderDataFormat.BINARY;
			// add COMPLETE event listener to the loader
			shaderLoader.addEventListener(Event.COMPLETE, shaderLoaded);
			// Use your own path to the pbj file here
			shaderLoader.load(new URLRequest(&quot;../pbj/CircularBlur.pbj&quot;));
		}

		private function shaderLoaded(event:Event):void {
			// create shaders and filters
			_shaders = new Array(_quality);
			filters = new Array(_quality);

			for (var i:int=0; i&lt;_quality; i++) {
				_shaders[i] = new Shader(shaderLoader.data);
				filters[i] = new ShaderFilter();
				filters[i].shader = _shaders[i];
				_shaders[i].data.rotationCenter.value = [_rotationCenterX, _rotationCenterY];
			}

			calculateBlurLevels();

			isLoaded=true;
			this.dispatchEvent(new Event(Event.COMPLETE));
		}

		public function setRotationCenter(x:Number, y:Number):void {
			for(var i:int = 0; i&lt;_quality; i++) {
				_shaders[i].data.rotationCenter.value = [x, y];
			}
		}

		public function set blurLevel(value:Number):void {
			_blurLevel = value;
			calculateBlurLevels();
		}

		public function set quality(value:Number):void {
			var q:Number = Math.max(Math.min(1, value), 15);
			if(q == _quality) {
				return;
			}

			_quality = q;

			_shaders = new Array(_quality);
			filters = new Array(_quality);

			for (var i:int=0; i&lt;_quality; i++) {
				_shaders[i] = new Shader(shaderLoader.data);
				filters[i] = new ShaderFilter();
				filters[i].shader = _shaders[i];

				_shaders[i].data.rotationCenter.value = [_rotationCenterX, _rotationCenterY];
			}

			calculateBlurLevels();
		}

		//this function calculates the blur levels so they look like x, x/2, x/4... their sum is == 1
		private function calculateBlurLevels():void {
			for(var i:int = 0; i&lt;_quality; i++) {
				_shaders[i].data.blurLevel.value = [_blurLevel*(Math.pow(2, _quality-i-1))/(Math.pow(2, _quality)-1)];
			}
		}

	}
}
</pre></p>
<p>Next, we can use the filters field of our CircularBlurFilter class to set the filters field of any DisplayObject. Note that the quality corresponds to the number of used filters. Lastly, we can admire the result of our work (quality=5, blurLevel=10):</p>
<p><a href="http://lapasoft.files.wordpress.com/2010/06/nysa1.png"><img class="aligncenter size-medium wp-image-191" title="Nysa" src="http://lapasoft.files.wordpress.com/2010/06/nysa1.png?w=300&#038;h=212" alt="" width="300" height="212" /></a></p>
<p>PS</p>
<p>Here is my inspiration for this post: <a href="http://pixelero.wordpress.com/2008/08/28/pixel-bender-blur-with-linear-focus/" target="_blank">http://pixelero.wordpress.com/2008/08/28/pixel-bender-blur-with-linear-focus/</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/160/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=160&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2010/06/06/pixel-bender-tutorial-circular-blur-shader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>

		<media:content url="http://lapasoft.files.wordpress.com/2010/06/nysa1.png?w=300" medium="image">
			<media:title type="html">Nysa</media:title>
		</media:content>

		<media:content url="http://lapasoft.files.wordpress.com/2010/06/nysa.png?w=300" medium="image">
			<media:title type="html">Nysa</media:title>
		</media:content>

		<media:content url="http://lapasoft.files.wordpress.com/2010/06/nysa1.png?w=300" medium="image">
			<media:title type="html">Nysa</media:title>
		</media:content>
	</item>
		<item>
		<title>Wymiar fraktalny</title>
		<link>http://lapasoft.wordpress.com/2010/01/27/wymiar-fraktalny/</link>
		<comments>http://lapasoft.wordpress.com/2010/01/27/wymiar-fraktalny/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 23:14:09 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[image processing]]></category>
		<category><![CDATA[fractals]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=130</guid>
		<description><![CDATA[We wpisie jest wyjaśnione znaczenie wymiaru fraktalnego i jego intuicyjny sens.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=130&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img src="/Users/Piotr/AppData/Local/Temp/moz-screenshot-5.png" alt="" /><img src="/Users/Piotr/AppData/Local/Temp/moz-screenshot-6.png" alt="" />Kiedy zaczynałem się uczyć o fraktalach zawsze, gdy wspominałem ich definicję, wpadałem w pewną konsternację . Definicja to coś co jest jasne, spójne, jednoznaczne. Jednak definicja fraktala (za <a title="Fraktal" href="http://pl.wikipedia.org/wiki/Fraktal" target="_blank">Wikipedią</a>) jest taka:</p>
<p>[...] zbiór, który:</p>
<ul>
<li>ma nietrywialną strukturę w każdej skali,</li>
<li>struktura ta nie daje się łatwo opisać w języku tradycyjnej geometrii euklidesowej,</li>
<li>jest samo-podobny, jeśli nie w sensie dokładnym, to przybliżonym lub stochastycznym,</li>
<li>jego <a title="Wymiar Hausdorffa" href="http://pl.wikipedia.org/wiki/Wymiar_Hausdorffa">wymiar Hausdorffa</a> jest większy niż jego <a title="Wymiar (matematyka)" href="http://pl.wikipedia.org/wiki/Wymiar_%28matematyka%29">wymiar topologiczny</a>,</li>
<li>ma względnie prostą definicję rekurencyjną,</li>
<li>ma <em>naturalny</em> (&#8220;poszarpany&#8221;, &#8220;kłębiasty&#8221; itp.) wygląd.</li>
</ul>
<p>Na pierwszy rzut oka nic nie jest tutaj jednoznacznie określone. Wszystko opiera się na intuicji. Może oprócz punktu piątego.<span id="more-130"></span></p>
<p>Ale o co chodzi z tym wymiarem? Wymiary są matematycznie zdefiniowane i przez to jednoznaczne. Ale z czym je kojarzyć?</p>
<p>Wymiar Hausdorffa (szerzej: wymiar fraktalny) jest pewną miarą tego, jak dana figura &#8220;wypełnia przestrzeń&#8221;. Np. prosta i odcinek wypełniają sobą w całości przestrzeń jednowymiarową. Kwadrat czy koło dwuwymiarową. Sześcian trójwymiarową. Wymiary fraktalne tych figur są liczbami całkowitymi. Ale np. krzywa Kocha (brzeg szarego obszaru na rysunku) jest tak poszarpana, że &#8220;zajmuje przestrzeń&#8221; w trochę większym stopniu niż linia, ale nie w aż tak wielkim jak np. kwadrat. Jej wymiar Hausdorffa jest liczbą pomiędzy 1 i 2.</p>
<p><a href="http://pl.wikipedia.org/w/index.php?title=Plik:Koch_Snowflake_7th_iteration.svg&amp;filetimestamp=20060929135443"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Koch_Snowflake_7th_iteration.svg/120px-Koch_Snowflake_7th_iteration.svg.png" alt="" width="120" height="120" /></a></p>
<p>Główna zasada jest taka, że im większy wymiar fraktalny, tym bardziej fraktal jest &#8220;zbity&#8221;. W przeciwnym wypadku jest &#8220;rozstrzelony&#8221; podobnie np. jak rozsypane ziarenka piasku.</p>
<p>Właśnie ta cecha wymiaru fraktalnego może być pomocna przy analizie obrazu. Pozwala ocenić &#8220;zbicie&#8221; figury niezależnie od jej wielkości.</p>
<p>PS</p>
<ul>
<li>Bardzo ciekawe informacje o fraktalach, wymiarze fraktalnym i nawet o kwestiach implementacyjnych z nimi związanych: <a title="On the Fractal Dimension of Computer Programs and its Application to the Prediction of the Cache Miss Ratio" href="http://portal.acm.org/citation.cfm?id=122235.1045578" target="_blank">http://classes.yale.edu/fractals/</a></li>
<li>Inne ciekawe zastosowanie wymiaru fraktalnego: <a title="On the Fractal Dimension of Computer Programs and its Application to the Prediction of the Cache Miss Ratio" href="http://portal.acm.org/citation.cfm?id=122235.1045578" target="_blank">http://portal.acm.org/citation.cfm?id=122235.1045578</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/130/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=130&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2010/01/27/wymiar-fraktalny/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Koch_Snowflake_7th_iteration.svg/120px-Koch_Snowflake_7th_iteration.svg.png" medium="image" />
	</item>
		<item>
		<title>Tutorial: Komunikacja Flex &#8211; php &#8211; MySQL poprzez ZendAMF</title>
		<link>http://lapasoft.wordpress.com/2009/12/05/tutorial-komunikacja-flex-php-mysql-poprzez-zendamf/</link>
		<comments>http://lapasoft.wordpress.com/2009/12/05/tutorial-komunikacja-flex-php-mysql-poprzez-zendamf/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 14:16:17 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3.0]]></category>
		<category><![CDATA[amf]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=119</guid>
		<description><![CDATA[Tutorial o komunikacji Flex -&#62; php -&#62; mySql z wykorzystaniem AMF<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=119&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>W jednym z poprzednich postów opisałem jak można się komunikować z php poprzez klasę LoadVars w actionscript 2.0. Szczerze mówiąc jest to trochę pokraczny sposób komunikacji. Komunikacja poprzez AMF (Action Message Format) jest dużo wygodniejsza i zapewnia większą przejrzystość kodu. Poprzez AMF nie przekazujemy sobie żadnych Stringów ani dokumentów XML ale całe obiekty.</p>
<p>Ten tutorial jest poświęcony Flexowi, ale oczywiście da się to zrobić i dla aplikacji flashowej (będzie to pewnie pokazane w kolejnej notce).</p>
<p>Zrobimy sobie prosty komponent będący po prostu listą linków, którą można zamieścić na stronie internetowej. Lista linków będzie pobierana z bazy danych.<span id="more-119"></span></p>
<p><strong>Środowisko</strong></p>
<p>Będziemy pracować na lokalnej maszynie, także trzeba ściągnąć sobie serwer obsługujący php i jeszcze serwer baz danych MySQL. Najlepiej jest pobrać sobie np. <a href="http://www.wampserver.com/en/download.php">WampServer</a>, bo zawiera w sobie wszystkie te rzeczy, a jego instalacja trwa może minutę. Oprócz tego potrzebujemy również implementacji AMF. W tym tutorialu użyjemy ZendAMF (części frameworku <a href="http://framework.zend.com/download/current/">Zend</a>). Do dzieła.</p>
<p>Po pierwsze instalujemy sobie Wampa. Po instalacji i uruchomieniu po wpisaniu w przeglądarce <a href="http://localhost/">http://localhost/</a> powinien się pojawić mniej więcej taki ekran:</p>
<p><a href="http://img689.imageshack.us/img689/4761/wampq.jpg"><img src="http://img689.imageshack.us/img689/4761/wampq.jpg" border="0" alt="" /></a><br />
Trzeba jeszcze stworzyć bazę danych, z której będzie korzystać nasza aplikacja. Najłatwiej po prostu kliknąć w link phpMyAdmin, który jest widoczny na powyższej stronie (po kliknięciu w ikonę wampa w trayu też można dostać się do phpMyAdmin). Trzeba stworzyć bazę danych o nazwie FLEX_LINKS a w niej tabelę LINKS o kolumnach ID (int, auto_number, primary key), URL (varchar(100)), SHORT_URL (varchar(25)), DESCRIPTION (varchar(50)). Żeby wszystko dobrze działało z polskimi literami najlepiej w każdym możliwym miejscu wybrać utf8 jako kodowanie.</p>
<p>Teraz rozpakowujemy sobie Zenda. Najważniejszym dla nas folderem jest library, gdzie przechowywane są pliki, z których będzie korzystał skrypt php, który zaraz stworzymy.</p>
<p><strong>PHP</strong></p>
<p>Potrzebujemy 3 rzeczy w php:</p>
<ul>
<li>Klasa definiująca obiekty przekazywane pomiędzy Flexem i php (/application/model/Link.php):</li>
</ul>
<div><pre class="brush: php;">
&lt;?php

class Link {
// url linku
public $url;

// krótki url będący wyświetlany na liście
public $shortUrl;

// opis wyswietlany pod linkiem
public $description;
}

?&gt;</pre></p>
</div>
<ul>
<li>Klasa definiująca usługi wywoływane przez Flexa  (/application/services/LinksService.php):</li>
</ul>
<div><pre class="brush: php;">// importowanie klasy Link
require_once dirname(__FILE__) . '/../model/Link.php';

class LinksService
{
private $connection;

// wygodnie jest tworzyć połączenie w konstruktorze
public function __construct()
{
// domyślny użytkownik bazy mySql Wampa
$this-&gt;connection = mysql_connect('localhost', 'root', '');

// aby poprawnie przekazywane były polskie znaki..
mysql_query(&quot;SET NAMES utf8&quot;);
mysql_query(&quot;SET CHARACTER_SET utf8_unicode_ci&quot;);
mysql_select_db('FLEX_LINKS');
}

// tą metodę będziemy mogli wywoływać z Flexa
// zwraca po prostu wszystkie zapisane linki
public function getAllLinks()
{
$links = array();
$result = mysql_query(&quot;SELECT * FROM LINKS ORDER BY ID&quot;, $this-&gt;connection);

while ($row = mysql_fetch_object($result))
{
$link = new Note();
$link-&gt;id = $row-&gt;ID;
$link-&gt;url = $row-&gt;URL;
$link-&gt;shortUrl = $row-&gt;SHORT_URL;
$link-&gt;description = $row-&gt;DESCRIPTION;

array_push($links, $link);
}

mysql_close($this-&gt;connection);
return $links;
}
}

?&gt;</pre></p>
</div>
<ul>
<li> Endpoint AMF (tutaj użyjemy ZendAMF) &#8211; z tą częścią będzie się komunikował bezpośrednio Flex   (/public/amf.php).</li>
</ul>
<div><pre class="brush: php;">&lt;?php
// ścieżka musi być ustalona tam, gdzie jest zawartość katalogu
// library wypakowanego z pliku
// ściągniętego ze strony zend framework
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '');

// import klasy Server z Zenda
require_once 'Zend/Amf/Server.php';

// tworzenie &lt;a href=&quot;http://framework.zend.com/manual/en/zend.amf.server.html&quot;&gt;serwera AMF&lt;/a&gt;
$server = new Zend_Amf_Server();

// usługi udostępniane przez ten amf będą klasami z tego folderu
$server-&gt;addDirectory(dirname(__FILE__) . '/../application/services');

// import klas definiujących model
require_once dirname(__FILE__) . '/../application/model/Link.php';

// ustawienie mapowań klas - pierwsza nazwa to klasa w AS a drugi w php
$server-&gt;setClassMap('Link', 'Link');

// start serwera
echo $server-&gt;handle();
?&gt;</pre></p>
</div>
<p>Foldery application i public zamieszczamy wraz ze znajdującymi się w nick plikami w folderze /www/FlexLinks. Teraz po wpisaniu w pasku adresu przeglądarki http://localhost/FlexLinks/public/amf.php powinien się pojawić napis ZendAMF Endpoint albo zacznie się ściągać dokument xml o właśnie takiej treści.</p>
<p>W php to już wszystko. Teraz przejdźmy do Flexa.</p>
<p><strong>Flex</strong></p>
<p>Projekt nazwiemy FlexLinks. Podczas tworzenia projektu należy w polu Application Server Type wybra PHP. Po kliknięciu Next trzeba podać ścieżkę do katalogu publicznego Wampa (np. D:\wamp\www) i jego adres URL (np. http://localhost). Podanie tych wszystkich danych usprawni proces zamieszczania flexowych aplikacji na serwerze.</p>
<p>Po utworzeniu projektu pierwszą rzeczą, którą zrobimy będzie określenie adresów i rodzajów usług, które będzie wykorzystywał Flex.We właściwościach projektu w sekcji Flex Compiler dodatkowe argumenty zmieniamy z domyślnych <strong>-locale en_US</strong> na <strong>-locale en_US -services &#8220;services-config.xml&#8221;</strong> . To wskaże kompilatorowi lokalizację pliku xml definiującego usługi. Teraz ten plik trzeba stworzyć. W katalogu src projektu Flexa tworzymy plik services-config.xml z następującą zawartością:</p>
<p><pre class="brush: xml;">
&lt;div&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;/div&gt;
&lt;div&gt;&lt;services-config&gt;&lt;/div&gt;
&lt;div&gt;&lt;services&gt;&lt;/div&gt;
&lt;div&gt;&lt;service id=&quot;zend-flashremoting-service&quot; class=&quot;flex.messaging.services.RemotingService&quot; messageTypes=&quot;flex.messaging.messages.RemotingMessage&quot;&gt;&lt;/div&gt;
&lt;div&gt;&lt;destination id=&quot;zend&quot;&gt;&lt;/div&gt;
&lt;div&gt;&lt;channels&gt;&lt;/div&gt;
&lt;div&gt;&lt;channel ref=&quot;my-zend&quot;/&gt;&lt;/div&gt;
&lt;div&gt;&lt;/channels&gt;&lt;/div&gt;
&lt;div&gt;&lt;properties&gt;&lt;/div&gt;
&lt;div&gt;&lt;source&gt;*&lt;/source&gt;&lt;/div&gt;
&lt;div&gt;&lt;/properties&gt;&lt;/div&gt;
&lt;div&gt;&lt;/destination&gt;&lt;/div&gt;
&lt;div&gt;&lt;/service&gt;&lt;/div&gt;
&lt;div&gt;&lt;/services&gt;&lt;/div&gt;
&lt;div&gt;&lt;channels&gt;&lt;/div&gt;
&lt;div&gt;&lt;channel-definition id=&quot;my-zend&quot;&gt;&lt;/div&gt;
&lt;div&gt;&lt;endpoint uri=&quot;http://localhost/FlexLinks/public/amf.php&quot;/&gt;&lt;/div&gt;
&lt;div&gt;&lt;/channel-definition&gt;&lt;/div&gt;
&lt;div&gt;&lt;/channels&gt;&lt;/div&gt;
&lt;div&gt;&lt;/services-config&gt;&lt;/div&gt;
</pre></p>
<p>Plik definiuje usługę wykorzystującą kanał AMF łączący się z naszym wcześniej stworzonym w php endpointem.</p>
<p>Teraz trzeba też zdefiniować klasę będącą odzwierciedleniem tego, co nam będzie przesyłać AMF. W katalogu src tworzymy katalog model i tam plik Link.as:</p>
<div><pre class="brush: as3;">package model
{
[RemoteClass]
[Bindable]
public class Link
{
public function Link()
{
}

public var id:int;
public var url:String;
public var shortUrl:String;
public var description:String;

}
}</pre></p>
</div>
<p>Nazwy pól są identyczne jak w klasie php. Nad klasą są dwa meta-tagi. Pierwszy oznacza, że jest to klasa przekazywana przez AMF, a drugi umożliwia związanie wszystkich właściwości klasy (<a href="http://livedocs.adobe.com/flex/3/html/metadata_3.html#198729">dokumentacja</a>).</p>
<p>Teraz w automatycznie utworzonym głównym dokumencie mxml naszej aplikacji (pewnie jest nazwany FlexLinks.mxml) trzeba utworzyć mechanizm wykorzystujący opisane usługi i wyświetlający je w jakiejś zgrabnej formie:</p>
<p><pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot; initialize=&quot;init()&quot;&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
import flash.net.navigateToURL;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
import mx.collections.ArrayCollection;
import model.*;
import renderers.*;

// metoda wykonywana po inicjalizacji aplikacji
private function init():void {
remoteObject.getAllLinks();
}

// tu będziemy przechowywać dane linków
[Bindable]
private var dataArray:ArrayCollection = new ArrayCollection();

// metoda obsługująca wywołanie metody getAllLinks
private function getAllLinksHandler(event:ResultEvent):void {
dataArray = new ArrayCollection(event.result as Array);
}

// metoda otwierająca nowe okno przeglądarki
public function navigateToLink(url:String):void {
navigateToURL(new URLRequest(url), &quot;_blank&quot;);
}
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:List x=&quot;10&quot; y=&quot;10&quot; id=&quot;linksList&quot; dataProvider=&quot;{dataArray}&quot; width=&quot;200&quot; height=&quot;273&quot;&gt;
&lt;mx:itemRenderer&gt;
&lt;mx:Component&gt;
&lt;mx:VBox xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;&gt;
&lt;mx:Button maxWidth=&quot;180&quot; label=&quot;{data.shortUrl}&quot; click=&quot;{parentApplication.navigateToLink(data.url)}&quot;/&gt;
&lt;mx:Text selectable=&quot;false&quot; paddingLeft=&quot;3&quot; width=&quot;160&quot; text=&quot;{data.description}&quot; /&gt;
&lt;mx:LinkButton paddingLeft=&quot;3&quot; label=&quot;Kopiuj link&quot;  textAlign=&quot;left&quot; click=quot;{System.setClipboard(data.url)}&quot;/&gt;
&lt;/mx:VBox&gt;
&lt;/mx:Component&gt;
&lt;/mx:itemRenderer&gt;
&lt;/mx:List&gt;

&lt;mx:RemoteObject id=&quot;remoteObject&quot; destination=&quot;zend&quot; source=&quot;LinksService&quot; fault=&quot;Alert(event.type.toString())&quot; showBusyCursor=&quot;true&quot;&gt;
&lt;mx:method name=&quot;getAllLinks&quot; result=&quot;getAllLinksHandler(event)&quot; fault=&quot;Alert(event.type.toString())&quot;/&gt;
&lt;/mx:RemoteObject&gt;

&lt;/mx:Application&gt;</pre></p>
<p>Dla komunikacji z wykorzystaniem AMF kluczowy jest tak definiujący remoteObject oraz jego metody. W atrybutach tego tagu podana jest nazwa usługi (klasy php zarejestrowanej w serwerze stworzonym za pomocą Zenda) i nazwa celu, pod którym jest endpoint ZendAMF.</p>
<p>Dodatkowym elementem jest sposób wyświetlania listy. Używamy własnego ItemRenderer aby zrobić to w miarę ładnie. Jest w nim zawarty przycisk przenoszący nas pod link i taki, który po naciśnięciu kopiuje link do schowka.</p>
<p>I to by było na tyle. Oczywiście w tagu RemoteObject można zdefiniować inne metody, których wykonanie np. zmienia coś w bazie danych (musiałoby to być zaimplementowane w klasie php), ale dla tej naszej miniaturowej aplikacji chyba nie ma to sensu. Dziękuję za uwagę <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ﻿</p>
<p>PS</p>
<p>Dla ciekawskich link do <a title="Census" href="http://www.jamesward.com/census/" target="_blank">Censusa</a>, czyli interaktywnego porównania różnych metod przesyłania danych do Flexa.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/119/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=119&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2009/12/05/tutorial-komunikacja-flex-php-mysql-poprzez-zendamf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>

		<media:content url="http://img689.imageshack.us/img689/4761/wampq.jpg" medium="image" />
	</item>
		<item>
		<title>Tutorial Flash i PHP oraz MySQL w AS 2.0</title>
		<link>http://lapasoft.wordpress.com/2009/11/13/tutorial-flash-i-php-oraz-mysql-w-as-2-0/</link>
		<comments>http://lapasoft.wordpress.com/2009/11/13/tutorial-flash-i-php-oraz-mysql-w-as-2-0/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 13:18:39 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 2.0]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=101</guid>
		<description><![CDATA[Jak połączyć się z bazą danych MySQL poprzez Flasha? Używając PHP. Ten wpis jest o tym, jak to zrobić.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=101&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj krótki opis tego jak połączyć te trzy technologie. Dlaczego akurat te trzy? Bo tak naprawdę Flash jest fajny a php i MySQL są za darmo <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Komunikacja przebiega w kilku etapach:</p>
<ol>
<li>Flash wysyła <em>żądanie </em>do skryptu php.</li>
<li>Skrypt php łączy się z bazą danych MySQL i wysyła do niej <em>zapytanie </em>w SQL.</li>
<li>Baza zwraca <em>wynik </em>do skryptu.</li>
<li>Skrypt generuje z wyniku <em>dane </em>w formacie strawnym dla Flasha.</li>
<li>Flash <em>odczytuje </em>dane i je wyświetla.</li>
</ol>
<p><span id="more-101"></span>Mamy we flashu przycisk i chcemy, aby po jego naciśnięciu w polu tekstowym pojawił się napis, którego elementami będą dane ze skryptu php. W pierwszej klatce zamieszczamy sobie taki kod:</p>
<p><pre class="brush: as3;">
stop();
// tworzymy sobie obiekty przechowujące
// dane wysyłane i otrzymywane przez flasha
var varsOut:LoadVars = new LoadVars();
var varsIn:LoadVars = new LoadVars();
// po naciśnięciu przycisku
button_btn.onRelease = function() {
// zapisujemy zmiennych wyjściowych
// jakąś wartość dla skryptu php
varsOut.outVar = 10;
// zmienne wyjściowe są wysyłane do script.php
// wynik zostanie zapisany w varsIn
// a wykorzystana zostanie metoda POST
varsOut.sendAndLoad(&quot;script.php&quot;,varsIn,&quot;POST&quot;);
};
// kiedy już załaduje się to,
// co dostaniemy jako wynik skryptu
varsIn.onLoad = function(success) {
if (success) {
// jak się udało to zaktualizuj tekst w polu
textArea_txt.text = &quot;Odczytane dane to:\n&quot; + varsIn.myVar;
textArea_txt.text += &quot;\ni\n&quot;+ varsIn.myVar2;
} else {
// a jak nie to wypisz tam komunikat
textArea_txt.text = &quot;Nie udało się odczytać danych.&quot;;
}
};</pre></p>
<p>Kod jest wyjaśniony przez moje komentarze. Teraz brakuje nam tylko skryptu php.</p>
<p><pre class="brush: php;">
&lt;?php
// odbieramy z żądania parametr
$outVar= $_POST['outVar'];

// łączymy się z MySQL
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');

// wybieramy bazę danych
mysql_select_db('my_database');

// tworzymy zapytanie (uwaga na SQL Injection!)
$query = &quot;SELECT * FROM my_table WHERE id=$outVar&quot;;

// wykonujemy zapytanie
$result = mysql_query($query);

// czytamy rezultaty
$line = mysql_fetch_array($result, MYSQL_ASSOC);

// zapisujemy rezultaty
$myVar = $line['my_column1'];
$myVar2 = $line['my_column2'];

// wypisujemy
echo(&quot;myVar=$myVar&amp;amp;myVar2=$myVar2&amp;amp;&quot;);
// końcowy '&amp;amp;' się przydaje, bo
// często ktoś coś nam dokleja do wyniku skryptu
// i nie chcielibyśmy aby zostało to potraktowane

// jako część wartości myVar2
// zwalniamy pamięć i zamykamy połączenie z bazą
mysql_free_result($result);
mysql_close($link);

?&gt;
</pre></p>
<p>Oczywiście w bazie danych musi istnieć tabela, która ma odpowiednią nazwę i zwiera odpowiednie dane.</p>
<p>Skrypt po prostu nam tworzy taki ciąg: zmienna1=wartość1&amp;zmienna2=wartość2&amp; &#8230;</p>
<p>Na dobrą sprawę jeżeli byśmy zamiast wczytywać wynik działania skryptu php zechcieli wczytać plik tekstowy z takim ciągiem to niczym by się to nie różniło. Może tym, że w skrypcie możemy połączyć się z bazą danych i z niej wyciągnąć jakieś potrzebne rzeczy <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Żeby usprawnić przekazywanie parametrów można np. w skrypcie php wartości zwracane przez ten skrypt zapisać w formie tablicy asocjacyjnej, a następnie potraktować funkcją <a href="http://php.net/manual/en/function.http-build-query.php">http_build_query</a>.</p>
<p>Jeszcze jedna uwaga. Jak widać zarówno flash jak i php muszą zapisywać dane w zmiennych o nazwach, które są wzajemnie znane skryptowi flash i php. Inaczej manipulowanie nimi jest niewygodne. Dlatego ta metoda przesyłania danych pomiędzy php i flashem sprawdza się kiedy wysyłamy i zwracamy dane o znanej z góry długości (np. dane pojedynczego rekordu z bazy danych a nie zmiennej liczby rekordów).</p>
<p>To samo da się zrobić używając klasy XML a nie LoadVars. Wtedy oczywiście wszystko będzie przesyłane w formacie XML.</p>
<p>Szczerze mówiąc, to odkąd zaczynam się zaznajamiać z AMF przedstawiony wyżej sposób komunikacji przestaje mi się w ogóle podobać. Także czekajcie na posta o AMF <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=101&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2009/11/13/tutorial-flash-i-php-oraz-mysql-w-as-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>
	</item>
		<item>
		<title>Flash CS4: problem ze skalowaniem i obrotem 3D</title>
		<link>http://lapasoft.wordpress.com/2009/11/05/flash-cs4-problem-ze-skalowaniem-i-obrotem-3d/</link>
		<comments>http://lapasoft.wordpress.com/2009/11/05/flash-cs4-problem-ze-skalowaniem-i-obrotem-3d/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 14:44:37 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3.0]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=86</guid>
		<description><![CDATA[Opis problemu z Flash CS4 i jego rozwiązania.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=86&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Kiedyś miałem do zrobienia małą animację, która miała polegać na obrocie obrazka wokół osi Y (w trójwymiarze). Obrazek oczywiście wcześniej było trzeba zeskalować. Właściwie była to moja pierwsza styczność z nowymi możliwościami Flasha CS4 co do trójwymiaru. Więc kod, który służył do skalowania i obrotu wyglądał tak:<br />
<pre class="brush: as3;">
obrazek.scaleY=0.6; //         skalowanie
obrazek.scaleX=0.6; //         skalowanie
TweenLite.to(obrazek, 3, {rotationY:360, ease:Strong.easeIn});
// animacja polegająca na zmianie atrybutu rotationY
// wykorzystuje GreenSock TweenLite
</pre><br />
Wydaje się to wszystko bezproblemowe: zmniejszam obrazek i obracam. <a href="http://www.fileden.com/files/2009/9/23/2583279/problemScaleRotation3D.swf">Tak to wygląda</a> w przeglądarce.</p>
<p>Fajne, ale czemu w ogóle o tym piszę? Bo kiedy w środowisku Flasha kliknę &#8220;Test movie&#8221; wyświetlane jest to inaczej! Tak samo jak wtedy, gdy Flash Playerem otworzę plik swf znajdujący się u mnie na dysku, albo uruchomię <a href="http://www.fileden.com/files/2009/9/23/2583279/problemScaleRotation3D.zmien_na_exe">plik </a>Windows Projector z tą animacją. Wtedy podczas obrotu wokół osi Y obrazek skaluje płynnie się do swojej początkowej wartości scaleX (jest analogicznie, kiedy obraca się wokół osi X). O co w ogóle chodzi? Przecież nie zmieniam scaleX!</p>
<p>Czemu inaczej wyświetla w Projectorze i w przeglądarce? Różne wersje Flash Playera? Nie wiem. Ale sprawa skalowana jest z pewnością spowodowana tym, że obiekty są domyślnie we Flashu dwuwymiarowe. Ich pozycja jest opisana macierzą przekształceń liniowych dla 2 wymiarów (w takim wypadku jest to macież 3&#215;3). Obiekt staje się trójwymiarowy wtedy, kiedy np zaczniemy zmieniać jakiś jego atrybut związany z trójwymiarem (np. rotationX). Wtedy macierz dla 2 wymiarów jest przekształcana na taką dla trzech. Do macierzy można się dostać tak:</p>
<p><pre class="brush: as3;">
obrazek.transform.matrix; // macierz dla 2D
obrazek.transform.matrix3D; // macierz dla 3D
</pre></p>
<p>Problemem jest to, że nie ustawiliśmy scaleZ. Można go uniknąć wymuszając przejście do macierzy 3D <em>przed</em> skalowaniem. Np. w taki sposób:</p>
<p><pre class="brush: as3;">
obrazek.transform.matrix = null;
// automatycznie tworzy się macierz 3D
obrazek.scaleX = 0.5;
obrazek.scaleY = 0.5;
obrazek.scaleZ = 0.5;
// skalowanie
</pre></p>
<p><a title="Dokumentacja" href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/geom/Transform.html#matrix" target="_blank">dokumentacja</a></p>
<p>Trzeba też pamiętać, że jeżeli chcemy równomiernie powiększać nasz obiekt, to musimy robić to nie tylko za pomocą scaleX i scaleY, ale również scaleZ!</p>
<div style="font-family:&amp;"></div>
<div style="font-family:&amp;"><span style="font-family:inherit;">Więcej o macierzach <a href="http://www.senocular.com/flash/tutorials/transformmatrix/">znajdziecie tutaj</a>.</span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/86/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=86&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2009/11/05/flash-cs4-problem-ze-skalowaniem-i-obrotem-3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>
	</item>
		<item>
		<title>Wykrywanie linii za pomocą transformaty Hough&#8217;a</title>
		<link>http://lapasoft.wordpress.com/2009/11/04/wykrywanie-linii-za-pomoca-transformaty-hougha/</link>
		<comments>http://lapasoft.wordpress.com/2009/11/04/wykrywanie-linii-za-pomoca-transformaty-hougha/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 09:38:10 +0000</pubDate>
		<dc:creator>Piotr</dc:creator>
				<category><![CDATA[image processing]]></category>
		<category><![CDATA[transformata hough'a]]></category>
		<category><![CDATA[wykrywanie krawędzi]]></category>

		<guid isPermaLink="false">http://lapasoft.wordpress.com/?p=76</guid>
		<description><![CDATA[Ten wpis opisuje transformatę Hough'a (Hough transform) i jej użycie do wykrywania linii na obrazie.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=76&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Wykrywanie kształtów na obrazie jest chyba najbardziej klasycznym problemem analizy obrazów. Jednym z najprostszych i zarazem najbardziej użytecznych kształtów do wykrycia są linie proste, które w łatwy sposób można wyznaczyć używając transformaty Hough&#8217;a (TH). Swoją drogą Hough czyta się (jak poucza nieoceniona wikipedia) podobnie do angielskiego słowa rough, czyli z grubsza &#8220;haf&#8221;.<span id="more-76"></span></p>
<p>Typowy schemat użycia transformaty wygląda następująco:</p>
<ol>
<li>Obraz wejściowy <a href="http://2.bp.blogspot.com/_6moQ1rxVDi4/SubZvGGd0cI/AAAAAAAAAAc/W1iG2p-60IM/s1600-h/hough1.jpg"><img class="aligncenter" style="border:0 none;" src="http://2.bp.blogspot.com/_6moQ1rxVDi4/SubZvGGd0cI/AAAAAAAAAAc/W1iG2p-60IM/s320/hough1.jpg" border="0" alt="" width="320" height="320" /></a></li>
<li>Wykrycie krawędzi<a href="http://2.bp.blogspot.com/_6moQ1rxVDi4/SubaNmrbf5I/AAAAAAAAAAk/1BoJLRRsleE/s1600-h/hough2.jpg"><img class="aligncenter" style="border:0 none;" src="http://2.bp.blogspot.com/_6moQ1rxVDi4/SubaNmrbf5I/AAAAAAAAAAk/1BoJLRRsleE/s320/hough2.jpg" border="0" alt="" width="320" height="320" /></a></li>
<li>Transformata Hough&#8217;a <a href="http://2.bp.blogspot.com/_6moQ1rxVDi4/Subdw73WNdI/AAAAAAAAAAs/dmOsLkygOOs/s1600-h/hough3.jpg"><img class="aligncenter" style="border:0 none;" src="http://2.bp.blogspot.com/_6moQ1rxVDi4/Subdw73WNdI/AAAAAAAAAAs/dmOsLkygOOs/s320/hough3.jpg" border="0" alt="" width="320" height="202" /></a></li>
<li>Wybranie linii na podstawie wyniku TH czyli przestrzeni Hough&#8217;a<a href="http://1.bp.blogspot.com/_6moQ1rxVDi4/SubeJSYjPpI/AAAAAAAAAA0/u9oprtMSPbE/s1600-h/hough4.jpg"><img class="aligncenter" style="border:0 none;" src="http://1.bp.blogspot.com/_6moQ1rxVDi4/SubeJSYjPpI/AAAAAAAAAA0/u9oprtMSPbE/s320/hough4.jpg" border="0" alt="" width="320" height="320" /></a></li>
</ol>
<p>Szybkie, miłe i przyjemne? Nie do końca.</p>
<p>Wykrywanie krawędzi oczywiście nie stanowi problemu. Wystarczy użyć któregoś z dostępnych i dobrze udokumentowanych algorytmów. Na obrazie przedstawiony jest wynik działania wykrywania krawędzi metodą Canny&#8217;ego (Canny edge detector), którego implementacja w Javie jest dostępna za <a href="http://www.tomgibara.com/computer-vision/canny-edge-detector">darmo</a>.</p>
<p>Teraz pora na TH. Załóżmy, że obrazem wejściowym dla TH jest taki obraz, którego pixele mogą być tylko białe lub czarne. Czarne mogą oznaczać krawędź a białe jej brak. Każdy czarny pixel &#8220;głosuje&#8221; na wszystkie przechodzące przez niego linie. Wynikiem tej operacji jest zbiór wszystkich możliwych linii z przypisami do nich liczbami głosów. To właśnie przestrzeń Hough&#8217;a. Te linie, które zawierają najwięcej czarnych pixeli będą miały najwięcej głosów i właśnie je wybieramy w kolejnym kroku postępowania.</p>
<p>Teraz trzeba tylko określić jak zapisać &#8220;wszystkie możliwe&#8221; linie na obrazku. Z podstawówki wiadomo, że wykres funkcja liniowej ma wzór:</p>
<p>y = ax+b ,</p>
<p>gdzie a i b to współczynniki równania. Wykresem takiej funkcji jest linia. Czyli linie można zapisać po prostu jako pary współczynników a oraz b. Musimy sobie jeszcze ustalić z jakich przedziałów mogą pochodzić wartości współczynników. Mając czarny pixel o znanych współrzędnych x oraz y dla każdej możliwej wartość a obliczamy wartość b i dla każdej tak otrzymanej pary (a, b) zwiększamy liczbę głosów jej przyporządkowanej.</p>
<p>To podejście jest użyte w <a href="http://www.rob.cs.tu-bs.de/content/04-teaching/06-interactive/Hough.html">applecie</a>, który znalazłem na stronach <a href="http://www.rob.cs.tu-bs.de/">Politechniki Brunszwickiej</a>. Wystarczy jednak zobaczyć co się stanie, jeżeli na obrazie wejściowym pojawi się linia pionowa żeby przekonać się o niedoskonałości takiej reprezentacji. Po prostu linii pionowej nie da się tak zapisać. Dlatego częściej w użyciu jest inna reprezentacja.</p>
<p>Prostą można przedstawić jako odległość prostej od początku układu współrzędnych (ρ) i kąt pomiędzy odcinkiem łączącym prostą i początek układu współrzędnych a osią OX (θ).</p>
<p style="text-align:center;"><a href="http://4.bp.blogspot.com/_6moQ1rxVDi4/Sucz7Gya_3I/AAAAAAAAAA8/VYpCoof6ANc/s1600-h/hough10.jpg"><img class="aligncenter" style="border:0 none;" src="http://4.bp.blogspot.com/_6moQ1rxVDi4/Sucz7Gya_3I/AAAAAAAAAA8/VYpCoof6ANc/s320/hough10.jpg" border="0" alt="" width="320" height="203" /></a></p>
<p>Wzór tak określonej prostej wygląda następująco:</p>
<p>ρ = x cos(θ) + y sin(θ) .</p>
<p>Taka reprezentacja jest użyta w <a href="http://users.cs.cf.ac.uk/Paul.Rosin/CM0311/dual2/hough.html">tym</a> applecie.</p>
<p>Mamy już przestrzeń Hough&#8217;a (przedstawia ją obraz w 3. punkcie), ale trzeba jeszcze z niej &#8220;wyciągnąć&#8221; najlepsze linie.</p>
<p>Jak widać na ilustracji przy punkcie 3. przestrzeń Hough&#8217;a prawie zawsze jest dość &#8220;poszarpana&#8221; co zdecydowanie utrudnia wyłowienia z niej tych linii, które są naprawdę istotne dla obrazu. Przestrzeń zatem należy wygładzić a później znaleźć na niej maksima lokalne, które będą reprezentowały najistotniejsze linie.</p>
<p>Na obrazie przy punkcie 4. przedstawiono wyniki takiej operacji. Jak widać nie eliminuje ona wszystkich &#8220;dublujących&#8221; się linii o podobnym umiejscowieniu, jednak w znacznym stopniu zmniejsza ich liczbę.</p>
<p>To chyba wszystko jeżeli chodzi o TH dla linii prostych. Oczywiście wymyślono rozliczne usprawnienia i modyfikacje TH takie jak ograniczenie &#8220;aktywnego&#8221; obszaru przestrzeni Hough&#8217;a, wykorzystanie informacji o ułożeniu pixeli krawędzi na obrazie w celu zmniejszenia liczby głosów. Na dodatek TH została również wykorzystana do rozpoznawania krzywych, okręgów i innych kształtów (uogólniona transformata Hough&#8217;a). W miarę proste i jednocześnie silne narzędzie.</p>
<p>Użyte obrazy pochodzą z prac:</p>
<p><a href="http://www.inf.ufrgs.br/%7Elaffernandes/kht.html">Leandro                A. F. Fernandes</a>, Manuel M. Oliveira. <em>Real-time line detection                through an improved Hough transform voting scheme</em>. Pattern                Recognition (PR), Elsevier, 41:1, 2008. pp. 299-314.</p>
<p>oraz</p>
<p>R.O. Duda and P.E. Hart,<em> </em><em>Use of the Hough Transformation to Detect Lines and Curves in Pictures</em>. CACM, 1972, 15(1), pp. 11-15. 2.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lapasoft.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lapasoft.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lapasoft.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lapasoft.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lapasoft.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lapasoft.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lapasoft.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lapasoft.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lapasoft.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lapasoft.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lapasoft.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lapasoft.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lapasoft.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lapasoft.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lapasoft.wordpress.com&amp;blog=7969059&amp;post=76&amp;subd=lapasoft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lapasoft.wordpress.com/2009/11/04/wykrywanie-linii-za-pomoca-transformaty-hougha/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b94373bcb72fa92da75a6392912c5d3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Piotr</media:title>
		</media:content>

		<media:content url="http://2.bp.blogspot.com/_6moQ1rxVDi4/SubZvGGd0cI/AAAAAAAAAAc/W1iG2p-60IM/s320/hough1.jpg" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_6moQ1rxVDi4/SubaNmrbf5I/AAAAAAAAAAk/1BoJLRRsleE/s320/hough2.jpg" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_6moQ1rxVDi4/Subdw73WNdI/AAAAAAAAAAs/dmOsLkygOOs/s320/hough3.jpg" medium="image" />

		<media:content url="http://1.bp.blogspot.com/_6moQ1rxVDi4/SubeJSYjPpI/AAAAAAAAAA0/u9oprtMSPbE/s320/hough4.jpg" medium="image" />

		<media:content url="http://4.bp.blogspot.com/_6moQ1rxVDi4/Sucz7Gya_3I/AAAAAAAAAA8/VYpCoof6ANc/s320/hough10.jpg" medium="image" />
	</item>
	</channel>
</rss>
