<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Angle Between Two Vectors?</title>
		<link>http://www.allegro.cc/forums/view/591460</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 20 May 2007 02:27:16 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How do I get the angle between two vectors with the same origin?<br />The two ways I know (using &#39;acos&#39; and &#39;atan2&#39;) return some confusing results.<br />How do I convert those results to the range of 0 - 2 pi (or 0 - 360 degrees, or whatever)?</p><p>Thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mr. Big)</author>
		<pubDate>Sat, 19 May 2007 22:05:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Are you working out the individual angles of the lines from their origin, then trying to do some arithmetic on those values? If so then that would explain your issues. An easier solution is the dot product.</p><p>For two vectors, A and B:</p><p>A . B = |A||B|cos(angle between A and B)</p><p>|A| is the length of A, so you can find that with Pythagoras.</p><p>So, if you have A = (ax, ay) and B = (bx, by) then:</p><p>angle between = acos( ((ax * bx) + (ay * by)) / (sqrt(ax*ax + ay*ay) * sqrt(bx*bx + by*by))</p><p>If you use the acos from math.h then the result will be in the range -pi/2 to pi/2. Be careful though — it&#39;ll always give you the smallest angle between the vectors, so if two vectors start with the same orientation and then one stays still and the other rotates then the angle between them will go up from 0 to pi/2, then down again from pi/2 to -pi/2, then up from -pi/2 to 0.</p><p>If you want a full -pi to pi then you need to do a further check to decide if the two vectors are both pointing &quot;the same way&quot;. Imagine one vector is lying exactly on the x-axis pointing right. Then you want to decide whether the other is pointing right or left.</p><p>You can do that using the dot product too — check whether ((ax * bx) + (ay * by)) is negative or positive and add or subtract pi from your result depending on its sign and which angle you want to measure.</p><p>E.g. (untested, written adhoc)
</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">float</span> get_angle_between_in_radians<span class="k2">(</span><span class="k1">float</span> ax, <span class="k1">float</span> ay, <span class="k1">float</span> bx, <span class="k1">float</span> by<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">float</span> dotproduct, lengtha, lengthb, result<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>   dotproduct <span class="k3">=</span> <span class="k2">(</span>ax <span class="k3">*</span> bx<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>ay <span class="k3">*</span> by<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>   lengtha <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>ax <span class="k3">*</span> ax <span class="k3">+</span> ay <span class="k3">*</span> ay<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>   lengthb <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>bx <span class="k3">*</span> bx <span class="k3">+</span> by <span class="k3">*</span> by<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>   result <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_40.html" target="_blank">acos</a><span class="k2">(</span> dotproduct <span class="k3">/</span> <span class="k2">(</span>lengtha <span class="k3">*</span> lengthb<span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>   <span class="k1">if</span><span class="k2">(</span>dotproduct <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">12</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>      <span class="k1">if</span><span class="k2">(</span>result <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">14</td><td>         result <span class="k3">+</span><span class="k3">=</span> M_PI<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      <span class="k1">else</span></td></tr><tr><td class="number">16</td><td>         result <span class="k3">-</span><span class="k3">=</span> M_PI<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">18</td><td>   <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">19</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
There&#39;s lots on the web about the dot product, and it&#39;s something that&#39;s very easy to understand the properties of, even if it takes you a while to really see why it all works...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Sat, 19 May 2007 22:35:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh! Should have thought about it myself!<br />I&#39;m stupid.<br />Thanks, Thomas. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></p><p>[EDIT]</p><p>Your code doesn&#39;t actually work because &#39;atan&#39; returns values in range of 0 - pi, but thanks for the idea with the dot product and angle signs.</p><p>This works like it should:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">float</span> angle_between_vectors<span class="k2">(</span>VECTOR o, VECTOR a, VECTOR b<span class="k2">)</span>
<span class="k2">{</span>
 VECTOR t1 <span class="k3">=</span> VECTOR_DIFF<span class="k2">(</span>a, o<span class="k2">)</span>, t2 <span class="k3">=</span> VECTOR_DIFF<span class="k2">(</span>b, o<span class="k2">)</span><span class="k2">;</span>
 <span class="k1">float</span> result<span class="k2">;</span>

 result <span class="k3">=</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_50.html" target="_blank">atan2</a><span class="k2">(</span>t1.y, t1.x<span class="k2">)</span> <span class="k3">-</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_50.html" target="_blank">atan2</a><span class="k2">(</span>t2.y, t2.x<span class="k2">)</span><span class="k2">)</span> <span class="k3">*</span> <span class="n">180</span>.<span class="n">0</span> <span class="k3">*</span> M_1_PI<span class="k2">;</span>

 <span class="k1">if</span><span class="k2">(</span>result <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
  result <span class="k3">+</span><span class="k3">=</span> <span class="n">360</span>.<span class="n">0</span><span class="k2">;</span>

 <span class="k1">return</span> result<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mr. Big)</author>
		<pubDate>Sat, 19 May 2007 22:54:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi,</p><p>I&#39;m not that mathematical, but I have a full code list for finding the angle between 2 points, don&#39;t know if this is the same as vectors <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /> but I&#39;ll post it here just in case it is for you to use if you want it <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></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="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;math.h&gt;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="p">#define PI 3.1415926535</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="p">#define WHITE makecol(255,255,255)</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="c">//define function prototype</span></td></tr><tr><td class="number">9</td><td><span class="k1">double</span> get_angle<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="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> </td></tr><tr><td class="number">12</td><td><span class="k2">{</span> </td></tr><tr><td class="number">13</td><td> <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><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> <a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_SAFE, <span class="n">640</span>, <span class="n">480</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">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td> <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</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> <span class="c">//variables for calculating angle</span></td></tr><tr><td class="number">20</td><td> <span class="k1">double</span> ang1<span class="k2">;</span></td></tr><tr><td class="number">21</td><td> <span class="k1">double</span> ang2<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="c">//first x,y co-ords</span></td></tr><tr><td class="number">24</td><td> <span class="k1">int</span> x1<span class="k3">=</span><span class="n">150</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td> <span class="k1">int</span> y1<span class="k3">=</span><span class="n">150</span><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="c">//second x,y co-ords</span></td></tr><tr><td class="number">28</td><td> <span class="k1">int</span> x2<span class="k3">=</span><span class="n">100</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td> <span class="k1">int</span> y2<span class="k3">=</span><span class="n">100</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td> </td></tr><tr><td class="number">31</td><td> ang1<span class="k3">=</span>get_angle<span class="k2">(</span>x1,y1,x2,y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td> </td></tr><tr><td class="number">33</td><td> <span class="c">//Add or subtract 180 degrees to ang1 to get the angle for ang2</span></td></tr><tr><td class="number">34</td><td> <span class="k1">if</span><span class="k2">(</span>ang1<span class="k3">&lt;</span><span class="k3">=</span><span class="n">180</span><span class="k2">)</span> ang2<span class="k3">=</span>ang1<span class="k3">+</span><span class="n">180</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td> <span class="k1">else</span> ang2<span class="k3">=</span>ang1-180<span class="k2">;</span></td></tr><tr><td class="number">36</td><td> </td></tr><tr><td class="number">37</td><td> textprintf<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="n">10</span>,<span class="n">10</span>,WHITE,<span class="s">"Point 1 = %d , %d (x: horizontal [+ = right], y: vertical [+ = up])"</span>,x1,y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td> textprintf<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="n">10</span>,<span class="n">25</span>,WHITE,<span class="s">"Point 2 = %d , %d"</span>,x2,y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td> </td></tr><tr><td class="number">40</td><td> <span class="k1">if</span><span class="k2">(</span>ang1<span class="k3">=</span><span class="k3">=</span><span class="k3">-</span><span class="n">1</span><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> textprintf<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="n">10</span>,<span class="n">40</span>,WHITE,<span class="s">"%s"</span>,<span class="s">"The Points are the same!"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td> <span class="k2">}</span></td></tr><tr><td class="number">44</td><td> <span class="k1">else</span></td></tr><tr><td class="number">45</td><td> <span class="k2">{</span></td></tr><tr><td class="number">46</td><td> textprintf<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="n">10</span>,<span class="n">40</span>,WHITE,<span class="s">"The Angle from Point 2 to Point 1 is %f degrees"</span>,ang1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td> textprintf<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="n">10</span>,<span class="n">55</span>,WHITE,<span class="s">"The Angle from Point 1 to Point 2 is %f degrees"</span>,ang2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td> <span class="k2">}</span></td></tr><tr><td class="number">49</td><td> </td></tr><tr><td class="number">50</td><td> <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td> <a href="http://www.allegro.cc/manual/allegro_exit" target="_blank"><span class="a">allegro_exit</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>     </td></tr><tr><td class="number">53</td><td><span class="k2">}</span>     </td></tr><tr><td class="number">54</td><td>&#160;</td></tr><tr><td class="number">55</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>&#160;</td></tr><tr><td class="number">57</td><td>&#160;</td></tr><tr><td class="number">58</td><td><span class="k1">double</span> get_angle<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="k2">)</span></td></tr><tr><td class="number">59</td><td><span class="k2">{</span></td></tr><tr><td class="number">60</td><td> <span class="k1">double</span> opp<span class="k2">;</span></td></tr><tr><td class="number">61</td><td> <span class="k1">double</span> adj<span class="k2">;</span></td></tr><tr><td class="number">62</td><td> <span class="k1">double</span> ang1<span class="k2">;</span></td></tr><tr><td class="number">63</td><td> </td></tr><tr><td class="number">64</td><td> <span class="c">//calculate vector differences</span></td></tr><tr><td class="number">65</td><td> opp<span class="k3">=</span>y1-y2<span class="k2">;</span></td></tr><tr><td class="number">66</td><td> adj<span class="k3">=</span>x1-x2<span class="k2">;</span></td></tr><tr><td class="number">67</td><td>&#160;</td></tr><tr><td class="number">68</td><td> <span class="k1">if</span><span class="k2">(</span>x1<span class="k3">=</span><span class="k3">=</span>x2 <span class="k3">&amp;</span><span class="k3">&amp;</span> y1<span class="k3">=</span><span class="k3">=</span>y2<span class="k2">)</span> <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>&#160;</td></tr><tr><td class="number">70</td><td> <span class="c">//trig function to calculate angle</span></td></tr><tr><td class="number">71</td><td> <span class="k1">if</span><span class="k2">(</span>adj<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="c">// to catch vertical co-ord to prevent division by 0</span></td></tr><tr><td class="number">72</td><td> <span class="k2">{</span></td></tr><tr><td class="number">73</td><td>  <span class="k1">if</span><span class="k2">(</span>opp&gt;<span class="k3">=</span><span class="n">0</span><span class="k2">)</span> </td></tr><tr><td class="number">74</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>   <span class="k1">return</span><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><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>  <span class="k1">else</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">return</span><span class="k2">(</span><span class="n">180</span><span class="k2">)</span><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="k2">}</span></td></tr><tr><td class="number">82</td><td> <span class="k1">else</span> </td></tr><tr><td class="number">83</td><td> <span class="k2">{</span></td></tr><tr><td class="number">84</td><td>  ang1<span class="k3">=</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_49.html" target="_blank">atan</a><span class="k2">(</span>opp<span class="k3">/</span>adj<span class="k2">)</span><span class="k2">)</span><span class="k3">*</span><span class="n">180</span><span class="k3">/</span>PI<span class="k2">;</span></td></tr><tr><td class="number">85</td><td> <span class="c">//the angle calculated will range from +90 degrees to -90 degrees</span></td></tr><tr><td class="number">86</td><td> <span class="c">//so the angle needs to be adjusted if point x1 is less or greater then x2</span></td></tr><tr><td class="number">87</td><td>  <span class="k1">if</span><span class="k2">(</span>x1&gt;<span class="k3">=</span>x2<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>   ang1<span class="k3">=</span><span class="n">90</span><span class="k3">-</span>ang1<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>  <span class="k1">else</span></td></tr><tr><td class="number">92</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">93</td><td>   ang1<span class="k3">=</span><span class="n">270</span><span class="k3">-</span>ang1<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> <span class="k2">}</span> </td></tr><tr><td class="number">96</td><td> <span class="k1">return</span><span class="k2">(</span>ang1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">97</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Rowan)</author>
		<pubDate>Sun, 20 May 2007 02:27:16 +0000</pubDate>
	</item>
</rss>
