<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Polygon Collision</title>
		<link>http://www.allegro.cc/forums/view/590817</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 05 Apr 2007 07:15:54 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m working on a game which needs polygon collision detection, so I wrote some code with the help of a tutorial, but it doesn&#39;t quite work. Depending on the sides of the polygon it overcalculates the collision.</p><p>Here is the collision 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">class</span> CVec2D</td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>public:</td></tr><tr><td class="number">4</td><td>  <span class="k1">float</span> x, y<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">float</span> magnitude<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>  CVec2D<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">8</td><td>  CVec2D<span class="k2">(</span><span class="k1">float</span> xPos, <span class="k1">float</span> yPos<span class="k2">)</span> <span class="k2">:</span> x<span class="k2">(</span>xPos<span class="k2">)</span>, y<span class="k2">(</span>yPos<span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">9</td><td>  ~CVec2D<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">float</span> Magnitude<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>x <span class="k3">*</span> x <span class="k3">+</span> y <span class="k3">*</span> y<span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">void</span> Normalize<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>x <span class="k3">=</span> x <span class="k3">/</span> Magnitude<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> y <span class="k3">=</span> y <span class="k3">/</span> Magnitude<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">float</span> DotProduct<span class="k2">(</span>CVec2D vec<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> x <span class="k3">*</span> vec.x <span class="k3">+</span> y <span class="k3">*</span> vec.y<span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">13</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="k1">struct</span> CollisionResult</td></tr><tr><td class="number">16</td><td><span class="k2">{</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">bool</span> collided, willCollide<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  CVec2D translateVec<span class="k2">;</span></td></tr><tr><td class="number">19</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td><span class="k1">class</span> CPoly</td></tr><tr><td class="number">22</td><td><span class="k2">{</span></td></tr><tr><td class="number">23</td><td>private:</td></tr><tr><td class="number">24</td><td>  vector<span class="k3">&lt;</span>CVec2D&gt; m_points, m_sides<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  <span class="k1">float</span> m_radius<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>  <span class="k1">void</span> ProjectPoly<span class="k2">(</span>CVec2D axis, CPoly <span class="k3">&amp;</span>poly, <span class="k1">float</span> <span class="k3">&amp;</span>min, <span class="k1">float</span> <span class="k3">&amp;</span>max<span class="k2">)</span></td></tr><tr><td class="number">28</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>    <span class="c">// project all the polygon's points onto the axis using the dot product</span></td></tr><tr><td class="number">30</td><td>    <span class="k1">float</span> dp <span class="k3">=</span> axis.DotProduct<span class="k2">(</span>poly.GetPoint<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    min <span class="k3">=</span> dp<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    max <span class="k3">=</span> dp<span class="k2">;</span></td></tr><tr><td class="number">33</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> i <span class="k3">&lt;</span> poly.PointAmount<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">34</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>      dp <span class="k3">=</span> poly.GetPoint<span class="k2">(</span>i<span class="k2">)</span>.DotProduct<span class="k2">(</span>axis<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>      <span class="k1">if</span><span class="k2">(</span>dp <span class="k3">&lt;</span> min<span class="k2">)</span> min <span class="k3">=</span> dp<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>dp <span class="k3">&gt;</span> max<span class="k2">)</span> max <span class="k3">=</span> dp<span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">40</td><td>  <span class="k1">float</span> IntervalDist<span class="k2">(</span><span class="k1">float</span> min, <span class="k1">float</span> max, <span class="k1">float</span> min2, <span class="k1">float</span> max2<span class="k2">)</span></td></tr><tr><td class="number">41</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">42</td><td>    <span class="k1">if</span><span class="k2">(</span>min <span class="k3">&lt;</span> min2<span class="k2">)</span> <span class="k1">return</span> min2 <span class="k3">-</span> max<span class="k2">;</span></td></tr><tr><td class="number">43</td><td>    <span class="k1">else</span> <span class="k1">return</span> min <span class="k3">-</span> max2<span class="k2">;</span></td></tr><tr><td class="number">44</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">45</td><td>public:</td></tr><tr><td class="number">46</td><td>  CPoly<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">47</td><td>  ~CPoly<span class="k2">(</span><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="k1">void</span> AddPoint<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y<span class="k2">)</span> <span class="k2">{</span>m_points.push_back<span class="k2">(</span>CVec2D<span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">50</td><td>  <span class="k1">void</span> Clear<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>m_points.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">51</td><td>  <span class="k1">int</span> PointAmount<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">52</td><td>  <span class="k1">int</span> SideAmount<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> m_sides.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">53</td><td>  CVec2D GetPoint<span class="k2">(</span><span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> m_points<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">54</td><td>  CVec2D GetSide<span class="k2">(</span><span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> m_sides<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">55</td><td>  <span class="k1">void</span> BuildSides<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">56</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">57</td><td>    CVec2D v1, v2<span class="k2">;</span></td></tr><tr><td class="number">58</td><td>    m_sides.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</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> i <span class="k3">&lt;</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">60</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>      v1 <span class="k3">=</span> m_points<span class="k3">&lt;</span>i&gt;<span class="k2">;</span></td></tr><tr><td class="number">62</td><td>      <span class="k1">if</span><span class="k2">(</span>i <span class="k3">+</span> <span class="n">1</span> <span class="k3">&lt;</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> v2 <span class="k3">=</span> m_points<span class="k2">[</span>i <span class="k3">+</span> <span class="n">1</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>      <span class="k1">else</span> v2 <span class="k3">=</span> m_points<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>      m_sides.push_back<span class="k2">(</span>CVec2D<span class="k2">(</span>v2.x <span class="k3">-</span> v1.x, v2.y <span class="k3">-</span> v1.y<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">66</td><td>    <span class="c">// find the minimum radius that surrounds the polygon</span></td></tr><tr><td class="number">67</td><td>    <span class="k1">float</span> currentMax <span class="k3">=</span> <span class="n">574969476</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>    CVec2D cen <span class="k3">=</span> Center<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</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> i <span class="k3">&lt;</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">70</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">71</td><td>      <span class="k1">float</span> side1, side2<span class="k2">;</span></td></tr><tr><td class="number">72</td><td>      side1 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>m_points<span class="k3">&lt;</span>i&gt;.x <span class="k3">-</span> cen.x<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>      side2 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>m_points<span class="k3">&lt;</span>i&gt;.y <span class="k3">-</span> cen.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>      <span class="k1">float</span> dist <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>side1 <span class="k3">*</span> side1 <span class="k3">+</span> side2 <span class="k3">*</span> side2<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>dist <span class="k3">&gt;</span> currentMax<span class="k2">)</span> currentMax <span class="k3">=</span> dist<span class="k2">;</span></td></tr><tr><td class="number">76</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">77</td><td>    m_radius <span class="k3">=</span> currentMax<span class="k2">;</span></td></tr><tr><td class="number">78</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">79</td><td>  <span class="k1">void</span> Draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buf<span class="k2">)</span></td></tr><tr><td class="number">80</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">81</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> i <span class="k3">&lt;</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">82</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">83</td><td>      <span class="k1">if</span><span class="k2">(</span>i <span class="k3">+</span> <span class="n">1</span> <span class="k3">&lt;</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <a href="http://www.allegro.cc/manual/line" target="_blank"><span class="a">line</span></a><span class="k2">(</span>buf, m_points<span class="k3">&lt;</span>i&gt;.x, m_points<span class="k3">&lt;</span>i&gt;.y, m_points<span class="k2">[</span>i <span class="k3">+</span> <span class="n">1</span><span class="k2">]</span>.x, m_points<span class="k2">[</span>i <span class="k3">+</span> <span class="n">1</span><span class="k2">]</span>.y, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>      <span class="k1">else</span> <a href="http://www.allegro.cc/manual/line" target="_blank"><span class="a">line</span></a><span class="k2">(</span>buf, m_points<span class="k3">&lt;</span>i&gt;.x, m_points<span class="k3">&lt;</span>i&gt;.y, m_points<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.x, m_points<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.y, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">86</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">87</td><td>  <span class="k1">void</span> Move<span class="k2">(</span><span class="k1">float</span> xAmount, <span class="k1">float</span> yAmount<span class="k2">)</span></td></tr><tr><td class="number">88</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">89</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> i <span class="k3">&lt;</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">90</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">91</td><td>      m_points<span class="k3">&lt;</span>i&gt;.x <span class="k3">+</span><span class="k3">=</span> xAmount<span class="k2">;</span></td></tr><tr><td class="number">92</td><td>      m_points<span class="k3">&lt;</span>i&gt;.y <span class="k3">+</span><span class="k3">=</span> yAmount<span class="k2">;</span></td></tr><tr><td class="number">93</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">94</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">95</td><td>  CVec2D Center<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">96</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">97</td><td>    <span class="c">// find the center</span></td></tr><tr><td class="number">98</td><td>    <span class="k1">float</span> xTotal <span class="k3">=</span> <span class="n">0</span>, yTotal <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">99</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> i <span class="k3">&lt;</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">100</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">101</td><td>      xTotal <span class="k3">+</span><span class="k3">=</span> m_points<span class="k3">&lt;</span>i&gt;.x<span class="k2">;</span></td></tr><tr><td class="number">102</td><td>      yTotal <span class="k3">+</span><span class="k3">=</span> m_points<span class="k3">&lt;</span>i&gt;.y<span class="k2">;</span></td></tr><tr><td class="number">103</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">104</td><td>    <span class="k1">float</span> xCenter <span class="k3">=</span> xTotal <span class="k3">/</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">105</td><td>    <span class="k1">float</span> yCenter <span class="k3">=</span> yTotal <span class="k3">/</span> m_points.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">106</td><td>    <span class="k1">return</span> CVec2D<span class="k2">(</span>xCenter, yCenter<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">107</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">108</td><td>  <span class="k1">float</span> Radius<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> m_radius<span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">109</td><td>  CollisionResult Collision<span class="k2">(</span>CPoly <span class="k3">&amp;</span>poly, CVec2D velocity<span class="k2">)</span></td></tr><tr><td class="number">110</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">111</td><td>    CollisionResult result<span class="k2">;</span></td></tr><tr><td class="number">112</td><td>    result.collided <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">113</td><td>    result.willCollide <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">114</td><td>    result.translateVec <span class="k3">=</span> CVec2D<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td>                <span class="c">// do circle collision first to check if they are in the same area</span></td></tr><tr><td class="number">116</td><td>    CVec2D cen1 <span class="k3">=</span> Center<span class="k2">(</span><span class="k2">)</span>, cen2 <span class="k3">=</span> poly.Center<span class="k2">(</span><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><a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>cen1.x <span class="k3">-</span> cen2.x, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>cen1.y <span class="k3">-</span> cen2.y, <span class="n">2</span><span class="k2">)</span> <span class="k3">&gt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>Radius<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> poly.Radius<span class="k2">(</span><span class="k2">)</span>, <span class="n">2</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">118</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">119</td><td>      result.collided <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">120</td><td>      result.willCollide <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>      <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">122</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">123</td><td>    <span class="k1">float</span> minIntervalDist <span class="k3">=</span> <span class="n">4294967295</span><span class="k2">;</span></td></tr><tr><td class="number">124</td><td>    CVec2D translationAxis<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">125</td><td>    CVec2D side<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span>, transAxis<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">126</td><td>    <span class="c">// loop through all the sides</span></td></tr><tr><td class="number">127</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> i <span class="k3">&lt;</span> m_sides.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> poly.PointAmount<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">128</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">129</td><td>      <span class="k1">if</span><span class="k2">(</span>i <span class="k3">&lt;</span> m_sides.size<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> side <span class="k3">=</span> m_sides<span class="k3">&lt;</span>i&gt;<span class="k2">;</span></td></tr><tr><td class="number">130</td><td>      <span class="k1">else</span> side <span class="k3">=</span> poly.GetSide<span class="k2">(</span>i <span class="k3">-</span> m_sides.size<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">131</td><td>&#160;</td></tr><tr><td class="number">132</td><td>      <span class="c">// find the sides normal</span></td></tr><tr><td class="number">133</td><td>      CVec2D axis <span class="k3">=</span> CVec2D<span class="k2">(</span><span class="k3">-</span>side.y, side.x<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">134</td><td>      axis.Normalize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">135</td><td>&#160;</td></tr><tr><td class="number">136</td><td>      <span class="k1">float</span> min <span class="k3">=</span> <span class="n">0</span>, max <span class="k3">=</span> <span class="n">0</span>, min2 <span class="k3">=</span> <span class="n">0</span>, max2 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">137</td><td>      ProjectPoly<span class="k2">(</span>axis, <span class="k3">*</span><span class="k1">this</span>, min, max<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">138</td><td>      ProjectPoly<span class="k2">(</span>axis, poly, min2, max2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">139</td><td>&#160;</td></tr><tr><td class="number">140</td><td>      <span class="k1">if</span><span class="k2">(</span>IntervalDist<span class="k2">(</span>min, max, min2, max2<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> result.collided <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">141</td><td>&#160;</td></tr><tr><td class="number">142</td><td>      <span class="c">// check if the polygons will collide</span></td></tr><tr><td class="number">143</td><td>      <span class="k1">float</span> velocityProj <span class="k3">=</span> axis.DotProduct<span class="k2">(</span>velocity<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">144</td><td>&#160;</td></tr><tr><td class="number">145</td><td>      <span class="k1">if</span><span class="k2">(</span>velocityProj <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> min <span class="k3">+</span><span class="k3">=</span> velocityProj<span class="k2">;</span></td></tr><tr><td class="number">146</td><td>      <span class="k1">else</span> max <span class="k3">+</span><span class="k3">=</span> velocityProj<span class="k2">;</span></td></tr><tr><td class="number">147</td><td>&#160;</td></tr><tr><td class="number">148</td><td>      <span class="k1">float</span> intervalDist <span class="k3">=</span> IntervalDist<span class="k2">(</span>min, max, min2, max2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">149</td><td>      <span class="k1">if</span><span class="k2">(</span>intervalDist <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> result.willCollide <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">150</td><td>&#160;</td></tr><tr><td class="number">151</td><td>      <span class="c">// nothing collides</span></td></tr><tr><td class="number">152</td><td>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>result.collided <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>result.willCollide<span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">153</td><td>&#160;</td></tr><tr><td class="number">154</td><td>      intervalDist <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>intervalDist<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">155</td><td>      <span class="k1">if</span><span class="k2">(</span>intervalDist <span class="k3">&lt;</span> minIntervalDist<span class="k2">)</span></td></tr><tr><td class="number">156</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">157</td><td>        minIntervalDist <span class="k3">=</span> intervalDist<span class="k2">;</span></td></tr><tr><td class="number">158</td><td>        translationAxis <span class="k3">=</span> axis<span class="k2">;</span></td></tr><tr><td class="number">159</td><td>        CVec2D vec<span class="k2">(</span>Center<span class="k2">(</span><span class="k2">)</span>.x <span class="k3">-</span> poly.Center<span class="k2">(</span><span class="k2">)</span>.x, Center<span class="k2">(</span><span class="k2">)</span>.y <span class="k3">-</span> poly.Center<span class="k2">(</span><span class="k2">)</span>.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">160</td><td>        <span class="k1">if</span><span class="k2">(</span>vec.DotProduct<span class="k2">(</span>translationAxis<span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">161</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">162</td><td>          translationAxis.x <span class="k3">=</span> <span class="k3">-</span>translationAxis.x<span class="k2">;</span></td></tr><tr><td class="number">163</td><td>          translationAxis.y <span class="k3">=</span> <span class="k3">-</span>translationAxis.y<span class="k2">;</span></td></tr><tr><td class="number">164</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">165</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">166</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">167</td><td>    <span class="k1">if</span><span class="k2">(</span>result.willCollide<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>      <span class="c">// calc the translate vector for the polygon</span></td></tr><tr><td class="number">170</td><td>      CVec2D translateVec<span class="k2">(</span>translationAxis.x <span class="k3">*</span> minIntervalDist, translationAxis.y <span class="k3">*</span> minIntervalDist<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">171</td><td>      result.translateVec <span class="k3">=</span> translateVec<span class="k2">;</span></td></tr><tr><td class="number">172</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">173</td><td>    <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">174</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">175</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

It&#39;s probably just a math error or something I&#39;m not catching, so hopefully someone else will.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GrantG)</author>
		<pubDate>Sun, 01 Apr 2007 23:41:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I haven&#39;t fully read the code, because I&#39;m sort of on the run, but some general comments:<br /><span class="source-code">axis.Normalize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span><br />This is unnecessary. You&#39;d want to normalise if you were using the distances for something else, if you&#39;re just comparing them then it makes no difference.<br /><span class="source-code">check <span class="k1">if</span> the polygons will collide</span><br />It seems that for every frame you&#39;re checking where the polygons are at the start of frame and where they are at the end of the frame? If I&#39;ve understood your code then where they are at the end of one frame is where they are at the start of the next frame, so this is just doubling your work!
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">float</span> IntervalDist<span class="k2">(</span><span class="k1">float</span> min, <span class="k1">float</span> max, <span class="k1">float</span> min2, <span class="k1">float</span> max2<span class="k2">)</span>
  <span class="k2">{</span>
    <span class="k1">if</span><span class="k2">(</span>min <span class="k3">&lt;</span> min2<span class="k2">)</span> <span class="k1">return</span> min2 <span class="k3">-</span> max<span class="k2">;</span>
    <span class="k1">else</span> <span class="k1">return</span> min <span class="k3">-</span> max2<span class="k2">;</span>
</pre></div></div><p>
This is the main bit I don&#39;t get. Either it assumes that both intervals are the same length, or it doesn&#39;t do what I think it does. What should it return, for example, if one interval completely encloses the other?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Wed, 04 Apr 2007 22:58:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Thomas Harte said:</div><div class="quote"><p>
It seems that for every frame you&#39;re checking where the polygons are at the start of frame and where they are at the end of the frame? If I&#39;ve understood your code then where they are at the end of one frame is where they are at the start of the next frame, so this is just doubling your work!
</p></div></div><p>

Yeah you&#39;re right, I got that part right out of a tutorial and didn&#39;t think about that at the time.</p><p>Heh, what a coincidence, I also did not understand</p><p><span class="source-code"><span class="k1">float</span> IntervalDist<span class="k2">(</span><span class="k1">float</span> min, <span class="k1">float</span> max, <span class="k1">float</span> min2, <span class="k1">float</span> max2<span class="k2">)</span></span></p><p>I&#39;ll try looking through the tutorial again and see if the guy explains it anywhere.</p><p>EDIT:<br />I used <a href="http://www.codeproject.com/cs/media/PolygonCollision.asp">this</a> tutorial by the way.</p><p>EDIT:<br />Removing <span class="source-code">axis.Normalize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span> fixed the collision, but now when the two polygons touch the one gets moved about 3000 pixels away instantly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GrantG)</author>
		<pubDate>Thu, 05 Apr 2007 07:15:54 +0000</pubDate>
	</item>
</rss>
