<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Rotating polygon coordinates (linear algebra)</title>
		<link>http://www.allegro.cc/forums/view/590168</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 21 Feb 2007 00:38:13 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello Allegators!</p><p>I&#39;m in the midst of porting <a href="http://uk.geocities.com/olivier_rebellion/">Olivier Renaults 2D polygon collision thingy</a> to use Allegro instead of OpenGL so that I can use it in my game engine.</p><p>I&#39;ve got mostly everything working but since my linear algebra is shoddy at best I&#39;ve naturally run into some problems and am currently stuck at some rotation issues. Actually, the logic part runs as it should, it is the drawing that I&#39;m stumped at. </p><p>Since the original code uses OpenGL it simply applies some rotation matrix before drawing each object making it quick, elegant and easy. This is something that I&#39;m pretty sure isn&#39;t as easily done in Allegro so I rush to the source of all knowledge.</p><p>Here&#39;s the original polygon drawing code (some non relevant stuff removed):
</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> PolyColl::Render<span class="k2">(</span><span class="k1">const</span> Vector<span class="k3">&amp;</span> xOffset, <span class="k1">float</span> angle, u_int ARGBfill, u_int ARGBline, <span class="k1">const</span> Vector<span class="k3">*</span> axVertices, <span class="k1">int</span> iNumVertices<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>axVertices<span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  glMatrixMode<span class="k2">(</span>GL_TEXTURE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>  glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">float</span> scale <span class="k3">=</span> <span class="n">0</span>.<span class="n">06f</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  glScalef<span class="k2">(</span>scale, scale, scale<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>  glEnable<span class="k2">(</span>GL_TEXTURE_2D<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  glBindTexture<span class="k2">(</span>GL_TEXTURE_2D, BindTexture<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>  glMatrixMode<span class="k2">(</span>GL_MODELVIEW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  glPushMatrix<span class="k2">(</span><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>  glTranslatef<span class="k2">(</span>xOffset.x, xOffset.y, <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>  glRotatef<span class="k2">(</span>RadiansToDegrees<span class="k2">(</span>angle<span class="k2">)</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>  glColor4ub<span class="k2">(</span>ARGB_R<span class="k2">(</span>ARGBfill<span class="k2">)</span>, ARGB_G<span class="k2">(</span>ARGBfill<span class="k2">)</span>, ARGB_B<span class="k2">(</span>ARGBfill<span class="k2">)</span>, ARGB_A<span class="k2">(</span>ARGBfill<span class="k2">)</span><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>  glBegin<span class="k2">(</span>GL_TRIANGLE_FAN<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</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> iNumVertices<span class="k2">;</span> i <span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">24</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>    glTexCoord2f<span class="k2">(</span>axVertices<span class="k3">&lt;</span>i&gt;.x, axVertices<span class="k3">&lt;</span>i&gt;.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    glVertex2f<span class="k2">(</span>axVertices<span class="k3">&lt;</span>i&gt;.x, axVertices<span class="k3">&lt;</span>i&gt;.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">28</td><td>  glTexCoord2f<span class="k2">(</span>axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.x, axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>  glVertex2f<span class="k2">(</span>axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.x, axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>  glEnd<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  glDisable<span class="k2">(</span>GL_TEXTURE_2D<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>  <span class="k1">if</span> <span class="k2">(</span>ARGBline <span class="k3">!</span><span class="k3">=</span> <span class="n">0</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>    glColor4ub<span class="k2">(</span>ARGB_R<span class="k2">(</span>ARGBline<span class="k2">)</span>, ARGB_G<span class="k2">(</span>ARGBline<span class="k2">)</span>, ARGB_B<span class="k2">(</span>ARGBline<span class="k2">)</span>, ARGB_A<span class="k2">(</span>ARGBline<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>    glBegin<span class="k2">(</span>GL_LINE_LOOP<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>&#160;</td></tr><tr><td class="number">39</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> iNumVertices<span class="k2">;</span> i <span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">40</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">41</td><td>      glVertex2f<span class="k2">(</span>axVertices<span class="k3">&lt;</span>i&gt;.x, axVertices<span class="k3">&lt;</span>i&gt;.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>    glVertex2f<span class="k2">(</span>axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.x, axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>    glEnd<span class="k2">(</span><span class="k2">)</span><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>  glPopMatrix<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

I can easily draw the polygon at the right place using the following code:
</p><div class="source-code snippet"><div class="inner"><pre>  <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> iNumVertices <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span> i <span class="k3">+</span><span class="k3">+</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>p_buffer, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.x <span class="k3">+</span> axVertices<span class="k3">&lt;</span>i&gt;.x<span class="k2">)</span>, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.y <span class="k3">+</span> axVertices<span class="k3">&lt;</span>i&gt;.y<span class="k2">)</span>,
      <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.x <span class="k3">+</span> axVertices<span class="k2">[</span>i<span class="k3">+</span><span class="n">1</span><span class="k2">]</span>.x<span class="k2">)</span>, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.y <span class="k3">+</span> axVertices<span class="k2">[</span>i<span class="k3">+</span><span class="n">1</span><span class="k2">]</span>.y<span class="k2">)</span>, ARGBline<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>p_buffer, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.x <span class="k3">+</span> axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.x<span class="k2">)</span>, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.y <span class="k3">+</span> axVertices<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.y<span class="k2">)</span>,
    <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.x <span class="k3">+</span> axVertices<span class="k2">[</span>iNumVertices <span class="k3">-</span> <span class="n">1</span><span class="k2">]</span>.x<span class="k2">)</span>, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>xOffset.y <span class="k3">+</span> axVertices<span class="k2">[</span>iNumVertices <span class="k3">-</span> <span class="n">1</span><span class="k2">]</span>.y<span class="k2">)</span>,ARGBline<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
but then it will not be rotated.</p><p>So what I have is a set of coordinates and an offset and I would like to know how to rotate them. I guess I could calculate the distance from origo to all coordninates and then rotate that with some angle and calculate the x and y angain for wacy node, but that seems tedious. Is there some quick and dirty matrix or vector operation I can use?</p><p>Thank you in advance,<br />  Johan, the linear noob
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Johan Peitz)</author>
		<pubDate>Wed, 21 Feb 2007 00:01:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>IIRC you can use a standard 3D rotation matrix and ignore the Y or Z component depending on your setup.</p><p><a href="http://www.euclideanspace.com/maths/algebra/matrix/orthogonal/rotation/index.htm">There&#39;s a handy 2D matrix as well</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Sirocco)</author>
		<pubDate>Wed, 21 Feb 2007 00:08:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s what X-G said too and I kinda got too it myself while I was writing the post. <img src="http://www.allegro.cc/forums/smileys/embarassed.gif" alt=":-[" /> I&#39;ll be back with the results...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Johan Peitz)</author>
		<pubDate>Wed, 21 Feb 2007 00:12:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>COOKIE!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Wed, 21 Feb 2007 00:37:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Very nice. 2D physics for the win. (It works now.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Johan Peitz)</author>
		<pubDate>Wed, 21 Feb 2007 00:38:13 +0000</pubDate>
	</item>
</rss>
