<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>How to draw a smoother/more accurate circle?</title>
		<link>http://www.allegro.cc/forums/view/612218</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 17 Mar 2013 06:19:00 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Using Allegro 5.1 build.</p><p>So I&#39;m making a spaceflight simulator, and to draw a planet I do something like</p><p><span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_filled_circle"><span class="a">al_draw_filled_circle</span></a><span class="k2">(</span>earth.x, earth.y, <span class="n">6371000</span>, earth.color<span class="k2">)</span></span></p><p>obviously, I&#39;m sure the devs have only tested primitive drawing for reasonably sized primitives, but when I draw this large of a circle, I get some fairly noticeable straight lines. Take a gander at <a href="http://min.us/mbwdn0srdwU3ln">some visuals</a> if you want. I&#39;ve enabled multisampling code in those pictures, but that doesn&#39;t cut it.</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span>ALLEGRO_SAMPLE_BUFFERS, <span class="n">1</span>, ALLEGRO_SUGGEST<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span>ALLEGRO_SAMPLES, <span class="n">8</span>, ALLEGRO_SUGGEST<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

<span class="source-code">uu: DRAWING CIRCLES SuRE IS HARD tumut</span></p><p>Is there some way I can make the circle draw with more lines (I guess you call them splines) with existing Allegro functionality? Or is this something that I should hack a new function or something for?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (patrickpowns)</author>
		<pubDate>Fri, 15 Mar 2013 06:52:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>There are two compile time constants which govern the quality of these things. These are ALLEGRO_VERTEX_CACHE_SIZE and ALLEGRO_PRIM_QUALITY. You could modify them and rebuild Allegro... perhaps a runtime quantity would be more pleasant?</p><p>Alternatively, you can just go into Allegro&#39;s source, yank out the circle drawing code and up the number of segments drawn. Here it is:</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="p">#define LOCAL_VERTEX_CACHE  ALLEGRO_VERTEX vertex_cache[ALLEGRO_VERTEX_CACHE_SIZE]</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="c">/* Function: al_draw_filled_ellipse</span>
<span class="number">  4</span><span class="c"> */</span>
<span class="number">  5</span><span class="k1">void</span> <a href="http://www.allegro.cc/manual/al_draw_filled_ellipse"><span class="a">al_draw_filled_ellipse</span></a><span class="k2">(</span><span class="k1">float</span> cx, <span class="k1">float</span> cy, <span class="k1">float</span> rx, <span class="k1">float</span> ry,
<span class="number">  6</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color<span class="k2">)</span>
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>   LOCAL_VERTEX_CACHE<span class="k2">;</span>
<span class="number">  9</span>   <span class="k1">int</span> num_segments, ii<span class="k2">;</span>
<span class="number"> 10</span>   <span class="k1">float</span> scale <span class="k3">=</span> get_scale<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>   <a href="http://www.allegro.cc/manual/ASSERT"><span class="a">ASSERT</span></a><span class="k2">(</span>rx <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>   <a href="http://www.allegro.cc/manual/ASSERT"><span class="a">ASSERT</span></a><span class="k2">(</span>ry <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>   
<span class="number"> 15</span>   num_segments <span class="k3">=</span> <a href="http://www.allegro.cc/manual/ALLEGRO_PRIM_QUALITY"><span class="a">ALLEGRO_PRIM_QUALITY</span></a> <span class="k3">*</span> scale <span class="k3">*</span> sqrtf<span class="k2">(</span><span class="k2">(</span>rx <span class="k3">+</span> ry<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>   <span class="c">/* In case rx and ry are both close to 0. If al_calculate_arc is passed</span>
<span class="number"> 18</span><span class="c">    * 0 or 1 it will assert.</span>
<span class="number"> 19</span><span class="c">    */</span>
<span class="number"> 20</span>   <span class="k1">if</span> <span class="k2">(</span>num_segments <span class="k3">&lt;</span> <span class="n">2</span><span class="k2">)</span>
<span class="number"> 21</span>      <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 22</span>   
<span class="number"> 23</span>   <span class="k1">if</span> <span class="k2">(</span>num_segments <span class="k3">&gt;</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/ALLEGRO_VERTEX_CACHE_SIZE"><span class="a">ALLEGRO_VERTEX_CACHE_SIZE</span></a><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 24</span>      num_segments <span class="k3">=</span> <a href="http://www.allegro.cc/manual/ALLEGRO_VERTEX_CACHE_SIZE"><span class="a">ALLEGRO_VERTEX_CACHE_SIZE</span></a> <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 25</span>   <span class="k2">}</span>
<span class="number"> 26</span>      
<span class="number"> 27</span>   <a href="http://www.allegro.cc/manual/al_calculate_arc"><span class="a">al_calculate_arc</span></a><span class="k2">(</span><span class="k3">&amp;</span><span class="k2">(</span>vertex_cache<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>.x<span class="k2">)</span>, <span class="k1">sizeof</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_VERTEX"><span class="a">ALLEGRO_VERTEX</span></a><span class="k2">)</span>, cx, cy, rx, ry, <span class="n">0</span>, <a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a> <span class="k3">*</span> <span class="n">2</span>, <span class="n">0</span>, num_segments<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>   vertex_cache<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.x <span class="k3">=</span> cx<span class="k2">;</span> vertex_cache<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>.y <span class="k3">=</span> cy<span class="k2">;</span>
<span class="number"> 29</span>   
<span class="number"> 30</span>   <span class="k1">for</span> <span class="k2">(</span>ii <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> ii <span class="k3">&lt;</span> num_segments <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span> ii<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 31</span>      vertex_cache<span class="k2">[</span>ii<span class="k2">]</span>.color <span class="k3">=</span> color<span class="k2">;</span>
<span class="number"> 32</span>      vertex_cache<span class="k2">[</span>ii<span class="k2">]</span>.z <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 33</span>   <span class="k2">}</span>
<span class="number"> 34</span>   
<span class="number"> 35</span>   <a href="http://www.allegro.cc/manual/al_draw_prim"><span class="a">al_draw_prim</span></a><span class="k2">(</span>vertex_cache, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, num_segments <span class="k3">+</span> <span class="n">1</span>, ALLEGRO_PRIM_TRIANGLE_FAN<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Fri, 15 Mar 2013 07:05:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>By &#39;compile time constants&#39; do you mean something that I can go into /usr/local/include/allegro5/allegro_primitives.h and change the #define, and then recompile my program, or is it a recompile-A5-again kind of compile time? Because I changed ALLEGRO_PRIM_QUALITY in that directory, as well as redefined it in my main.cpp, and it gave the same num_segments.</p><p>This is my first time doing any of this, as I&#39;m sure you can tell already.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (patrickpowns)</author>
		<pubDate>Fri, 15 Mar 2013 07:41:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612218/978508#target">patrickpowns</a> said:</div><div class="quote"><p> is it a recompile-A5-again kind of compile time?
</p></div></div><p>This one.</p><p>Note that if you copy the function into your own code you just need to recompile your code (and use this function instead of Allegro&#39;s).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Fri, 15 Mar 2013 08:01:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Alright, so after having tried messing around with those values, then sleeping, then messing around some more, I&#39;ve come to a conclusion:</p><p>Drawing the Earth at a close zoom requires 7055 segments. Obviously, this gets limited by some code in <span class="source-code">draw_filled_ellipse</span> to <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_VERTEX_CACHE_SIZE"><span class="a">ALLEGRO_VERTEX_CACHE_SIZE</span></a> <span class="k3">-</span> <span class="n">1</span></span>. Upping <span class="source-code">PRIM_QUALITY</span> won&#39;t do anything.</p><p>Upping <span class="source-code">VERTEX_CACHE_SIZE</span> allows more segments, but also <a href="http://min.us/lRtOP3SJ9SOqD">makes a &#39;cliff&#39;</a>. This cliff alternates between being too low and too high the more I zoom out (which draws less segments), and there&#39;s also a seam there at some zoom levels. As far as I can tell, this only happens at that specific location on the circle (0 / 2pi radians).</p><p>Lowering <span class="source-code">CACHE_SIZE</span> below 256 just makes it look blockier, obviously.</p><p>As far as I can tell, an <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_VERTEX_CACHE_SIZE"><span class="a">ALLEGRO_VERTEX_CACHE_SIZE</span></a></span> of 256 is the optimal value. Is there any way to get more segments, while not having a cliff/seam at that specific point?</p><p>Also, I don&#39;t think having a runtime quantity would really be necessary, because it&#39;s only going to be changed by one or two people every so often, and time would better be spent on fixing up shaders and pipelines or whatever black magic you&#39;re working on right now. Allegro only takes ~10 seconds to build on my quad-core, not that big of a deal.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (patrickpowns)</author>
		<pubDate>Fri, 15 Mar 2013 22:05:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Pehaps you could cheat and draw a rectangle if the planet is close enough to be completely in the screen. From close up, a flat earth is not a bad approximation...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sat, 16 Mar 2013 01:18:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612218/978533#target">beoran</a> said:</div><div class="quote"><p> Pehaps you could cheat and draw a rectangle if the planet is close enough to be completely in the screen. From close up, a flat earth is not a bad approximation...</p></div></div><p>Along the same lines you could draw filled pie-slices instead of full circles. You&#39;ll end up using more segments more efficiently.</p><p>Also, since you&#39;re using 5.1 perhaps you could just use a shader to draw your circles. It&#39;s a very simple shader (here&#39;s the GLSL code, untested. HLSL code is obviously very similar) (note that you&#39;ll want to use the git version of 5.1 as there have been A LOT of shader related changes recently):</p><p>Vertex shader:
</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="p">#version 120</span>
<span class="number">  2</span>attribute vec4 al_pos<span class="k2">;</span>
<span class="number">  3</span>attribute vec4 al_color<span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>uniform mat4 al_projview_matrix<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>varying vec2 pixel_pos<span class="k2">;</span>
<span class="number">  8</span>varying vec4 pixel_color<span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 11</span><span class="k2">{</span>
<span class="number"> 12</span>  pixel_pos <span class="k3">=</span> al_pos.xy<span class="k2">;</span>
<span class="number"> 13</span>  pixel_color <span class="k3">=</span> al_color<span class="k2">;</span>
<span class="number"> 14</span>  gl_Position <span class="k3">=</span> al_projview_matrix <span class="k3">*</span> al_pos<span class="k2">;</span>
<span class="number"> 15</span><span class="k2">}</span>
</div></div><p>

Pixel shader:
</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="p">#version 120</span>
<span class="number">  2</span><span class="p">#ifdef GL_ES</span>
<span class="number">  3</span>precision mediump <span class="k1">float</span><span class="k2">;</span>
<span class="number">  4</span><span class="p">#endif</span>
<span class="number">  5</span>
<span class="number">  6</span>varying vec2 pixel_pos<span class="k2">;</span>
<span class="number">  7</span>varying vec4 pixel_color<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>uniform vec2 center<span class="k2">;</span>
<span class="number"> 10</span>uniform <span class="k1">float</span> radius<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 13</span><span class="k2">{</span>
<span class="number"> 14</span>  vec2 diff <span class="k3">=</span> pixel_pos <span class="k3">-</span> center<span class="k2">;</span>
<span class="number"> 15</span>  <span class="k1">if</span><span class="k2">(</span>dot<span class="k2">(</span>diff<span class="k2">)</span> <span class="k3">&lt;</span> radius <span class="k3">*</span> radius<span class="k2">)</span>
<span class="number"> 16</span>    gl_FragColor <span class="k3">=</span> pixel_color<span class="k2">;</span>
<span class="number"> 17</span>  <span class="k1">else</span>
<span class="number"> 18</span>    gl_FragColor <span class="k3">=</span> vec4<span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span><span class="k2">}</span>
</div></div><p>

You&#39;ll probably still run into issues of enormous circles overflowing float though, in which case just drawing a rectangle might be good enough <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Sat, 16 Mar 2013 04:30:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So after taking a look at things like ex_prim_shader, I realised that shaders are actually pretty cool, so I&#39;ve started to learn what shaders are. Hopefully this will elucidate what is going on in the mailing list when everyone is talking about shaders and stuff, which would be worth it by itself. Although I guess if it comes to it, I could just make an arc, spline, ribbon, or I don&#39;t know what. Something along those <s>segments</s> lines.</p><p>But there&#39;s no way I&#39;m going to be able to implement shaders by tonight (21:20 here) so I&#39;m just going to mark this as solved, and then continue my adventure into the exciting world of shaders. If I don&#39;t come back, just assume my brain has melted.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (patrickpowns)</author>
		<pubDate>Sun, 17 Mar 2013 06:19:00 +0000</pubDate>
	</item>
</rss>
