{"id":293,"date":"2010-11-15T00:29:03","date_gmt":"2010-11-15T05:29:03","guid":{"rendered":"http:\/\/www.stephencalenderblog.com\/?p=293"},"modified":"2010-11-15T00:33:57","modified_gmt":"2010-11-15T05:33:57","slug":"faster-rectangle-class","status":"publish","type":"post","link":"https:\/\/www.stephencalenderblog.com\/?p=293","title":{"rendered":"Faster Rectangle Class"},"content":{"rendered":"<p>\u201cAn underlying theme I have discovered with Flash is that you are often better off writing your own code than trusting Adobe\u2019s classes and functions, data structures are no exception.\u201d \u2013 taken from <a href=\"https:\/\/www.stephencalenderblog.com\/?p=213\">my flash particle system article<\/a>  <\/p>\n<p>After the launch and first few patches of <a href=\"http:\/\/universe.lego.com\/en-us\/splash\/default.aspx\">Lego Universe<\/a>, work at <a href=\"http:\/\/www.netdevil.com\/\">NetDevil<\/a> has calmed down enough that I have the time and energy to explore private projects again.  The current project I am working on is large and it is still in the design, test, research phase since it needs to very optimized.  I saw that I was going to be doing quite a few rectangle intersects and intersection operations (the function that determines whether two rectangles overlap and the function that returns the overlapping rectangle respectively) so I took a look at the speed of <a href=\"http:\/\/help.adobe.com\/en_US\/FlashPlatform\/reference\/actionscript\/3\/flash\/geom\/Rectangle.html\">Flash\u2019s native rectangle class<\/a>.  I clocked Flash\u2019s intersects function speed at over 150 simple operations (adds, multiplies, and accessing class members all count as one simple operation from <a href=\"https:\/\/www.stephencalenderblog.com\/?p=7\">my benchmarking series<\/a>).  I thought to myself \u201cI can do better than that\u201d \u2013 I was right, and I managed to write a faster intersection function too (free code).<\/p>\n<p><!--more--><\/p>\n<p>These speed tests are just from my minimum spec machine \u201cComputer A\u201d (Gateway Desktop, Intel Pentium 4 chip, 2.27 GHz, 1 GB RAM, Windows XP SP3).  I am sure that there will be a little variance across different machines, but since my intersects function was over 4 times faster than Adobe\u2019s, I am pretty confident that it will be faster for every machine out there.  Relative speed listed here is in comparison to the cost of a simple operation.<\/p>\n<p>Comparing Adobe\u2019s rectangle functions to mine, 1,000,000 executions per trial.  Run the benchmarks: <a href=\"http:\/\/stephencalenderblog.com\/becnhmarks\/BenchmarkRectangleAdobe.php\">Flash\u2019s native rectangle class<\/a>, <a href=\"http:\/\/stephencalenderblog.com\/benchmarks\/BenchmarkRectangleCustom.php\">My ActionScript 3.0 rectangle class<\/a><\/p>\n<table cellspacing=\"0\" cellpadding=\"4\" width=\"470\" rules=\"groups\">\n<tbody>\n<colgroup span=\"0\" style=\"color:#000000;\"><\/colgroup>\n<col align=\"center\"><\/col>\n<col align=\"left\" ><\/col>\n<col align=\"center\"><\/col>\n<col align=\"right\"><\/col>\n<col align=\"right\"><\/col>\n<tr>\n<th width=\"90\" align=\"left\">&nbsp;<\/th>\n<th width=\"120\" align=\"left\" bgcolor=#D8D8D8>Flash\u2019s functions<\/th>\n<th width=\"130\" align=\"center\">Relative Speed<\/th>\n<th width=\"60\" align=\"right\" bgcolor=#D8D8D8>Average<\/th>\n<th width=\"70\" align=\"right\">Std. Dev.<\/th>\n<\/tr>\n<colgroup style=\"color:#000000;\">\n<tr>\n<td rowspan=\"3\">Computer A<\/td>\n<td align=\"left\" bgcolor=#D8D8D8>intersects (overlap)<\/td>\n<td align=\"center\">162.5<\/td>\n<td align=\"right\" bgcolor=#D8D8D8>0.6513<\/td>\n<td align=\"right\">0.0246<\/td>\n<\/tr>\n<tr>\n<td align=\"left\" bgcolor=#D8D8D8>intersects (containment)<\/td>\n<td align=\"center\">157<\/td>\n<td align=\"right\" bgcolor=#D8D8D8>0.6269<\/td>\n<td align=\"right\">0.0515<\/td>\n<\/tr>\n<tr>\n<td align=\"left\" bgcolor=#D8D8D8>intersection<\/td>\n<td align=\"center\">174<\/td>\n<td align=\"right\" bgcolor=#D8D8D8>0.6962<\/td>\n<td align=\"right\">0.0124<\/td>\n<\/tr>\n<\/colgroup>\n<\/tbody>\n<\/table>\n<p>Flash\u2019s native rectangle intersects function is so slow, and so close to the speed of actually calculating the intersection, there is no point to ever use it.  You might as well just ask for the intersection and check to see it if it is null.  There is no reason for an intersection test to be running that slowly, here are the results of my implementation:<\/p>\n<table cellspacing=\"0\" cellpadding=\"4\" width=\"470\" rules=\"groups\">\n<tbody>\n<colgroup span=\"0\" style=\"color:#000000;\"><\/colgroup>\n<col align=\"center\"><\/col>\n<col align=\"left\" ><\/col>\n<col align=\"center\"><\/col>\n<col align=\"right\"><\/col>\n<col align=\"right\"><\/col>\n<tr>\n<th width=\"90\" align=\"left\">&nbsp;<\/th>\n<th width=\"120\" align=\"left\" bgcolor=#D8D8D8>My functions<\/th>\n<th width=\"130\" align=\"center\">Relative Speed<\/th>\n<th width=\"60\" align=\"right\" bgcolor=#D8D8D8>Average<\/th>\n<th width=\"70\" align=\"right\">Std. Dev.<\/th>\n<\/tr>\n<colgroup style=\"color:#000000;\">\n<tr>\n<td rowspan=\"3\">Computer A<\/td>\n<td align=\"left\" bgcolor=#D8D8D8>intersects (overlap)<\/td>\n<td align=\"center\">35.5<\/td>\n<td align=\"right\" bgcolor=#D8D8D8>0.1410<\/td>\n<td align=\"right\">0.0000<\/td>\n<\/tr>\n<tr>\n<td align=\"left\" bgcolor=#D8D8D8>intersects (containment)<\/td>\n<td align=\"center\">35.5<\/td>\n<td align=\"right\" bgcolor=#D8D8D8>0.1420<\/td>\n<td align=\"right\">0.0040<\/td>\n<\/tr>\n<tr>\n<td align=\"left\" bgcolor=#D8D8D8>intersection<\/td>\n<td align=\"center\">157.5<\/td>\n<td align=\"right\" bgcolor=#D8D8D8>0.6303<\/td>\n<td align=\"right\">0.0095<\/td>\n<\/tr>\n<\/colgroup>\n<\/tbody>\n<\/table>\n<p>I had a couple ideas on how to test for intersection before I settled on this implementation \u2013 including one very clever one that looked at the union of two rectangles.  Ultimately, I went with a very straightforward approach of comparing the two rectangle\u2019s line segments for intersection.  I went this route because you don\u2019t need to allocate any additional memory (an increasing trend in my optimized routines), and it compliments the logic for the intersection function (less time spent validating code).  <\/p>\n<p>One caveat before I give you the code, my rectangle class is just for integer dimensions because that is what I needed.  You will need to make some minor tweaks if you want a custom numeric rectangle class.<\/p>\n<style type=\"text\/css\"><!--\n\/**\n * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann\n * (http:\/\/qbnz.com\/highlighter\/ and http:\/\/geshi.org\/)\n *\/\n.actionscript3  {font-size:80%; font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;}\n.actionscript3 a:link {color: #000060;}\n.actionscript3 a:hover {background-color: #f0f000;}\n.actionscript3 .imp {font-weight: bold; color: red;}\n.actionscript3 .kw1 {color: #0033ff; font-weight: bold;}\n.actionscript3 .kw2 {color: #6699cc; font-weight: bold;}\n.actionscript3 .kw3 {color: #339966; font-weight: bold;}\n.actionscript3 .kw4 {color: #9900cc; font-weight: bold;}\n.actionscript3 .kw5 {color: #004993;}\n.actionscript3 .kw6 {color: #004993;}\n.actionscript3 .kw7 {color: #004993;}\n.actionscript3 .kw8 {color: #004993;}\n.actionscript3 .co1 {color: #009900; font-style: italic;}\n.actionscript3 .co2 {color: #009966; font-style: italic;}\n.actionscript3 .coMULTI {color: #3f5fbf;}\n.actionscript3 .br0 {color: #000000;}\n.actionscript3 .sy0 {color: #000066; font-weight: bold;}\n.actionscript3 .st0 {color: #990000;}\n.actionscript3 .nu0 {color: #000000; font-weight:bold;}\n.actionscript3 .me0 {color: #000000;}\n.actionscript3 span.xtra { display:block; }\n--!><\/style>\n\n\n\n\n\n<div class=\"actionscript3\"><span class=\"kw4\">package<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/I discovered that Adobe's rectangle class is pretty slow<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/I dont know what they are doing, this rectangle class is faster<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/this is also an integer rectangle, meant to be used with graphics<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw4\">class<\/span> IntegerRectangle<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw2\">var<\/span> rx<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw2\">var<\/span> ry<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">internal<\/span> <span class=\"kw2\">var<\/span> rwidth<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"sy0\">;<\/span><span class=\"co1\">\/\/no reason width or height should ever be negitive<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">internal<\/span> <span class=\"kw2\">var<\/span> rheight<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"sy0\">;<\/span><span class=\"co1\">\/\/but making them ints prevents any promotion issues<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> IntegerRectangle<span class=\"br0\">&#40;<\/span>xComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a> = <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> yComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a> = <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> widthComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a> = <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> heightComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a> = <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rx = xComponent<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ry = yComponent<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/take absolute value to make sure width and height are positive<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/there would be bounds issues if parameters coming in were uint getting maped to ints<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rwidth = <span class=\"br0\">&#40;<\/span>widthComponent <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> widthComponent <span class=\"sy0\">*<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">:<\/span> widthComponent<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rheight = <span class=\"br0\">&#40;<\/span>heightComponent <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> heightComponent <span class=\"sy0\">*<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">:<\/span> heightComponent<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"co1\">\/\/end constructor<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw7\">toString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=string%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:string.html\"><span class=\"kw5\">String<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;(&quot;<\/span><span class=\"sy0\">+<\/span>rx<span class=\"sy0\">+<\/span><span class=\"st0\">&quot;, &quot;<\/span><span class=\"sy0\">+<\/span>ry<span class=\"sy0\">+<\/span><span class=\"st0\">&quot;), (&quot;<\/span><span class=\"sy0\">+<\/span>rwidth<span class=\"sy0\">+<\/span><span class=\"st0\">&quot;, &quot;<\/span><span class=\"sy0\">+<\/span>rheight<span class=\"sy0\">+<\/span><span class=\"st0\">&quot;)&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">get<\/span> <span class=\"kw7\">x<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> rx<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">get<\/span> <span class=\"kw7\">y<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">get<\/span> <span class=\"kw7\">width<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> rwidth<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">get<\/span> <span class=\"kw7\">height<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> rheight<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">set<\/span> <span class=\"kw7\">x<\/span><span class=\"br0\">&#40;<\/span>xComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rx = xComponent<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">set<\/span> <span class=\"kw7\">y<\/span><span class=\"br0\">&#40;<\/span>yComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ry = yComponent<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">set<\/span> <span class=\"kw7\">width<\/span><span class=\"br0\">&#40;<\/span>widthComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rwidth = <span class=\"br0\">&#40;<\/span>widthComponent <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> widthComponent <span class=\"sy0\">*<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">:<\/span> widthComponent<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw1\">set<\/span> <span class=\"kw7\">height<\/span><span class=\"br0\">&#40;<\/span>heightComponent<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rheight = <span class=\"br0\">&#40;<\/span>heightComponent <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> heightComponent <span class=\"sy0\">*<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"sy0\">:<\/span> heightComponent<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> copyRectangle<span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">:<\/span>IntegerRectangle<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rx = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ry = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rwidth = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rheight = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/bleh, enough getters and setters, lets do some real code<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw7\">intersects<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">:<\/span>IntegerRectangle<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=boolean%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:boolean.html\"><span class=\"kw5\">Boolean<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/for axis aligned rectangles<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/keep in mind some intersections are at a single point or a line<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/since this class is primarily designed for graphics, a point = a pixel which has area &nbsp; &nbsp; &nbsp; &nbsp; <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/this is really simple, I have no idea why Adobe's algorithm is so slow<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">\/*<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A____B &nbsp; &nbsp; &nbsp; A'___________B'<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; C'___________D'<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C____D<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/line AB or CD (horizontal lines of ABCD) intersecting with A'C' or B'D' (vertical lines of A'B'C'D')<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/line AB is y = ry, CD is y = ry + rheight (in flash coordinates, not cartesian)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and the x range of AB == the x range of CD (y = # lines are parallel to x axis)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/line A'C' is x = rect.rx, B'D' is x = rect.rx + rect.rwidth<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and the y range of A'C' == the y range of B'D' (x = # lines are parallel to y axis)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/A'.x == C'.x, is either in the x range of AB (which is the same as the x range of CD)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/OR B'.x == D'.x, is either in the x range of AB<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; &nbsp;<span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"co1\">\/\/A'C' check<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">||<\/span> <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> <span class=\"co1\">\/\/B'D' check <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/to check line AB intersecting with A'C', B'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/AND A.y == B.y, is A.y in the y range of A'C' AND y range A'C' == B'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&lt;<\/span>= ry <span class=\"sy0\">&amp;&amp;<\/span> ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/there is an intersection point <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/at (rect.rx, ry) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aka (A'.x, A.y)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/or (rect.rx + rect.rwidth, ry) aka (B'.x , A.y) - respectively (to initial if statement)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/to check line CD intersecting with A'C', B'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/AND C.y == D.y, is C.y in the y range of A'C' AND y range A'C' == B'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/there is an intersection point<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/at (rect.rx, ry + rheight) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aka (A'.x, C.y)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/or (rect.rx + rect.rwidth, ry + rheight) aka (B'.x, C.y) - respectively (to initial if statement)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">\/*<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; by now we have captured all varieties of:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;___<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_|___|_____<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | | &nbsp; | &nbsp; &nbsp; |<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |_|___|_____|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; |<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |___|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; and all of the varieties of:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;____ <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp;__|_<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |_|__| |<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |____|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; and some varieties of:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;___<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;___|___|__<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; |___| &nbsp;| <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |__________| <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/so, to get the last few cases, we need to check<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/line AC or BD (vertical lines of ABCD) intersecting with A'B' or C'D' (horizontal lines of A'B'C'D')<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/for which, we just need to swap our x and y references <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/line AC is x = rx, BD is x = rx + rwidth (in flash coordinates, not cartesian)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and the y range of AC == the y range of BD (x = # lines are parallel to y axis) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/A'.y == B'.y, is either in the y range of AC (which is the same as the y range of BD)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/OR C'.y == D'.y, is either in the y range of AC<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; &nbsp;<span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> &nbsp;<span class=\"co1\">\/\/A'B' check<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">||<\/span> <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/check line AC intersecting with A'B', C'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/AND A.x == C.x, is A.x in the x range of A'B' AND x range A'B' == C'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&lt;<\/span>= rx <span class=\"sy0\">&amp;&amp;<\/span> rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/there is an intersection point <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/at (rx, rect.ry) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;aka (A.x, A'.y)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/or (rx, rect.ry + rect.rheight) aka (A.x , B'.y) - respectively<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/check line BD intersecting with A'B', C'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/AND B.x == D.x, is B.x in the x range of A'B' AND x range A'B' == C'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/there is an intersection point <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/at (rx + rwidth, rect.ry) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;aka (B.x, A'.y)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/or (rx + rwidth, rect.ry + rect.rheight) aka (B.x , B'.y) - respectively<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">\/*<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; The only remaining cases deal with containment<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_____<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp;_ &nbsp;|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | |_| |<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |_____|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/lastly we check for either rectange completely containing the other<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/you need to check rect containing rect' and rect' containing rect<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">contains<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">||<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span><span class=\"kw7\">contains<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/if we havent already returned true...<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw7\">contains<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">:<\/span>IntegerRectangle<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=boolean%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:boolean.html\"><span class=\"kw5\">Boolean<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/does 'this' contain the rectangle 'rect'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/This is really simple since our rectangles are described<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/by a point (A) and positive width and height.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/we only need to determine if points A' and D' are inside ABCD<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/but we don't even have to do full point inside rect checks<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/just ensure that A &lt;= A' &nbsp;and D' &lt;= D <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/NOTE: contains does not check for the rectangle being empty<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/however, if the rectangle has no width or height, it equates to the point in rectangle test<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">\/*<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A _________B<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|A'____B' |<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| | &nbsp; &nbsp;| &nbsp;|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| |____| &nbsp;|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|C' &nbsp; &nbsp;D' |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|_________|<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&amp;&amp;<\/span> ry <span class=\"sy0\">&lt;<\/span>= <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry<span class=\"br0\">&#41;<\/span> <span class=\"co1\">\/\/A &lt;= A'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&amp;&amp;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"co1\">\/\/D'.x &lt;= D.x <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&amp;&amp;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"co1\">\/\/D'.y &lt;= D.y<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> containsCoords<span class=\"br0\">&#40;<\/span>px<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"sy0\">,<\/span> py<span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=boolean%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:boolean.html\"><span class=\"kw5\">Boolean<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/determine if this set of coordinates is on the border or<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/inside of this rectangle<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/just like the contains function, <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/if our coordinates are greater than or equal too A<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and our coordinates are less than or equal too D<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/it is contained since our rectangles are axis aligned<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">&lt;<\/span>= px <span class=\"sy0\">&amp;&amp;<\/span> ry <span class=\"sy0\">&lt;<\/span>= py<span class=\"br0\">&#41;<\/span> <span class=\"co1\">\/\/A &lt;= point<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">&amp;&amp;<\/span><span class=\"br0\">&#40;<\/span>px <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> py <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"co1\">\/\/point &lt;= D<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw7\">intersection<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">:<\/span>IntegerRectangle<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span>IntegerRectangle<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/returns the rectangular overlap of two rectangles<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/if there is no overlap, the returned value is null<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/this function can return &quot;empty&quot; rectangles, points and lines are valid results<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/since it is used for graphics a point can be a single pixel and a line a row \/ column of pixels<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/this is why there is a check for 0 width and 0 height - which would be numerically correct for<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/rectangles over the real numbers, but for pixels and lines width and height are always atleast 1 <\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/since this class is primarily designed for graphics, a point = a pixel which has area<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"coMULTI\">\/*<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A____B &nbsp; &nbsp; &nbsp; A'___________B'<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; C'___________D'<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C____D<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/even if one rectangle contains the other we dont want to return<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/one of our parameters because that could cause nasty object sharing bugs.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/while containment is perhaps the most unlikely case, it is also the least<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/computationally expensive - and greatly simplfies further calculations<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> newRect<span class=\"sy0\">:<\/span>IntegerRectangle = <span class=\"kw1\">new<\/span> IntegerRectangle<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">contains<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/return a copy of rect<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>copyRectangle<span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> newRect<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span><span class=\"kw7\">contains<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/return a copy of this<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>copyRectangle<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> newRect<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ok now the tricky part, we need to find and store the intersection points in some kind of order<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/without adding any overhead of a point class, and trying to avoid the slow Flash array class<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/there is a very finite list of points that would potentially compose an interection rectangle<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/any of the 4 points of ABCD, any of the 4 points of A'B'C'D',<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and any of the 8 potential line segment intersection points examined in 'intersects()'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/However, there is no need to find all 4 corners of the newly formed rectangle<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/we just need to find its top left point, and bottom right point - only 4 potential point candidates for each.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/the top left most point must be A, A', the intersection of AB with A'C',<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/or the intersection of AC with A'B' (the pairs of top and left lines)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and we must check in that order because the intersections can only be the top<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/left point if A or A' isnt.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/If all of those cases fail<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/there is not an intersection (assuming your &quot;point in rectangle&quot; test includes borders)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/rect.containsCoords(rx,ry)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>containsCoords<span class=\"br0\">&#40;<\/span>rx<span class=\"sy0\">,<\/span>ry<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rx = rx<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>ry = ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/containsCoords(rect.rx, rect.ry)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>containsCoords<span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx<span class=\"sy0\">,<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rx = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>ry = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/intersection of AB with A'C' - if this is confusing take a look at 'intersects()'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&amp;&amp;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&lt;<\/span>= ry <span class=\"sy0\">&amp;&amp;<\/span> ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rx = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>ry = ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/intersection of AC with A'B'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&amp;&amp;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&lt;<\/span>= rx <span class=\"sy0\">&amp;&amp;<\/span> rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rx = rx<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>ry = <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/intersection does not exist<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/the bottom right point must be D, D', intersection of CD with B'D',<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/intersection of C'D' with BD (the pairs of bottom and right lines)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and we must check in that order because the intersections can only be the bottom<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/right point if D or D' isnt.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/rect.containsCoords(rx + rwidth, ry + rheight)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>containsCoords<span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"sy0\">,<\/span> ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>rx<span class=\"sy0\">;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> newRect<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/containsCoords(rect.rx + rect.rwidth, rect.ry + rect.rheight)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>containsCoords<span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"sy0\">,<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>rx<span class=\"sy0\">;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> newRect<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/CD intersecting with B'D'<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&amp;&amp;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/then there is an intersection at (rect.rx + rect.rwidth, ry + rheight)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>rx<span class=\"sy0\">;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> newRect<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/C'D' intersecting with BD<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/I'm fairly confident that this can be an else case<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/but in the unlikely case that I missed something, or my future self edits this<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/and forgets about this little statement, lets just do the whole check<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span> &nbsp; <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>ry <span class=\"sy0\">+<\/span> rheight<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&amp;&amp;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span>= <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rx <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rwidth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/then there is an intersection at (rx + rwidth, rect.ry + rect.rheight)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span>rx <span class=\"sy0\">+<\/span> rwidth<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>rx<span class=\"sy0\">;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span><span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>ry <span class=\"sy0\">+<\/span> <span class=\"kw7\">rect<\/span><span class=\"sy0\">.<\/span>rheight<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> newRect<span class=\"sy0\">.<\/span>ry<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rwidth = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rwidth <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newRect<span class=\"sy0\">.<\/span>rheight = <span class=\"br0\">&#40;<\/span>newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">&gt;<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">?<\/span> newRect<span class=\"sy0\">.<\/span>rheight <span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> newRect<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/I dont think I should ever hit this - you should have already returned something<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/but if you did hit it, the result should be null<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw7\">isEmpty<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=boolean%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:boolean.html\"><span class=\"kw5\">Boolean<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/are all values 0 - isEmpty doesnt really suit this class well<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>rx == <span class=\"nu0\">0<\/span> <span class=\"sy0\">&amp;&amp;<\/span> ry == <span class=\"nu0\">0<\/span> <span class=\"sy0\">&amp;&amp;<\/span> rwidth == <span class=\"nu0\">0<\/span> <span class=\"sy0\">&amp;&amp;<\/span> rheight == <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw1\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> area<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><a href=\"http:\/\/www.google.com\/search?q=int%20inurl:http:\/\/livedocs.adobe.com\/flex\/201\/langref\/%20inurl:int.html\"><span class=\"kw5\">int<\/span><\/a><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> rwidth <span class=\"sy0\">*<\/span> rheight<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> <span class=\"kw7\">clear<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rx = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ry = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rwidth = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rheight = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">public<\/span> <span class=\"kw3\">function<\/span> destroy<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><span class=\"kw1\">void<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rx = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ry = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rwidth = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rheight = <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"co1\">\/\/end class<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"co1\">\/\/end package<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <\/div>\n\n\n\n*Special thanks to the <a href=\"http:\/\/quickhighlighter.com\/\">Quick Highlighter<\/a> team for the code embed CSS and HTML\n\n\nI\u2019ll leave it up to you to decide if Adobe = FAIL or if I = WIN.  It feels like anytime I start designing a sophisticated project, and find I am going to be doing many of type X calculation or using Y object frequently, I setup some benchmarks and test it out.  I have become that untrusting.  Stuff like this rectangle discovery are like landmines to developers, unless you took the time to run the benchmarks, you would never expect the intersects function to have the same cost of finding the intersection or realize that you could write a faster implementation.  While I was able to write something faster, I don\u2019t feel much like a winner.  Having to take the time to think and write classes like this are distractions that interrupt what I am really trying to work on.  It also causes a lot of doubt; if Adobe couldn\u2019t get a simple intersection test function right what else did they screw up?\n\nThanks for reading, and remember, we are all in this together.\n\n\n\n<table cellspacing=\"15\">\n\n<tr>\n\n<td>\n<a class=\"DiggThisButton DiggMedium\"><\/a>\n<\/td>\n\n\n\n<td>\n<a href=\"http:\/\/reddit.com\/submit\" onclick=\"window.location = 'http:\/\/reddit.com\/submit?url=' + encodeURIComponent(window.location); return false\"> <img decoding=\"async\" src=\"http:\/\/reddit.com\/static\/spreddit7.gif\" alt=\"submit to reddit\" border=\"0\" \/> <\/a>\n<\/td>\n\n\n\n<td>\n\n\n\n<table>\n\n<tr>\n\n<td>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/static.delicious.com\/img\/delicious.small.gif\" height=\"10\" width=\"10\" alt=\"Delicious\" \/>\n<\/td>\n\n\n\n<td>\n<a href=\"http:\/\/delicious.com\/save\" onclick=\"window.open('http:\/\/delicious.com\/save?v=5&noui&jump=close&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title), 'delicious','toolbar=no,width=550,height=550'); return false;\"> Bookmark this on Delicious<\/a>\n<\/tr>\n\n<\/table>\n\n\n<\/td>\n\n\n\n<td>\n<script src=\"http:\/\/www.stumbleupon.com\/hostedbadge.php?s=2\"><\/script>\n<\/tr>\n\n<\/table>\n\n\n\n\n\n\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u201cAn underlying theme I have discovered with Flash is that you are often better off writing your own code than trusting Adobe\u2019s classes and functions, data structures are no exception.\u201d \u2013 taken from my flash particle system article After the launch and first few patches of Lego Universe, work at NetDevil has calmed down enough [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,8],"tags":[],"class_list":["post-293","post","type-post","status-publish","format-standard","hentry","category-actionscript-30","category-optimization"],"_links":{"self":[{"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=\/wp\/v2\/posts\/293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=293"}],"version-history":[{"count":10,"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=\/wp\/v2\/posts\/293\/revisions"}],"predecessor-version":[{"id":303,"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=\/wp\/v2\/posts\/293\/revisions\/303"}],"wp:attachment":[{"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.stephencalenderblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}