<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Coordinate systems</title>
		<link>http://www.allegro.cc/forums/view/616229</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 01 May 2016 10:48:14 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m a bit confused after trying to figure out how Allegro 5 sets up the coordinate system of a display.</p><p>I&#39;m using this init sequence:</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>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 2</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 3</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 4</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_init_image_addon"><span class="a">al_init_image_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 5</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 6</span>    <span class="k1">auto</span> display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 7</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

The following sequence displays points in the exact corners of my display:</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>    <a href="http://www.allegro.cc/manual/al_draw_pixel"><span class="a">al_draw_pixel</span></a><span class="k2">(</span><span class="n">1</span>, <span class="n">1</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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>
<span class="number"> 2</span>    <a href="http://www.allegro.cc/manual/al_draw_pixel"><span class="a">al_draw_pixel</span></a><span class="k2">(</span><span class="n">1</span>, <span class="n">600</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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>
<span class="number"> 3</span>    <a href="http://www.allegro.cc/manual/al_draw_pixel"><span class="a">al_draw_pixel</span></a><span class="k2">(</span><span class="n">800</span>, <span class="n">1</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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>
<span class="number"> 4</span>    <a href="http://www.allegro.cc/manual/al_draw_pixel"><span class="a">al_draw_pixel</span></a><span class="k2">(</span><span class="n">800</span>, <span class="n">600</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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>
</div></div><p>

So the coordinate system is not zero based, but the upper left corner is (1, 1) - which was surprising for me.</p><p>Then I&#39;m using bitmaps and primitives to draw stuff.</p><p>I noticed that only the following line will draw a bitmap exactly at the origin of my display:</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>    <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bitmap, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>

So while for al_draw_pixel the origin is (1, 1), al_draw_bitmap thinks it is (0, 0). Is there any simple explanation for this? I couldn&#39;t find anything in the reference documentation and neither helped searching for &quot;Allegro coordinate system&quot; and such.</p><p>Even trickier is the following. I&#39;m creating a 32x32 bitmap, clearing it and then I draw lines in it:</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="k1">int</span> w <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  2</span>    <span class="k1">int</span> h <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>    <span class="k1">auto</span> b <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>w, h<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>b<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>    <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>b<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>    <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">192</span>, <span class="n">203</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>    <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">1</span>, w, <span class="n">1</span>, <a href="http://www.allegro.cc/manual/al_map_rgba"><span class="a">al_map_rgba</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// top</span>
<span class="number"> 10</span>    <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">1</span>, <span class="n">0</span>, <span class="n">1</span>, h, <a href="http://www.allegro.cc/manual/al_map_rgba"><span class="a">al_map_rgba</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// left</span>
<span class="number"> 11</span>    <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">0</span>, h, w, h, <a href="http://www.allegro.cc/manual/al_map_rgba"><span class="a">al_map_rgba</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// bottom</span>
<span class="number"> 12</span>    <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>w, <span class="n">0</span>, w, h, <a href="http://www.allegro.cc/manual/al_map_rgba"><span class="a">al_map_rgba</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// right</span>
</div></div><p>

Only these exact coordinates will draw lines from top left -&gt; top right -&gt; bottom right -&gt; bottom left -&gt; top left of the bitmap. I tried to change the zeros to ones and w and h to w-1 and h-1, but those coordinates will leave 1-pixel-gaps (I checked with gimp...). Replacing the ones with zeros is not necessary though to get the full width / height (but will make the line invisible in other cases...).</p><p>To sum this up: For the top line, x=0 is the leftmost. But for the left line, it is x=1. The left line has to start at y=0, while the top line is only visible for y=1.</p><p>Changing the line thickness to 1 has no effect on this.</p><p>Can someone explain those contradicting coordinate systems to me? Is it maybe that primitives are different from the bitmap graphics core? Or even floating point to integer (display) translation issues?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (neoc666)</author>
		<pubDate>Thu, 28 Apr 2016 14:14:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>See the documentation on Allegro&#39;s <a href="http://liballeg.org/a5docs/trunk/primitives.html#pixel-precise-output">Pixel Precise Output</a>.</p><p>Try drawing to 0.5,0.5. That should ensure you get a pixel drawn at 0,0.</p><p>Same goes with lines. Draw to x + 0.5 , y + 0.5.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 28 Apr 2016 14:37:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thank you for your quick response, I should have read the primitives page more carefully <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>Yet I&#39;m not entirely sure about it. Most important: The pixel coordinate system in Allegro 5 is meant to have the top-left pixel in (0, 0) and not in (1, 1), right?</p><p>I figured out that this will give me the desired result:</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>    <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">1</span>, <span class="n">0</span>.<span class="n">1</span>, <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span>w-1<span class="k2">)</span> <span class="k3">+</span> <span class="n">0</span>.<span class="n">5997f</span>, <span class="n">0</span>.<span class="n">1</span>, <a href="http://www.allegro.cc/manual/al_map_rgba"><span class="a">al_map_rgba</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// top</span>
</div></div><p>

In a pure integer coordinate system with (0, 0) as the top left, a horizontal line with width w would go from (0, 0) to (w-1, 0). Considering how the GPU interpolates floats to actual screen pixels, I guess a value of 0 (which is between the coordinates -0.5 and +0.5) can be either pixel -1 or pixel 0. So if I choose 0.1 instead of 0, the GPU will interpolate to pixel 0, because 0.1 is clearly positive. Is this correct?</p><p>Adding 0.5f to (w-1) wasn&#39;t enough to cover the last pixel, I tested out that I need something about 0.5597f; any idea why?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (neoc666)</author>
		<pubDate>Thu, 28 Apr 2016 16:07:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In allegro the top left pixel is at 0,0 and the bottom right pixel is at width-1,height-1. However, the center of the top left pixel is at 0.5,0.5 and the center of the bottom right pixel is at width-0.5,height-0.5.</p><p>This code actually fails to properly outline the display. I&#39;ll tell you why below. It&#39;s actually in the page I linked to as well.
</p><div class="source-code snippet"><div class="inner"><pre>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> display <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span>Allegro5GraphicsContext<span class="k3">*</span><span class="k2">)</span>win<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>AllegroDisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">float</span> lx <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">;</span>
   <span class="k1">float</span> rx <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>display<span class="k2">)</span> <span class="k3">-</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">;</span>
   <span class="k1">float</span> ty <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">;</span>
   <span class="k1">float</span> by <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>display<span class="k2">)</span> <span class="k3">-</span> <span class="n">0</span>.<span class="n">5</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> c <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">float</span> t <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">;</span>
   
   <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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>
   <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>lx,ty,rx,ty,c,t<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>lx,by,rx,by,c,t<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>lx,ty,lx,by,c,t<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>rx,ty,rx,by,c,t<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

<span class="remote-thumbnail"><span class="json">{"name":"610315","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/c\/7cf67f3ab41dfdd7b68e59024b51cc32.png","w":800,"h":600,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/c\/7cf67f3ab41dfdd7b68e59024b51cc32"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/7/c/7cf67f3ab41dfdd7b68e59024b51cc32-240.jpg" alt="610315" width="240" height="180" /></span></p><p>So you can see that the bottom right pixel is not lit. What you actually want to do when drawing axis aligned lines is to draw at the middle of the line along its width, and extend to the full width you desire along its length.</p><p>So you can see the two lines on the bottom and the right both failed to draw the bottom right pixel. When drawing the horizontal line it should have been :
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">0</span> , <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>display<span class="k2">)</span> <span class="k3">-</span> <span class="n">0</span>.<span class="n">5</span> , <a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>display<span class="k2">)</span> , <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>display<span class="k2">)</span> <span class="k3">-</span> <span class="n">0</span>.<span class="n">5</span> , <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span> , <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
And the vertical line should have been :
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k3">-</span><span class="n">0</span>.<span class="n">5</span> , <span class="n">0</span>.<span class="n">0</span> , <a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k3">-</span><span class="n">0</span>.<span class="n">5</span> , <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>display<span class="k2">)</span> , <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span> , <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

So the horizontal line is vertically centered around y = h - 0.5, and is drawn from x = 0 to x = w. And the vertical line is horizontally centered around x = w-0.5 and is drawn from y = 0 to y = h. You can see it in the blue line in the second image in the page I linked you to.</p><p><span class="remote-thumbnail"><span class="json">{"name":"primitives2.png","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/c\/ac1f802e04dfc4830bb169c64050a142.png","w":789,"h":426,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/c\/ac1f802e04dfc4830bb169c64050a142"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/a/c/ac1f802e04dfc4830bb169c64050a142-240.jpg" alt="primitives2.png" width="240" height="129" /></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 28 Apr 2016 17:11:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Note also that this isn&#39;t a thing specific to Allegro - it will be the case any time you do hardware-accelerated rendering.</p><p>I find it helps if you think of the display as a sheet of graph paper.  Each box on the sheet is a pixel, and points are plotted at intersections, rather than inside the boxes.  Only if a fragment passes through the center of a &quot;pixel box&quot; will it light the pixel.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bruce Pascoe)</author>
		<pubDate>Sun, 01 May 2016 10:48:14 +0000</pubDate>
	</item>
</rss>
