<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Dirty Rectangle System</title>
		<link>http://www.allegro.cc/forums/view/408604</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 03 Oct 2004 19:14:21 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edit: If you&#39;re searching for a good explination of a Dirty Rectangle System, read axilmar&#39;s posts below, they go through in detail and include many ASCII drawings as aids.</p><p>Aeiii!  Headache city.  I&#39;ve dedicated about the last week or so to getting my DR system to work correctly, starting over about 5 times so far.  The basic components I understand, draw to a buffer, store those corrodinates in a vector of some sort, check for overlapping rectangles, divide and conqueror.  Keep a current list and and old list, combine the two into one list (check for overlapping again) and draw the final list buffer -&gt; screen, background -&gt; buffer.</p><p>All of it is simple enough except for one part.. Overlapping.  I just can&#39;t seem to get it right.</p><p>I did some research, to try and see if there was an example I could understand, and these are what I found:</p><p>DRS:  the &#39;Dirty Rectangle System&#39; seemed like a nice enough system, except that it was missing the one part I wanted to mimic, overlapping.  It simply just stored all the rectangles and never checked for overlapping.</p><p>Allegro Demo:  Again same thing, the dirty rectangle system didnt check for overlapping</p><p>Steve Terry&#39;s NAS GUI:  Here I found a working DRS with overlapping <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" />.  Now my problem is I barely can understand the code, let alone copy it.  The guts of the overlapping is in one function some 100 lines long with int flags and bit moves.  Needless to say I got lost in seconds.</p><p>So, this brings me to my main issue, getting this thing to work <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />.</p><p>Heres some relevant code:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> tile_blit<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>src, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>des<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> des-&gt;w<span class="k2">;</span> x <span class="k3">+</span><span class="k3">=</span> src-&gt;w<span class="k2">)</span></td></tr><tr><td class="number">3</td><td>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> des-&gt;h<span class="k2">;</span> y <span class="k3">+</span><span class="k3">=</span> src-&gt;h<span class="k2">)</span></td></tr><tr><td class="number">4</td><td>      <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>src, des, <span class="n">0</span>, <span class="n">0</span>, x, y, src-&gt;w, src-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k2">}</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>std::list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> dirty_zones<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>std::list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> cleanup_zones<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>std::list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> current_job<span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k1">bool</span> buf_store_moded <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="k1">void</span> stuoop_buf_blit<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>  </td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>  <span class="c">// ...</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>  std::list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator citr <span class="k3">=</span> cleanup_zones.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  </td></tr><tr><td class="number">18</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> citr <span class="k3">!</span><span class="k3">=</span> cleanup_zones.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> citr<span class="k3">+</span><span class="k3">+</span>, i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>    mark<span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>citr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1, <span class="k2">(</span><span class="k3">*</span>citr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1, <span class="k2">(</span><span class="k3">*</span>citr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x2, <span class="k2">(</span><span class="k3">*</span>citr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y2, current_job<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    </td></tr><tr><td class="number">21</td><td>    <span class="k1">delete</span> <span class="k3">*</span>citr<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>  </td></tr><tr><td class="number">24</td><td>  cleanup_zones.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>  std::list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator itr <span class="k3">=</span> dirty_zones.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  </td></tr><tr><td class="number">28</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k2">;</span> itr <span class="k3">!</span><span class="k3">=</span> dirty_zones.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> itr<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>    mark<span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>itr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1, <span class="k2">(</span><span class="k3">*</span>itr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1, <span class="k2">(</span><span class="k3">*</span>itr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x2, <span class="k2">(</span><span class="k3">*</span>itr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y2, current_job<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    </td></tr><tr><td class="number">31</td><td>    cleanup_zones.push_back<span class="k2">(</span><span class="k3">*</span>itr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">33</td><td>  </td></tr><tr><td class="number">34</td><td>  </td></tr><tr><td class="number">35</td><td>  dirty_zones.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>  </td></tr><tr><td class="number">37</td><td>  std::list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator jitr <span class="k3">=</span> current_job.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>  </td></tr><tr><td class="number">39</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k2">;</span> jitr <span class="k3">!</span><span class="k3">=</span> current_job.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> jitr<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>       buf, screen_dest, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1 <span class="k3">+</span> x, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x2 <span class="k3">-</span> <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y2 <span class="k3">-</span> <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>    <span class="c">// notice the + x used above is for hardware scrolling optimization</span></td></tr><tr><td class="number">42</td><td>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>background,         buf, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1,     <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x2 <span class="k3">-</span> <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x1, <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y2 <span class="k3">-</span> <span class="k2">(</span><span class="k3">*</span>jitr<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>    </td></tr><tr><td class="number">44</td><td>    <span class="k1">delete</span> <span class="k3">*</span>jitr<span class="k2">;</span></td></tr><tr><td class="number">45</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">46</td><td>  </td></tr><tr><td class="number">47</td><td>  current_job.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>  <span class="c">// ...</span></td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td><span class="k2">}</span></td></tr><tr><td class="number">52</td><td>&#160;</td></tr><tr><td class="number">53</td><td><span class="k1">void</span> _mark<span class="k2">(</span>list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span><span class="k3">&amp;</span>,list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span><span class="k3">&amp;</span>,dirty_zone<span class="k3">*</span>,<span class="k1">int</span>,<span class="k1">int</span>,<span class="k1">int</span>,<span class="k1">int</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>&#160;</td></tr><tr><td class="number">55</td><td><span class="k1">inline</span> <span class="k1">void</span> mark<span class="k2">(</span><span class="k1">int</span> x1, <span class="k1">int</span> y1, <span class="k1">int</span> x2, <span class="k1">int</span> y2, list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> <span class="k3">&amp;</span>dest<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">56</td><td>  dirty_zone <span class="k3">*</span>current_new <span class="k3">=</span> <span class="k1">new</span> dirty_zone<span class="k2">(</span>x1, y1, x2, y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>  </td></tr><tr><td class="number">58</td><td>  list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> mark_list<span class="k2">;</span></td></tr><tr><td class="number">59</td><td>  </td></tr><tr><td class="number">60</td><td>  _mark<span class="k2">(</span>dest, mark_list, current_new, x1, y1, x2, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>  </td></tr><tr><td class="number">62</td><td>  list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator itr <span class="k3">=</span> mark_list.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>  </td></tr><tr><td class="number">64</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k2">;</span> itr <span class="k3">!</span><span class="k3">=</span> mark_list.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> itr<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">65</td><td>    dest.push_back<span class="k2">(</span><span class="k3">*</span>itr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">67</td><td>  </td></tr><tr><td class="number">68</td><td>  <span class="k1">delete</span> current_new<span class="k2">;</span></td></tr><tr><td class="number">69</td><td><span class="k2">}</span></td></tr><tr><td class="number">70</td><td>&#160;</td></tr><tr><td class="number">71</td><td><span class="k1">inline</span> <span class="k1">int</span> _get_quad<span class="k2">(</span><span class="k1">int</span> x1, <span class="k1">int</span> y1, <span class="k1">int</span> x2, <span class="k1">int</span> y2, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">72</td><td>  <span class="k1">int</span> ret <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>  </td></tr><tr><td class="number">74</td><td>  <span class="k1">if</span><span class="k2">(</span>x <span class="k3">&lt;</span> x1<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>    <span class="k1">if</span><span class="k2">(</span>y <span class="k3">&lt;</span> y1<span class="k2">)</span></td></tr><tr><td class="number">76</td><td>      ret <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>y <span class="k3">&lt;</span> y2<span class="k2">)</span></td></tr><tr><td class="number">78</td><td>      ret <span class="k3">=</span> <span class="n">4</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">80</td><td>      ret <span class="k3">=</span> <span class="n">7</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>  <span class="k2">}</span> <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>x <span class="k3">&lt;</span> x2<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">82</td><td>    <span class="k1">if</span><span class="k2">(</span>y <span class="k3">&lt;</span> y1<span class="k2">)</span></td></tr><tr><td class="number">83</td><td>      ret <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>y <span class="k3">&lt;</span> y2<span class="k2">)</span></td></tr><tr><td class="number">85</td><td>      ret <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">87</td><td>      ret <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>  <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">89</td><td>    <span class="k1">if</span><span class="k2">(</span>y <span class="k3">&lt;</span> y1<span class="k2">)</span></td></tr><tr><td class="number">90</td><td>      ret <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>y <span class="k3">&lt;</span> y2<span class="k2">)</span></td></tr><tr><td class="number">92</td><td>      ret <span class="k3">=</span> <span class="n">6</span><span class="k2">;</span></td></tr><tr><td class="number">93</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">94</td><td>      ret <span class="k3">=</span> <span class="n">9</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">96</td><td>  </td></tr><tr><td class="number">97</td><td>  <span class="k1">return</span> ret<span class="k2">;</span></td></tr><tr><td class="number">98</td><td><span class="k2">}</span></td></tr><tr><td class="number">99</td><td>&#160;</td></tr><tr><td class="number">100</td><td><span class="c">/*  return values:</span></td></tr><tr><td class="number">101</td><td><span class="c"> *   1  |  2  |  3</span></td></tr><tr><td class="number">102</td><td><span class="c"> * -----------------</span></td></tr><tr><td class="number">103</td><td><span class="c"> *   4  |  5  |  6 </span></td></tr><tr><td class="number">104</td><td><span class="c"> * -----------------</span></td></tr><tr><td class="number">105</td><td><span class="c"> *   7  |  8  |  9</span></td></tr><tr><td class="number">106</td><td><span class="c"> * </span></td></tr><tr><td class="number">107</td><td><span class="c"> * 5 represents dirty_zone *o</span></td></tr><tr><td class="number">108</td><td><span class="c"> * _get_quad returns  which quad x,y are in in relation to box o</span></td></tr><tr><td class="number">109</td><td><span class="c"> */</span></td></tr><tr><td class="number">110</td><td><span class="k1">inline</span> <span class="k1">int</span> _get_quad<span class="k2">(</span>dirty_zone <span class="k3">*</span>o, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">111</td><td>  <span class="k1">return</span> _get_quad<span class="k2">(</span>o-&gt;x1, o-&gt;y1, o-&gt;x2, o-&gt;y2, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">112</td><td><span class="k2">}</span></td></tr><tr><td class="number">113</td><td>&#160;</td></tr><tr><td class="number">114</td><td><span class="k1">inline</span> <span class="k1">int</span> _mark_logic<span class="k2">(</span>list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> <span class="k3">&amp;</span>dirty_zones, list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> <span class="k3">&amp;</span>mark_list, dirty_zone <span class="k3">*</span>current_new, dirty_zone <span class="k3">*</span>o, <span class="k1">int</span> x1, <span class="k1">int</span> y1, <span class="k1">int</span> x2, <span class="k1">int</span> y2<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">115</td><td>  <span class="k1">if</span><span class="k2">(</span>x1 <span class="k3">&gt;</span> x2<span class="k2">)</span></td></tr><tr><td class="number">116</td><td>    std::swap<span class="k2">(</span>x1, x2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">117</td><td>  <span class="k1">if</span><span class="k2">(</span>y1 <span class="k3">&gt;</span> y2<span class="k2">)</span></td></tr><tr><td class="number">118</td><td>    std::swap<span class="k2">(</span>y1, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">119</td><td>  </td></tr><tr><td class="number">120</td><td>  <span class="k1">int</span> o_upper_left  <span class="k3">=</span> _get_quad<span class="k2">(</span>o, x1, y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>  <span class="k1">int</span> o_upper_right <span class="k3">=</span> _get_quad<span class="k2">(</span>o, x2, y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">122</td><td>  <span class="k1">int</span> o_lower_right <span class="k3">=</span> _get_quad<span class="k2">(</span>o, x2, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td>  <span class="k1">int</span> o_lower_left  <span class="k3">=</span> _get_quad<span class="k2">(</span>o, x1, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">124</td><td>  </td></tr><tr><td class="number">125</td><td>  <span class="k1">int</span> cn_upper_left  <span class="k3">=</span> _get_quad<span class="k2">(</span>current_new, x1, y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">126</td><td>  <span class="k1">int</span> cn_upper_right <span class="k3">=</span> _get_quad<span class="k2">(</span>current_new, x2, y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">127</td><td>  <span class="k1">int</span> cn_lower_right <span class="k3">=</span> _get_quad<span class="k2">(</span>current_new, x2, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">128</td><td>  <span class="k1">int</span> cn_lower_left  <span class="k3">=</span> _get_quad<span class="k2">(</span>current_new, x1, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">129</td><td>&#160;</td></tr><tr><td class="number">130</td><td>  <span class="c">// Must have all corners inside current_new to continue, if we dont return fail</span></td></tr><tr><td class="number">131</td><td>  <span class="k1">if</span><span class="k2">(</span>cn_upper_left <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span> <span class="k3">|</span><span class="k3">|</span> cn_upper_right <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span> <span class="k3">|</span><span class="k3">|</span> cn_lower_right <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span> <span class="k3">|</span><span class="k3">|</span> cn_lower_left <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span><span class="k2">)</span></td></tr><tr><td class="number">132</td><td>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">133</td><td>  </td></tr><tr><td class="number">134</td><td>  <span class="c">// Cant have all corners inside original (o), if we do return fail</span></td></tr><tr><td class="number">135</td><td>  <span class="k1">if</span><span class="k2">(</span>o_upper_left <span class="k3">=</span><span class="k3">=</span> <span class="n">5</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> o_lower_right <span class="k3">=</span><span class="k3">=</span> <span class="n">5</span><span class="k2">)</span></td></tr><tr><td class="number">136</td><td>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">137</td><td>  </td></tr><tr><td class="number">138</td><td>  <span class="c">// Must have one corner inside original (o) to continue, if we dont, then this is a finished square, return success</span></td></tr><tr><td class="number">139</td><td>  <span class="k1">if</span><span class="k2">(</span>o_upper_left <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> o_upper_right <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> o_lower_right <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> o_lower_left <span class="k3">!</span><span class="k3">=</span> <span class="n">5</span><span class="k2">)</span></td></tr><tr><td class="number">140</td><td>    <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">141</td><td>  </td></tr><tr><td class="number">142</td><td>  <span class="c">// horizontal overlapping</span></td></tr><tr><td class="number">143</td><td>  _mark<span class="k2">(</span>dirty_zones, mark_list, current_new, x1, y1, o-&gt;x1, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">144</td><td>  _mark<span class="k2">(</span>dirty_zones, mark_list, current_new, o-&gt;x2, y1, x2, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">145</td><td>  </td></tr><tr><td class="number">146</td><td>  <span class="c">// verticle overlapping (this crops corners)</span></td></tr><tr><td class="number">147</td><td>  _mark<span class="k2">(</span>dirty_zones, mark_list, current_new, MAX<span class="k2">(</span>x1, o-&gt;x2<span class="k2">)</span>, y1, MIN<span class="k2">(</span>x2, o-&gt;x2<span class="k2">)</span>, o-&gt;y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">148</td><td>  _mark<span class="k2">(</span>dirty_zones, mark_list, current_new, MAX<span class="k2">(</span>x1, o-&gt;x2<span class="k2">)</span>, o-&gt;y2, MIN<span class="k2">(</span>x2, o-&gt;x2<span class="k2">)</span>, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">149</td><td>  </td></tr><tr><td class="number">150</td><td>  <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">151</td><td><span class="k2">}</span></td></tr><tr><td class="number">152</td><td>&#160;</td></tr><tr><td class="number">153</td><td><span class="k1">void</span> _mark<span class="k2">(</span>list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> <span class="k3">&amp;</span>dirty_zones, list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span> <span class="k3">&amp;</span>mark_list, dirty_zone <span class="k3">*</span>current_new, <span class="k1">int</span> x1, <span class="k1">int</span> y1, <span class="k1">int</span> x2, <span class="k1">int</span> y2<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">154</td><td>  <span class="k1">if</span><span class="k2">(</span>x1 <span class="k3">&gt;</span> x2<span class="k2">)</span></td></tr><tr><td class="number">155</td><td>    std::swap<span class="k2">(</span>x1, x2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">156</td><td>  <span class="k1">if</span><span class="k2">(</span>y1 <span class="k3">&gt;</span> y2<span class="k2">)</span></td></tr><tr><td class="number">157</td><td>    std::swap<span class="k2">(</span>y1, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">158</td><td>  </td></tr><tr><td class="number">159</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><span class="k2">(</span>x2 <span class="k3">-</span> x1<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span><span class="k2">(</span>y2 <span class="k3">-</span> y1<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">160</td><td>    <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">161</td><td>  </td></tr><tr><td class="number">162</td><td>  <span class="k1">bool</span> mark_now <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">163</td><td>  </td></tr><tr><td class="number">164</td><td>  std::list<span class="k3">&lt;</span>dirty_zone<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator itr <span class="k3">=</span> dirty_zones.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">165</td><td>  </td></tr><tr><td class="number">166</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> id <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> itr <span class="k3">!</span><span class="k3">=</span> dirty_zones.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> itr<span class="k3">+</span><span class="k3">+</span>, id<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">167</td><td>    mark_now <span class="k3">=</span> _mark_logic<span class="k2">(</span>dirty_zones, mark_list, current_new, <span class="k3">*</span>itr, x1, y1, x2, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">168</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">169</td><td>  </td></tr><tr><td class="number">170</td><td>  <span class="k1">if</span><span class="k2">(</span>mark_now<span class="k2">)</span></td></tr><tr><td class="number">171</td><td>    mark_list.push_back<span class="k2">(</span><span class="k1">new</span> dirty_zone<span class="k2">(</span>x1, y1, x2, y2<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">172</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

I&#39;ve uploaded my project at its current status so its possible to see the issues in this system in real time.<br /><a href="http://www.mize.org/DRS/DRStest.tar.gz">tar format</a><br /><a href="http://www.mize.org/DRS/DRStest.zip">zip format</a><br />Both formats should work on any unix with gcc, windows with mingw32, or DOS with djgpp.</p><p>Is there anyone who understands this stuff?  I sure dont <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />.</p><p>edit: the controls for the linked project:<br />Left shift : call mark(0, 0, SCREEN_W, SCREEN_H) i.e. try to redraw the whole screen<br />Right shift : animate boxes on screen (theres 2 of them)<br />Enter : set second_countdown to 10 (fairly useless in this example)<br />Up Arrow : make the rectangles bounce faster (you&#39;ll only notice a differnce if you&#39;re also holding the right shift key)<br />Down Arrow : make the rectangles bounce slower (or backwards) (you&#39;ll only notice a differnce if you&#39;re also holding the right shift key)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Sat, 18 Sep 2004 04:14:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Steve Terry&#39;s NAS GUI: Here I found a working DRS with overlapping <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" />. Now my problem is I barely can understand the code, let alone copy it. The guts of the overlapping is in one function some 100 lines long with int flags and bit moves. Needless to say I got lost in seconds.
</p></div></div><p>
Heh thanks <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> I stole it and modified it from <b>COUGH*Mirans*COUGH</b> version <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />  What&#39;s wrong with it, it&#39;s just a bit of recursion.... oooh and I found a way to optimize recursion too with some tricky assembly and stack winding I may have to use one day <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />  It&#39;s a pretty slick concept, you simply modify the stack so that when the end condition is met instead of unwinding the stack you simply pop right out of the sucker.  I think we found though through bitter discussion is that overlapping can be a bottleneck and it&#39;s generally best to just not do it, there were a variet of other DRS methods discussed too, I still like optimized blits though, at least it makes you feel good knowing you did something cool.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Sat, 18 Sep 2004 04:41:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Solving rectangle overlapping is a difficult thing to grasp at the beginning, but once you understand the basic concepts, it suddently becomes very easy. </p><p>The problem is about how to combine two collections of rectangles into a third one without having overlapping parts. A solution is to &#039;subtract&#039; the overlapping parts from one of the lists, then combine the other list with the new list:</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//first list</span>
LIST A

<span class="c">//second list</span>
LIST B

<span class="c">//list that contains all rectangles of B except the rectangles of A</span>
TEMP LIST <span class="k3">=</span> LIST B <span class="k3">-</span> LIST A

<span class="c">//optimal list that contains all rectangles of A plus all rectangles of B not overlapping with A</span>
OPTIMAL LIST <span class="k3">=</span> LIST A <span class="k3">+</span> TEMP LIST
</pre></div></div><p>

In order to subtract one list from another, you have to understand all the possible ways two rectangles can overlap. Put one rectangle in the center, then move the other around it. You may use two pieces of paper to understand the concept better. </p><p>The obvious cases are that 1) a rectangle completely overlaps another rectangle, 2) the rectangles don&#039;t overlap at all, 3) rectangles overlap partially. Let&#039;s see all the possible cases:</p><p><b>total overlapping</b></p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span>B         <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span>          <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span>          <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>   <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

<b>no overlapping</b></p><p>case a): rect A at left of B</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">|</span>B         <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">|</span>          <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">|</span>          <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>


case b): rect A at right of B</p><div class="source-code snippet"><div class="inner"><pre>                   <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
                   <span class="k3">|</span>A                 <span class="k3">|</span>
                   <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>       <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>B         <span class="k3">|</span>       <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>          <span class="k3">|</span>       <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>          <span class="k3">|</span>       <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>       <span class="k3">|</span>                  <span class="k3">|</span>
                   <span class="k3">|</span>                  <span class="k3">|</span>
                   <span class="k3">|</span>                  <span class="k3">|</span>
                   <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

case c): rect A above B</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="number">  2</span><span class="k3">|</span>A                 <span class="k3">|</span>
<span class="number">  3</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number">  4</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number">  5</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number">  6</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number">  7</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number">  8</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number">  9</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 10</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 11</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="number"> 12</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="number"> 15</span>    <span class="k3">|</span>B         <span class="k3">|</span>  
<span class="number"> 16</span>    <span class="k3">|</span>          <span class="k3">|</span>  
<span class="number"> 17</span>    <span class="k3">|</span>          <span class="k3">|</span>  
<span class="number"> 18</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</div></div><p>

case d): rect A below B</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="number">  2</span>    <span class="k3">|</span>B         <span class="k3">|</span>  
<span class="number">  3</span>    <span class="k3">|</span>          <span class="k3">|</span>  
<span class="number">  4</span>    <span class="k3">|</span>          <span class="k3">|</span>  
<span class="number">  5</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>      
<span class="number">  6</span>    
<span class="number">  7</span>    
<span class="number">  8</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="number">  9</span><span class="k3">|</span>A                 <span class="k3">|</span>
<span class="number"> 10</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 11</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 12</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 13</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 14</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 15</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 16</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 17</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="number"> 18</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</div></div><p>

There are also 4 more cases: A at left-above B, A at left-below B, A at right-above B, A at right-below B. </p><p><b>partial overlapping</b></p><p>Partial overlapping is the trickiest part to understand, as there are many cases. A rectangle A may overlap a rectangle B in such a way that:</p><p>1) only one part of B is visible.<br />2) only two parts of B are visible: a) one part from the left side and one part from the right side or b) one part from the top side and one part of the bottom side.<br />3) rectangle A overlaps a corner of B.<br />4) rectangle A overlaps a middle portion of one side of B.<br />5) rectangle A is in the middle of B.</p><p>Let&#039;s see some examples.</p><p>case (1): only one part of B is visible</p><p>Horizontally:</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>B    <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>     <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>     <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

or</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>A                 <span class="k3">|</span>
     <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>B   <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
     <span class="k3">|</span>                  <span class="k3">|</span>
     <span class="k3">|</span>                  <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Vertically:</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>B         <span class="k3">|</span>  
    <span class="k3">|</span>          <span class="k3">|</span>  
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Or</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>B         <span class="k3">|</span>  
    <span class="k3">|</span>          <span class="k3">|</span>  
    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

case (2): only two parts of B are visible</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>B              <span class="k3">|</span>
    <span class="k3">|</span>               <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                      <span class="k3">|</span>
<span class="k3">|</span>                       <span class="k3">|</span>
<span class="k3">|</span>                       <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>               <span class="k3">|</span>
    <span class="k3">|</span>               <span class="k3">|</span>
    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

or</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>
     <span class="k3">|</span>A            <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>             <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B   <span class="k3">|</span>             <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>             <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>             <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>             <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>             <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>             <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

case (3): rectangle A overlaps a corner of B</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">|</span> 
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>      <span class="k3">|</span>
              <span class="k3">|</span>B          <span class="k3">|</span>
              <span class="k3">|</span>           <span class="k3">|</span>
              <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

or</p><div class="source-code snippet"><div class="inner"><pre>              <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
              <span class="k3">|</span>B          <span class="k3">|</span>
              <span class="k3">|</span>           <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>      <span class="k3">|</span>
<span class="k3">|</span>A                 <span class="k3">|</span>      <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>      <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

or</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B          <span class="k3">|</span>
<span class="k3">|</span>           <span class="k3">|</span>
<span class="k3">|</span>       <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>       <span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>       <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

or</p><div class="source-code snippet"><div class="inner"><pre>        <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
        <span class="k3">|</span>A                 <span class="k3">|</span> 
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>B      <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>       <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>       <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>           <span class="k3">|</span>
<span class="k3">|</span>           <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

case (4) rectangle A overlaps a middle portion of one side of B.</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B          <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>   <span class="k3">|</span>
<span class="k3">|</span>A           <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>            <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>            <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>            <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>   <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Or</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B          <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">|</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>    <span class="k3">|</span>A           <span class="k3">|</span>
     <span class="k3">|</span>    <span class="k3">|</span>            <span class="k3">|</span>
     <span class="k3">|</span>    <span class="k3">|</span>            <span class="k3">|</span>
     <span class="k3">|</span>    <span class="k3">|</span>            <span class="k3">|</span>
     <span class="k3">|</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Or</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>A        <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>         <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B   <span class="k3">|</span>         <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>         <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>    <span class="k3">|</span>
<span class="k3">|</span>                   <span class="k3">|</span>
<span class="k3">|</span>                   <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Or</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B                  <span class="k3">|</span>
<span class="k3">|</span>                   <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>    <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>A        <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">|</span>    <span class="k3">|</span>         <span class="k3">|</span>    <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>         <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>         <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

case (5) rectangle A is in the middle of B.</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span>A         <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span>          <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span>          <span class="k3">|</span>   <span class="k3">|</span>
<span class="k3">|</span>   <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>   <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

The above is the first part. Somebody please post a little message so I can post the 2nd part.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Sat, 18 Sep 2004 18:06:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Somebody please post a little message so I can post the 2nd part.</p></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kauhiz)</author>
		<pubDate>Sat, 18 Sep 2004 18:25:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hey i will!</p><p>now whose the kind person who gave the long post about rectangles on this<br />thread ?</p><p>good on ya
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Sun, 19 Sep 2004 14:24:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here is the 2nd part:</p><p><b>Analysis</b></p><p>What we see from the above is that rectangle A splits rectangle B into one or more rectangles. Let&#039;s see how rectangle B is splitted.</p><p>Total overlap:</p><p>In total overlap, there is no left overs from rectangle B.</p><p>No overlap:</p><p>When two rectangles don&#039;t overlap, B remains as is.</p><p>Partial overlap:</p><p>(Area covered with &#039;////&#039; is the remaining rectangle)</p><p>Rectangle A splits rectangle B in one rectangle:</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>B1<span class="c">///|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="c">/////|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="c">/////|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>A                 <span class="k3">|</span>
     <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>B1<span class="c">//|                  |</span>
<span class="k3">|</span><span class="c">////|                  |</span>
<span class="k3">|</span><span class="c">////|                  |</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
     <span class="k3">|</span>                  <span class="k3">|</span>
     <span class="k3">|</span>                  <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>B1<span class="c">////////|  </span>
    <span class="k3">|</span><span class="c">//////////|  </span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>B1<span class="c">////////|  </span>
    <span class="k3">|</span><span class="c">//////////|  </span>
    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Rectangle A splits rectangle B in two rectangles:</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>B1<span class="c">/////////////|</span>
    <span class="k3">|</span><span class="c">///////////////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                      <span class="k3">|</span>
<span class="k3">|</span>                       <span class="k3">|</span>
<span class="k3">|</span>                       <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
    <span class="k3">|</span>B2<span class="c">/////////////|</span>
    <span class="k3">|</span><span class="c">///////////////|</span>
    <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>
     <span class="k3">|</span>A            <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>             <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B1<span class="c">//|             |B2//|</span>
<span class="k3">|</span><span class="c">////|             |////|</span>
<span class="k3">|</span><span class="c">////|             |////|</span>
<span class="k3">|</span><span class="c">////|             |////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>             <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>             <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A                 <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>B2<span class="c">////| </span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="c">//////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>
              <span class="k3">|</span>B1<span class="c">/////////|</span>
              <span class="k3">|</span><span class="c">///////////|</span>
              <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre>              <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
              <span class="k3">|</span>B1<span class="c">/////////|</span>
              <span class="k3">|</span><span class="c">///////////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>
<span class="k3">|</span>A                 <span class="k3">|</span>B2<span class="c">////|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="c">//////|</span>
<span class="k3">|</span>                  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B1<span class="c">/////////|</span>
<span class="k3">|</span><span class="c">///////////|</span>
<span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B2<span class="c">/////|A                 |</span>
<span class="k3">|</span><span class="c">///////|                  |</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre>        <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
        <span class="k3">|</span>A                 <span class="k3">|</span> 
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
        <span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>                  <span class="k3">|</span>
<span class="k3">|</span>B1<span class="c">/////|                  |</span>
<span class="k3">|</span><span class="c">///////|                  |</span>
<span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B2<span class="c">/////////|</span>
<span class="k3">|</span><span class="c">///////////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Rectangle A splits rectangle B in three rectangles:</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B1<span class="c">/////////|</span>
     <span class="k3">|</span><span class="c">///////////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A           <span class="k3">|</span>B2<span class="k3">/</span><span class="k3">|</span>
<span class="k3">|</span>            <span class="k3">|</span><span class="c">///|</span>
<span class="k3">|</span>            <span class="k3">|</span><span class="c">///|</span>
<span class="k3">|</span>            <span class="k3">|</span><span class="c">///|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B3<span class="c">/////////|</span>
     <span class="k3">|</span><span class="c">///////////|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Or</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B1<span class="c">/////////|</span>
     <span class="k3">|</span><span class="c">///////////|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B2<span class="c">//|A           |</span>
     <span class="k3">|</span><span class="c">////|            |</span>
     <span class="k3">|</span><span class="c">////|            |</span>
     <span class="k3">|</span><span class="c">////|            |</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B3<span class="c">/////////|</span>
     <span class="k3">|</span><span class="c">///////////|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Or</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>A        <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>         <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B1<span class="c">//|         |B3//|</span>
<span class="k3">|</span><span class="c">////|         |////|</span>
<span class="k3">|</span><span class="c">////-----------////|</span>
<span class="k3">|</span><span class="c">////|B2///////|////|</span>
<span class="k3">|</span><span class="c">////|/////////|////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

Or</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B1<span class="c">//|B2///////|B3//|</span>
<span class="k3">|</span><span class="c">////|/////////|////|</span>
<span class="k3">|</span><span class="c">////-----------////|</span>
<span class="k3">|</span><span class="c">////|A        |////|</span>
<span class="k3">|</span><span class="c">////|         |////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>         <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>         <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

case (5) Rectangle A splits rectangle B in four rectangles:</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>B1<span class="c">////////////////|</span>
<span class="k3">|</span><span class="c">//////////////////|</span>
<span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>
<span class="k3">|</span>B2<span class="k3">/</span><span class="k3">|</span>A         <span class="k3">|</span>B3<span class="k3">/</span><span class="k3">|</span>
<span class="k3">|</span><span class="c">///|          |///|</span>
<span class="k3">|</span><span class="c">///|          |///|</span>
<span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>
<span class="k3">|</span>B4<span class="c">////////////////|</span>
<span class="k3">|</span><span class="c">//////////////////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

As we can see, the splitting of rectangle B from rectangle A results to 0, 1, 2, 3 or 4 new rectangles. We see that splitting is done per side, i.e. the left side of rect A splits the left side of rect B, the top side of rect A splits the top side of rect B etc. Let&#039;s see how we can implement it.</p><p><b>Implementation</b></p><p>The following is only an example, of course. You may optimize it the way it suits you. I am going to use C++, as STL gives me a ground to talk on.</p><p>We need a routine that takes two rectangles as an input, and produces a list of rectangles that is the remains of the splitting, as it was described above. The routine supposes that the two rectangles overlap. Let&#039;s see the routine:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">//rectangle</span>
<span class="number">  2</span><span class="k1">struct</span> Rect <span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">int</span> left<span class="k2">;</span>
<span class="number">  4</span>    <span class="k1">int</span> top<span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">int</span> right<span class="k2">;</span>
<span class="number">  6</span>    <span class="k1">int</span> bottom<span class="k2">;</span>
<span class="number">  7</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="c">//type of rectangle list</span>
<span class="number"> 10</span><span class="k1">typedef</span> std::list<span class="k3">&lt;</span>Rect&gt; RectList<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="c">//splits a rectangle by another rectangle</span>
<span class="number"> 13</span>RectList splitRect<span class="k2">(</span><span class="k1">const</span> Rect <span class="k3">&amp;</span>b, <span class="k1">const</span> Rect <span class="k3">&amp;</span>a<span class="k2">)</span>
<span class="number"> 14</span><span class="k2">{</span>
<span class="number"> 15</span>    RectList result<span class="k2">;</span>
<span class="number"> 16</span>    Rect t<span class="k2">;</span>
<span class="number"> 17</span>    
<span class="number"> 18</span>    <span class="c">//split the left side</span>
<span class="number"> 19</span>    <span class="k1">if</span> <span class="k2">(</span>b.left <span class="k3">&lt;</span> a.left<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 20</span>        t.left <span class="k3">=</span> b.left<span class="k2">;</span>
<span class="number"> 21</span>        t.right <span class="k3">=</span> a.left <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 22</span>        t.top <span class="k3">=</span> MAX<span class="k2">(</span>a.top, b.top<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>        t.bottom <span class="k3">=</span> MIN<span class="k2">(</span>a.bottom, b.bottom<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>        result.push_back<span class="k2">(</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    <span class="k2">}</span>
<span class="number"> 26</span>    
<span class="number"> 27</span>    <span class="c">//split the right side</span>
<span class="number"> 28</span>    <span class="k1">if</span> <span class="k2">(</span>b.right <span class="k3">&gt;</span> a.right<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 29</span>        t.left <span class="k3">=</span> a.right <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 30</span>        t.right <span class="k3">=</span> b.right<span class="k2">;</span>
<span class="number"> 31</span>        t.top <span class="k3">=</span> MAX<span class="k2">(</span>a.top, b.top<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>        t.bottom <span class="k3">=</span> MIN<span class="k2">(</span>a.bottom, b.bottom<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>        result.push_back<span class="k2">(</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>    <span class="k2">}</span>
<span class="number"> 35</span>    
<span class="number"> 36</span>    <span class="c">//split the top side</span>
<span class="number"> 37</span>    <span class="k1">if</span> <span class="k2">(</span>b.top <span class="k3">&lt;</span> a.top<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 38</span>        t.top <span class="k3">=</span> b.top<span class="k2">;</span>
<span class="number"> 39</span>        t.bottom <span class="k3">=</span> a.top <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 40</span>        t.left <span class="k3">=</span> MAX<span class="k2">(</span>a.left, b.left<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>        t.right <span class="k3">=</span> MIN<span class="k2">(</span>a.right, b.right<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>    <span class="k2">}</span>
<span class="number"> 43</span>    
<span class="number"> 44</span>    <span class="c">//split the bottom side</span>
<span class="number"> 45</span>    <span class="k1">if</span> <span class="k2">(</span>b.bottom <span class="k3">&gt;</span> a.bottom<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 46</span>        t.top <span class="k3">=</span> a.bottom <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 47</span>        t.bottom <span class="k3">=</span> b.bottom<span class="k2">;</span>
<span class="number"> 48</span>        t.left <span class="k3">=</span> MAX<span class="k2">(</span>a.left, b.left<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>        t.right <span class="k3">=</span> MIN<span class="k2">(</span>a.right, b.right<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>    <span class="k2">}</span>
<span class="number"> 51</span>    
<span class="number"> 52</span>    <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 53</span><span class="k2">}</span>
</div></div><p>

The above routine splits rectangle B into one or more rectangles by subtracting rectangle A from B. After the splitting, the rectangle B is no longer useful. The routine should be used in another routine that subtracts a rectangle from a rectangle list:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">//rectangle iterator</span>
<span class="number">  2</span><span class="k1">typedef</span> RectList::iterator RectIterator<span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="c">//subtracts rect 'r' from list 'l'</span>
<span class="number">  5</span><span class="k1">void</span> subtractRect<span class="k2">(</span>RectList <span class="k3">&amp;</span>l, <span class="k1">const</span> Rect <span class="k3">&amp;</span>r<span class="k2">)</span>
<span class="number">  6</span><span class="k2">{</span>
<span class="number">  7</span>    <span class="c">//iterate list 'l'</span>
<span class="number">  8</span>    RectIterator it <span class="k3">=</span> l.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">while</span> <span class="k2">(</span>it <span class="k3">!</span><span class="k3">=</span> l.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>        <span class="c">//get next rectangle before the main action because 'it' may be erased from the list</span>
<span class="number"> 11</span>        RectIterator itNext <span class="k3">=</span> it<span class="k2">;</span>
<span class="number"> 12</span>        <span class="k3">+</span><span class="k3">+</span>itNext<span class="k2">;</span>
<span class="number"> 13</span>        
<span class="number"> 14</span>        <span class="c">//get rectangle of list 'l'</span>
<span class="number"> 15</span>        <span class="k1">const</span> Rect <span class="k3">&amp;</span>t <span class="k3">=</span> <span class="k3">*</span>it<span class="k2">;</span>
<span class="number"> 16</span>        
<span class="number"> 17</span>        <span class="c">//if rectagle of list 't' and given rectangle 'r' overlap, then split 't' by 'r'</span>
<span class="number"> 18</span>        <span class="k1">if</span> <span class="k2">(</span>rectsOverlap<span class="k2">(</span>t, r<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 19</span>            RectList temp <span class="k3">=</span> splitRect<span class="k2">(</span>t, r<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>            l.insert<span class="k2">(</span>it, temp.begin<span class="k2">(</span><span class="k2">)</span>, temp.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>            
<span class="number"> 22</span>            <span class="c">//the rectangle 't' was splitted, so we no longer need it</span>
<span class="number"> 23</span>            l.erase<span class="k2">(</span>it<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>        <span class="k2">}</span>
<span class="number"> 25</span>        
<span class="number"> 26</span>        <span class="c">//next rectangle</span>
<span class="number"> 27</span>        it <span class="k3">=</span> itNext<span class="k2">;</span>
<span class="number"> 28</span>    <span class="k2">}</span>
<span class="number"> 29</span><span class="k2">}</span>
</div></div><p>

The above routine is useful in subtracting one list from the other:</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//subtracts rectangle list 'a' from rectangle list 'b'</span>
<span class="k1">void</span> subtractList<span class="k2">(</span>RectList <span class="k3">&amp;</span>b, <span class="k1">const</span> RectList <span class="k3">&amp;</span>a<span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">for</span><span class="k2">(</span>RectIterator it <span class="k3">=</span> a.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> a.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it<span class="k2">)</span> <span class="k2">{</span>
        subtractRect<span class="k2">(</span>b, <span class="k3">*</span>it<span class="k2">)</span><span class="k2">;</span>
    <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

So the algorithm of optimally combine two rectangle lists becomes:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> combineLists<span class="k2">(</span>RectList <span class="k3">&amp;</span>result, <span class="k1">const</span> RectList <span class="k3">&amp;</span>a, <span class="k1">const</span> RectList <span class="k3">&amp;</span>b<span class="k2">)</span>
<span class="k2">{</span>
    <span class="c">//subtract list A from list B</span>
    result <span class="k3">=</span> b<span class="k2">;</span>      
    subtractList<span class="k2">(</span>result, a<span class="k2">)</span><span class="k2">;</span>
    
    <span class="c">//unite B-A with list A</span>
    result.insert<span class="k2">(</span>result.end<span class="k2">(</span><span class="k2">)</span>, a.begin<span class="k2">(</span><span class="k2">)</span>, a.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

<b>Conclusions</b></p><p>The above algorithms may be optimized in numerous ways: rectangles can be kept in pre-allocated lists ordered by scanlines; arrays can be used instead double-linked lists; horizontal strips may be combined; rectangles can be ordered vertically from top to bottom in order to be nice to the screen refresh etc. </p><p><b>Other DRS algorithms</b></p><p>Another DRS algorithm, which is much simpler, is to divide the playing area into blocks, and mark each block that is dirty. When it is time to update the screen, blit all dirty blocks. By carefully chosing the size of blocks, an optimal speed may be achieved.</p><p>Dirty blocks can be placed in a list if their dirty flag is not set. Then the list of dirty blocks is traversed, each block&#039;s dirty flag is reset and the relevant area of the game buffer is blitted to the screen.</p><p>You can find an example of the above [url <a href="http://www.allegro.cc/forums/view_thread.php?_id=395646]here[/url">http://www.allegro.cc/forums/view_thread.php?_id=395646]here[/url</a>].
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Sun, 19 Sep 2004 14:48:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The most glaring optimization to me would be that if subtracting A from B yields 3 or 4 rectangles, instead subtract B from A, which will result in 1 or 0 rectangles, respectively.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Sun, 19 Sep 2004 18:50:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>B-A != A-B.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Sun, 19 Sep 2004 22:15:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The goal of overlap handling is to effectively OR the two buffers together (were they stored as a mask). In order to do this, you remove the intersection of A from B, then merge the two lists together. This is functionally the same as removing B from A and merging the two lists together. By doing this, you have fewer rectangles in the end product.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Sun, 19 Sep 2004 22:24:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>This is functionally the same as removing B from A</p></div></div><p>

Nothing guarrantees that A-B is more optimizable than B-A and vice versa.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>and merging the two lists together.</p></div></div><p>

You have to unite the result with the other list though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Mon, 20 Sep 2004 18:40:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In a situation similar to the one below in figure 1, wouldn´t it be more effective to just blit the combined borders as in figure 2? (in that specific case) So that you get only one blit, and the rectangles are within a quite close range and aligned horizontally.
</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>           <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>        <span class="k3">|</span> <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>  <span class="k3">|</span>     <span class="k3">|</span>
<span class="k3">|</span>   a    <span class="k3">|</span> <span class="k3">|</span>   b  <span class="k3">|</span>  <span class="k3">|</span>  c  <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span> <span class="k3">|</span>      <span class="k3">|</span>  <span class="k3">|</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>
           <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>
<i>Above -- Figure 1</i>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span> a:s left upper corner <span class="k3">&amp;</span>  <span class="k3">|</span>
<span class="k3">|</span> a.left,b.bottom low left <span class="k3">|</span>
<span class="k3">|</span> corner <span class="k1">and</span> c upper right <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>
<i>Above -- Figure 2</i></p><p>Do anyone know of any good books/articles about different DRS algorithms? I would like to get a feeling for which solutions are commonly used.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kentl)</author>
		<pubDate>Wed, 22 Sep 2004 06:57:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>aximilar: Look A splits B into 3 parts:&lt;/code&gt;      -------------<br />     |B1/////////|<br />     |///////////|<br />------------------<br />|A           |B2/|<br />|            |///|<br />|            |///|<br />|            |///|<br />------------------<br />     |B3/////////|<br />     |///////////|<br />     -------------&lt;/code&gt;BUT! What if we reversed it. B splits A! into 1 part!<span class="source-code">     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></span><br />     |B          |<br />     |           |<br />-----|           |<br />|A1//|           |<br />|////|           |<br />|////|           |<br />|////|           |<br />-----|           |<br />     |           |<br />     |           |<br />     -------------&lt;/code&gt;The net result of this is that when you merge A and B you have fewer rectangles and thus fewer blits. I don&#39;t know how much of an actual speed optimization this is, but it&#39;s there, nonetheless.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 22 Sep 2004 07:08:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>In a situation similar to the one below in figure 1, wouldn´t it be more effective to just blit the combined borders as in figure 2? (in that specific case) So that you get only one blit, and the rectangles are within a quite close range and aligned horizontally.</p></div></div><p>

It certainly would be more effective, but in order to do so you have to calculate distances between each pair of rectangles, either horizontally or vertically, which means that each rectangle should be compared with every other rectangle at least twice.</p><p>And then, how do you combine more than two rectangles in one blit?</p><p>There have to be some compromizes for such an optimization to work.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>aximilar: Look A splits B into 3 parts:</p><p>BUT! What if we reversed it. B splits A! into 1 part!</p><p>The net result of this is that when you merge A and B you have fewer rectangles and thus fewer blits. I don&#39;t know how much of an actual speed optimization this is, but it&#39;s there, nonetheless.</p></div></div><p>

I understood what you say in the first post. But you have to be aware that if you reverse the subtraction (do A-B instead of B-A), you have to subtract the result from the other list. In other words, you either do:</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//list that contains all rectangles of B except the rectangles of A</span>
TEMP LIST <span class="k3">=</span> LIST B <span class="k3">-</span> LIST A

<span class="c">//optimal list that contains all rectangles of A plus all rectangles of B not overlapping with A</span>
OPTIMAL LIST <span class="k3">=</span> LIST A <span class="k3">+</span> TEMP LIST
</pre></div></div><p>

or you do:</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//list that contains all rectangles of B except the rectangles of A</span>
TEMP LIST <span class="k3">=</span> LIST A <span class="k3">-</span> LIST B <span class="k3">&lt;</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span> your optimization here

<span class="c">//optimal list that contains all rectangles of B plus all rectangles of A not overlapping with B</span>
OPTIMAL LIST <span class="k3">=</span> LIST B <span class="k3">+</span> TEMP LIST <span class="k3">&lt;</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span> needed change
</pre></div></div><p>

There is no guarrantee that by doing the latter the subtraction will be more optimized. It may be so for one rectangle, but it may not be so for the other ones.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Wed, 22 Sep 2004 14:58:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How would it not be an optimization for other ones? You have fewer rectangles, meaning fewer blits...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 22 Sep 2004 16:27:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I just melt both rectangles in one, using the bounds to create it. Some parts that don&#39;t need to be blitted will be blitted, but still it is much faster than blitting a lot of small pieces in a near place.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 22 Sep 2004 19:45:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>How would it not be an optimization for other ones? You have fewer rectangles, meaning fewer blits...</p></div></div><p>

Because it is not guarranteed that the rest of the rectangles will have a configuration similar to the one you showed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Wed, 22 Sep 2004 21:16:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>But I covered all possible configurations. If A-B would result in 3 or 4 resultant rectangles (which we can check for), than instead do B-A, which results in 1 or 2 resultants, respectively. If A-B results in 0, 1, or 2 resulatants, than stick with A-B.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Thu, 23 Sep 2004 04:43:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>But I covered all possible configurations. If A-B would result in 3 or 4 resultant rectangles (which we can check for), than instead do B-A, which results in 1 or 2 resultants, respectively. If A-B results in 0, 1, or 2 resulatants, than stick with A-B.</p></div></div><p>

The way the formula I posted works, if A and B are swapped in the rectangle subtraction, they have to be swapped in all the formulas.</p><p>And I am not sure if checking of how many rectangles the subtraction will result in is any different from the actual subtraction.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Thu, 23 Sep 2004 13:12:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Consider the case with the largest difference. Case 5 in your above example. The way it is now, B-A, there are five rectangles in the end. Subtract A from B instead to see the new net: 1 rectangle.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Fri, 24 Sep 2004 01:00:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Consider the case with the largest difference. Case 5 in your above example. The way it is now, B-A, there are five rectangles in the end. Subtract A from B instead to see the new net: 1 rectangle.</p></div></div><p>

I understood what you said. Really. And you are correct, in the context of the rectangle subtraction. But unfortunately, it is not what we want.</p><p>If I do this:</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B          <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>           <span class="k3">|</span>
<span class="k3">|</span>A1<span class="c">//|           |</span>
<span class="k3">|</span><span class="c">////|           |</span>
<span class="k3">|</span><span class="c">////|           |</span>
<span class="k3">|</span><span class="c">////|           |</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">|</span>           <span class="k3">|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

instead of this</p><div class="source-code snippet"><div class="inner"><pre>     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B1<span class="c">/////////|</span>
     <span class="k3">|</span><span class="c">///////////|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="k3">|</span>A           <span class="k3">|</span>B2<span class="k3">/</span><span class="k3">|</span>
<span class="k3">|</span>            <span class="k3">|</span><span class="c">///|</span>
<span class="k3">|</span>            <span class="k3">|</span><span class="c">///|</span>
<span class="k3">|</span>            <span class="k3">|</span><span class="c">///|</span>
<span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
     <span class="k3">|</span>B3<span class="c">/////////|</span>
     <span class="k3">|</span><span class="c">///////////|</span>
     <span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
</pre></div></div><p>

then the area A1 will exist twice in the final rectangle list: it will exist once in the intermediate temporary list that is the result of A-B and once in the list A. </p><p>Let&#39;s do the same example with sets. This is my way:</p><div class="source-code snippet"><div class="inner"><pre>A <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span>
B <span class="k3">=</span> <span class="k2">{</span><span class="n">2</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span>
T <span class="k3">=</span> B <span class="k3">-</span> A <span class="k3">=</span> <span class="k2">{</span><span class="n">2</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span> <span class="k3">-</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span> <span class="k3">=</span> <span class="k2">{</span><span class="n">4</span>, <span class="n">5</span><span class="k2">}</span>
R <span class="k3">=</span> A <span class="k3">+</span> T <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span> <span class="k3">+</span> <span class="k2">{</span><span class="n">4</span>, <span class="n">5</span><span class="k2">}</span> <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span>
</pre></div></div><p>

In the above example, we end up with a set that all elements are unique. Now let&#39;s try your method:</p><div class="source-code snippet"><div class="inner"><pre>A <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span>
B <span class="k3">=</span> <span class="k2">{</span><span class="n">2</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span>
T <span class="k3">=</span> A <span class="k3">-</span> B <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span> <span class="k3">-</span> <span class="k2">{</span><span class="n">2</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span> <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">3</span><span class="k2">}</span>
R <span class="k3">=</span> A <span class="k3">+</span> T <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span> <span class="k3">+</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">3</span><span class="k2">}</span> <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span>, <span class="n">3</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span>
</pre></div></div><p>

With your way, we end up with a set with duplicate elements. If an element was a rectangle, we would have duplicate rectangles.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Fri, 24 Sep 2004 01:59:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre>A <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span>
B <span class="k3">=</span> <span class="k2">{</span><span class="n">2</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span>
T <span class="k3">=</span> A <span class="k3">-</span> B <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span><span class="k2">}</span> <span class="k3">-</span> <span class="k2">{</span><span class="n">2</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span> <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">3</span><span class="k2">}</span>
R <span class="k3">=</span> B <span class="k3">+</span> T <span class="k3">=</span> <span class="k2">{</span><span class="n">2</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span> <span class="k3">+</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">3</span><span class="k2">}</span> <span class="k3">=</span> <span class="k2">{</span><span class="n">1</span>, <span class="n">2</span>, <span class="n">3</span>, <span class="n">4</span>, <span class="n">5</span><span class="k2">}</span>
</pre></div></div><p>

EDIT: Where is the union symbol in WinXP charmap? I could find intersection, but union was no where near it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Surt)</author>
		<pubDate>Fri, 24 Sep 2004 11:02:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m not sure of your notation, but how difficult is it to remove A from the original list?</p><p>(Sorry for the long delay, I had a hurricane take me offline for a few days <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Thu, 30 Sep 2004 05:40:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>CGamesPlay, nothing guarrantees that by subtracting list A, the algorithm would be more optimizable than it is right now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Thu, 30 Sep 2004 15:30:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Axilmar, you should submit this to pixelate, its an awesome walk through, thanks!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Sun, 03 Oct 2004 04:00:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t know how Pixelate works. Can anyone submit articles to it?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Sun, 03 Oct 2004 13:37:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Yes, but Pixelate is kind of dead now. <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (23yrold3yrold)</author>
		<pubDate>Sun, 03 Oct 2004 19:14:21 +0000</pubDate>
	</item>
</rss>
