Andrew Harvey's Blog - Entries tagged projectionsEntries tagged projections
//tianjara.net/blog/
en-auThe content on this blog by Andrew Harvey, unless otherwise noted is licensed under a Creative Commons Attribution 3.0 Australia License.Chronicle/blog/img/blog-icon.pngAndrew Harvey's Blog
//tianjara.net/blog/
A Custom Drawing Projections Tool
/blog/archive/2008/11/a_custom_drawing_projections_tool.html
/blog/archive/2008/11/a_custom_drawing_projections_tool.htmlSat, 29 Nov 2008 00:58:56 +1100<p>Back in 2007 I developed a software tool that could generate technical drawings in a range of drawing projections from a 3D model with emphasis on oblique (both cabinet and cavalier, as well as custom obliques), planometric, dimetric, trimetric and one-point perspective.</p>
<p>I could describe them all as well as many more in terms of what the projected three axis look like on the projection plane. I described them all in terms of a scale on each of the three axis, as well as the angle two of the axis make with the projection plane's horizontal.</p>
<p>[caption id="attachment_130" align="aligncenter" width="151" caption="Description of the projection in terms of the projected view of the three standard basis."]<a href="/blog/attachments/2008/11/pp-description1.png"><img class="size-full wp-image-130" title="pp-description1" src="/blog/attachments/2008/11/pp-description1.png" alt="Description of the projection in terms of the projected view of the three standard basis." width="151" height="154" /></a>[/caption]</p>
<p>In terms of the actual development of the program I'm sure I could have done things a lot better. But I did learn a lot from the experience. The program worked to my needs and did what I wrote it to do so in that sense it was a success. The only downside would be that I did a lot of code rewriting of code that already existed out there (which probably did thinks better than I implemented them). Although since then I have done much more programming and had formal training so have learnt about better methods and practices.</p>
<p>The approach I took was basically import a DXF file, process the data to change its projection, and then export it as a DXF again. I used 3D polylines generated from my 3D model in Rhino and saved as DXF for the input. So I had to write a cutdown DXF reader/writer, as well as a way of storing this data internally and then doing the transformations on it then exporting it back into DXF so I could open it up in AutoCAD.</p>
<p>I only supported points, polylines, circles and arcs as this is basically all that Rhino exported from my model. To simplify the process of circles and arcs I internally converted them to a bunch of polylines as only for some projections they stayed as nice ellipses.</p>
<p>[caption id="attachment_104" align="aligncenter" width="961" caption="The user interface of the tool."]<a href="/blog/attachments/2008/11/ui.png"><img class="size-full wp-image-104" title="ui" src="/blog/attachments/2008/11/ui.png" alt="The user interface of the tool." width="961" height="634" /></a>[/caption]</p>
<p style="text-align:left;">From a very simple model in Rhino, I use the silhouette tool to create the polylines which once impororted into my program produced the following samples.</p>
<p>[caption id="attachment_131" align="aligncenter" width="152" caption="Cabinet Oblique"]<a href="/blog/attachments/2008/11/cabob.png"><img class="size-full wp-image-131" title="Cabinet Oblique" src="/blog/attachments/2008/11/cabob.png" alt="Cabinet Oblique" width="152" height="164" /></a>[/caption]</p>
<p style="text-align:center;"></p>
<p>[caption id="attachment_132" align="aligncenter" width="205" caption="Cavalier Oblique"]<a href="/blog/attachments/2008/11/cavob.png"><img class="size-full wp-image-132" title="Cavalier Oblique" src="/blog/attachments/2008/11/cavob.png" alt="Cavalier Oblique" width="205" height="219" /></a>[/caption]</p>
<p>[caption id="attachment_133" align="aligncenter" width="184" caption="Planometric"]<a href="/blog/attachments/2008/11/plan.png"><img class="size-full wp-image-133" title="Planometric" src="/blog/attachments/2008/11/plan.png" alt="Planometric" width="184" height="276" /></a>[/caption]</p>
<p style="text-align:left;"></p>
<p>[caption id="attachment_134" align="aligncenter" width="180" caption="One Point Perspective"]<a href="/blog/attachments/2008/11/oneptpersp.png"><img class="size-full wp-image-134" title="One Point Perspective" src="/blog/attachments/2008/11/oneptpersp.png" alt="One Point Perspective" width="180" height="201" /></a>[/caption]</p>
<p>There is also a range of built in axonometric projections...</p>
<p>[caption id="attachment_105" align="aligncenter" width="450" caption="A range of axonometric projections are built in."]<a href="/blog/attachments/2008/11/block-all-axonometric.png"><img class="size-full wp-image-105" title="block-all-axonometric" src="/blog/attachments/2008/11/block-all-axonometric.png" alt="A range of axonometric projections are built in." width="450" height="516" /></a>[/caption]</p>
<p>Finally here are some of my production drawings (from my <a href="http://andrew.harvey4.googlepages.com/">2007 HSC ITG Major Work</a> (<a href="http://andrew.harvey4.googlepages.com/itgmajorworkphotos">photos here</a>)) that I used the software to create.</p>
<p>[caption id="attachment_135" align="aligncenter" width="450" caption="Oblique"]<a href="/blog/attachments/2008/11/itg_major_2007_oblique.png"><img class="size-full wp-image-135" title="itg_major_2007_oblique" src="/blog/attachments/2008/11/itg_major_2007_oblique.png" alt="Oblique" width="450" height="317" /></a>[/caption]</p>
<p>[caption id="attachment_136" align="aligncenter" width="450" caption="One Point Perspective"]<a href="/blog/attachments/2008/11/itg_major_2007_persp.png"><img class="size-full wp-image-136" title="itg_major_2007_persp" src="/blog/attachments/2008/11/itg_major_2007_persp.png" alt="One Point Perspective" width="450" height="317" /></a>[/caption]</p>
<p>[caption id="attachment_137" align="aligncenter" width="450" caption="Planometric"]<a href="/blog/attachments/2008/11/itg_major_2007_planometric.png"><img class="size-full wp-image-137" title="itg_major_2007_planometric" src="/blog/attachments/2008/11/itg_major_2007_planometric.png" alt="Planometric" width="450" height="317" /></a>[/caption]</p>
<p>[caption id="attachment_138" align="aligncenter" width="450" caption="Trimetric"]<a href="/blog/attachments/2008/11/itg_major_2007_trimetric.png"><img class="size-full wp-image-138" title="itg_major_2007_trimetric" src="/blog/attachments/2008/11/itg_major_2007_trimetric.png" alt="Trimetric" width="450" height="317" /></a>[/caption]</p>
The Mathematics Behind Graphical Drawing Projections in Technical Drawing
/blog/archive/2008/11/the_mathematics_behind_graphical_drawing_projections_in_technical_drawing.html
/blog/archive/2008/11/the_mathematics_behind_graphical_drawing_projections_in_technical_drawing.htmlSat, 15 Nov 2008 10:48:55 +1100<p><em>In the field of technical drawing, projection methods such as isometric, orthogonal, perspective are used to project three dimensional objects onto a two dimensional plane so that three dimensional objects can be viewed on paper or a computer screen. In this article I examine the different methods of projection and their mathematical roots (in an applied sense).</em></p>
<p>The approach that seems to be used by Technical Drawing syllabuses in NSW to draw simple 3D objects in 2D is almost entirely graphical. I don't think you can say this is a bad thing because you don't always want or need to know the mathematics behind the process, you just want to be able to draw without thinking about this. However to have an appreciation of what's really happening the mathematical understanding is a great thing to learn.</p>
<p>Many 3D CAD/CAM packages available on the market today (such as AutoCAD, Inventor, Solidworks, CATIA, Rhinoceros) can generate isometric, three point perspective or orthogonal drawings from 3D geometry, however from what I've seen they can't seem do other projections such as dimetric, trimetric, oblique, planometric, one and two point perspective. Admittedly I don't think these projections are any use or even needed, but when your at high school and you have to show that you know how do to oblique, et al. it can be a problem when the software cannot do it for you from your 3D model. (So I actually wrote a small piece of software to help with this in <a href="http://andrewharvey4.wordpress.com/2008/11/29/a-custom-drawing-projections-tool/">this article</a>). But to do so, I needed to understand the mathematics behind these graphical projections. So I will try to explain that here.</p>
<p>The key idea is to think of everything having coordinates in a coordinate system (I will use the Cartesian system for simplicity). We can then express all these projections as mathematical transformations or maps. Like a function, you feed in the 3D point, and then you get out the projected 2D point. Things get a bit arbitrary here because an isometric view is essentially exactly the same as a front view. So we keep to the convention that when we assign the axis of the coordinate system we try to keep the three planes of the axis parallel to the three main planes of the object.</p>
<p>[caption id="attachment_107" align="aligncenter" width="450" caption="The three "main" planes of the object are placed parallel to the three planes of the axis. This is how we will choose our axis in relation to the object."]<a href="/blog/attachments/2008/11/model-axis-1.png"><img class="size-full wp-image-107" title="model-axis-1" src="/blog/attachments/2008/11/model-axis-1.png" alt="The three "main" planes of the object are placed parallel to the three planes of the axis. This is how we will choose our axis in relation to the object." width="450" height="416" /></a>[/caption]</p>
<p>We will not do this though,</p>
<p>[caption id="attachment_108" align="aligncenter" width="450" caption="We will not choose it like this..."]<a href="/blog/attachments/2008/11/model-axis-2.png"><img class="size-full wp-image-108" title="model-axis-2" src="/blog/attachments/2008/11/model-axis-2.png" alt="We will not choose it like this..." width="450" height="416" /></a>[/caption]</p>
<p>[caption id="attachment_109" align="aligncenter" width="450" caption="...or this."]<a href="/blog/attachments/2008/11/model-axis-3.png"><img class="size-full wp-image-109" title="model-axis-3" src="/blog/attachments/2008/11/model-axis-3.png" alt="...or this." width="450" height="416" /></a>[/caption]</p>
<p>In fact doing something like that shown just above with the object rotated is how we get projections like isometric.</p>
<p>Now what we do is take the coordinates of each point and "transform" them to get the projected coordinates, and join these points with lines where they originally were. However we can only do this for some kinds of projections, indeed for all the ones I have mentioned in this post this will do but only because these projections have a special property. They are linear maps (affine maps also hold this property and are a superset of the set of linear maps) which means that straight lines in 3D project to straight lines in 2D.</p>
<p>For curves we can just project a lot of points on the curve (subdivide it) and then join them up after they are projected. It all depends what our purpose is and if we are applying it practically. We can generate equations of the projected curves if we know the equation of the original curve but it won't always be as simple. For example circles in 3D under isometric projection become ellipses on the projection plane.</p>
<p>Going back to the process of the projection, we can use matrices to represent these projections where</p>
<p style="text-align:center;">$latex \begin{pmatrix}x'\\ y'\\ z'\end{pmatrix} = \begin{pmatrix}a&b&c\\ d&e&f\\ g&h&i\end{pmatrix}\begin{pmatrix}x\\ y\\ z\end{pmatrix}$</p>
<p>is the same as,</p>
<p style="text-align:center;">$latex x' = ax+by+cz\\ y' = dx+ey+fz\\ z' = gx+hy+iz.$</p>
<p>We call the 3 by 3 matrix above as the matrix of the projection.</p>
<p>Knowing all this, we can easily define orthogonal projection as you just take two of the dimensions and cull the third. So for say an orthographic top view the projection matrix is simply,</p>
<p style="text-align:center;">$latex \begin{pmatrix}1&0&0\\ 0&1&0\\ 0&0&0\end{pmatrix}.$</p>
<p>Now we want a projection matrix for isometric. One way would be to do the appropriate rotations on the object then do an orthographic projection, we can get the projection matrix by multiplying the matrices for the rotations and orthographic projection together. However I will not detail that here. Instead I will show you another method that I used to describe most of the projections that I learnt from high school (almost all except perspectives).</p>
<p>I can describe them as well as many "custom" projections in terms of what the three projected axis look like on the projection plane. I described them all in terms of a scale on each of the three axis, as well as the angle two of the axis make with the projection plane's horizontal.</p>
<p>[caption id="attachment_112" align="aligncenter" width="151" caption="Projection attributes described in terms of the projected axis."]<a href="/blog/attachments/2008/11/pp-description.png"><img class="size-full wp-image-112" title="pp-description" src="/blog/attachments/2008/11/pp-description.png" alt="Projection attributes described in terms of the projected axis." width="151" height="154" /></a>[/caption]</p>
<p style="text-align:left;">Using this approach we can think of the problem back in a graphical perspective of what the final projected drawing will look like rather than looking at the mathematics of how the object gets rotated prior to taking an orthographic projection or what angle do the projection lines need to be at in relation to the projection plane to get oblique, etc. Note also that the <em>x</em>, <em>y</em>, <em>z</em> in the above diagram are the scales of the <em>x</em>, <em>y</em>, <em>z</em> axis respectively. So we can see in the table below that we can now describe these projections in terms of a graphical approach that I was first taught.</p>
<table style="height:183px;border-style:solid;border-width:1px;" border="0" width="289">
<tbody>
<tr>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;"><strong>Projection</strong></td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;"><strong>α (alpha)</strong></td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;"><strong>β (beta)</strong></td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;"><em><strong>S</strong></em><sub><strong>x</strong></sub></td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;"><em><strong>S</strong></em><sub><strong>y</strong></sub></td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;"><em><strong>S</strong></em><sub><strong>z</strong></sub></td>
</tr>
<tr>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">Isometric</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">30°</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">30°</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
</tr>
<tr>
<td style="width:101px;text-align:center;border-style:solid;border-width:1px;">Cabinet Oblique</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">45°</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">0°</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">0.5</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
</tr>
<tr>
<td style="width:101px;text-align:center;border-style:solid;border-width:1px;">Cavalier Oblique</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">45°</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">0°</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
</tr>
<tr>
<td style="width:101px;text-align:center;border-style:solid;border-width:1px;">Planometric</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">45°</td>
<td style="width:100px;text-align:center;border-style:solid;border-width:1px;">45°</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
<td style="width:60px;text-align:center;border-style:solid;border-width:1px;">1</td>
</tr>
</tbody>
</table>
<p style="text-align:left;">Now all we need is a projection matrix that takes in alpha, beta and the three axes scale's and does the correct transformation to give the projection. The matrix is,</p>
<p style="text-align:center;">$latex \begin{bmatrix}x'\\y'\\z'\\1\end{bmatrix}=\begin{bmatrix}S_x\cos\alpha&-S_y\cos\beta&0&0\\ S_x\sin\alpha&S_y\sin\beta&S_z&0\\ 0&0&0&0\\ 0&0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}$</p>
<p style="text-align:left;">Now for the derivation. First we pick a 3D Cartesian coordinate system to work with. I choose the Z-up Left Hand Coordinate System, shown below and we imagine a rectangular prism in the 3D coordinate system.</p>
<p style="text-align:left;"></p>
<p>[caption id="attachment_114" align="aligncenter" width="450" caption="Block in 3D coordinate system."]<a href="/blog/attachments/2008/11/block-3d.png"><img class="size-full wp-image-114" title="block-3d" src="/blog/attachments/2008/11/block-3d.png" alt="Block in 3D coordinate system." width="450" height="253" /></a>[/caption]</p>
<p style="text-align:left;">Now we imagine what it would look like in a 2D coordinate system using isometric projection.</p>
<p style="text-align:left;"></p>
<p>[caption id="attachment_115" align="aligncenter" width="450" caption="Block in 2D coordinate system (isometric)."]<a href="/blog/attachments/2008/11/block-2d.png"><img class="size-full wp-image-115" title="block-2d" src="/blog/attachments/2008/11/block-2d.png" alt="Block in 2D coordinate system (isometric)." width="450" height="245" /></a>[/caption]</p>
<p style="text-align:left;">As the alpha and beta angles (shown below) can change, and therefore not limited to a specific projection, we need to use alpha and beta in the derivation.</p>
<p style="text-align:center;"><a href="/blog/attachments/2008/11/pp-description.png"><img class="size-full wp-image-112 aligncenter" title="pp-description" src="/blog/attachments/2008/11/pp-description.png" alt="pp-description" width="151" height="154" /></a></p>
<p style="text-align:left;">Now using these simple trig equations below we can deduce the following.</p>
<p style="text-align:center;"><a href="/blog/attachments/2008/11/polar.png"><img class="alignnone size-full wp-image-116" title="polar" src="/blog/attachments/2008/11/polar.png" alt="polar" width="203" height="100" /></a></p>
<p style="text-align:left;">All the points on the <em>xz</em> plane have <em>y</em> = 0. Therefore the <em>x</em>’ and <em>y</em>’ values on the 2D plane will follow the trig property shown above, so:</p>
<p style="text-align:center;">$latex x'=x\cos\alpha$
$latex y' = z + y\sin\alpha$</p>
<p style="text-align:left;">However not all the points lie on the <em>xz</em> plane, <em>y</em> is not always equal to zero. By visualising a point with a fixed <em>x </em>and <em>z </em>value but growing larger in <em>y </em>value, its <em>x</em>’ will become lower, and <em>y</em>’ will become larger. The extent of the <em>x</em>’ and <em>y</em>’ growth can again be expressed with the trig property shown, and this value can be added in the respective sense to obtain the final combined <em>x</em>’ and <em>y</em>’ (separately).</p>
<p style="text-align:center;">$latex x'=x\cos\alpha -y\cos\beta$
$latex y' = z + x \sin \alpha + y \sin \beta$</p>
<p style="text-align:left;">If <em>y</em> is in the negative direction then the sign will automatically change accordingly. The next step is to incorporate the scaling of the axes. This was done by replacing the <em>x</em>, <em>y</em> & <em>z</em> with a the scale factor as a multiple of the <em>x</em>, <em>y</em> & <em>z</em>. Hence,</p>
<p style="text-align:center;">$latex x'=S_x x\cos\alpha -S_y y\cos\beta$
$latex y' = S_z z + S_x x\sin\alpha + S_y y \sin \beta$</p>
<p style="text-align:left;">This can now easily be transferred into matrix form as shown at the start of this derivation or left as is.</p>
<p style="text-align:left;"><strong>References:
</strong>Harvey, A. (2007). <em>Industrial Technology - Graphics Industries 2007
HSC Major Project Management Folio</em>. (<a
href="//tianjara.net/hsc/itg-major-work/ITG_MajorProject_2007_ManagementFolio_Jul09.pdf">Link</a>)</p>
An Introduction to Hypercubes.
/blog/archive/2008/10/an_introduction_to_hypercubes_.html
/blog/archive/2008/10/an_introduction_to_hypercubes_.htmlTue, 21 Oct 2008 08:06:21 +1100<p>Point, Line Segment, Square, Cube. But what comes next, what is the equivalent object in higher dimensions? Well it is called a <em>hypercube </em>or <em>n-cube</em>, although the 4-cube has the special name <em>tesseract</em>.</p>
<h2>Construction Methods</h2>
<p>Before I go on to explain about the elements of hypercubes, let me show you some pictures of some hypercubes. I guess this also raises the question how can you construct these objects. One method is to start with a point. Then stretch it out in one dimension to get a line segment. Then take this line and stretch it out in another dimension perpendicular to the previous one, to get a square. Then take that square and stretch it out in another dimension perpendicular to the previous two to get a cube. This is when your visualisation may hit a wall. Its very hard to then visualise taking this cube and stretching it in another dimension perpendicular to the previous three. However mathematically, this is easy and this is one approach to constructing hypercubes.</p>
<p style="text-align:left;"></p>
<p>[caption id="attachment_55" align="aligncenter" width="297" caption="We place a point in R3."]<a href="/blog/attachments/2008/10/crop1-custom1.png"><img class="size-medium wp-image-56" title="Point" src="/blog/attachments/2008/10/crop1-custom1.png" alt="We place a point in R3." width="297" height="300" /></a>[/caption]</p>
<p>[caption id="attachment_56" align="aligncenter" width="297" caption="...and then stretch the point in one dimension to make a line..."]<a href="/blog/attachments/2008/10/crop2-custom.png"><img class="size-medium wp-image-56" title="Line" src="/blog/attachments/2008/10/crop2-custom.png?w=297" alt="...and then stretch the point in one dimension to make a line..." width="297" height="300" /></a>[/caption]</p>
<p>[caption id="attachment_58" align="aligncenter" width="297" caption="...and then we stretch that line in a direction perpendicular to the previous time..."]<a href="/blog/attachments/2008/10/crop3-custom.png"><img class="size-medium wp-image-58" title="Plane" src="/blog/attachments/2008/10/crop3-custom.png?w=297" alt="...and then we stretch that line in a direction perpendicular to the previous time..." width="297" height="300" /></a>[/caption]</p>
<p>[caption id="attachment_59" align="aligncenter" width="297" caption="...and finally stretch that plane in a direction perpendicular the the previous two times."]<a href="/blog/attachments/2008/10/crop4-custom.png"><img class="size-medium wp-image-59" title="Cube" src="/blog/attachments/2008/10/crop4-custom.png?w=297" alt="...and finally stretch that plane in a direction perpendicular the the previous two times." width="297" height="300" /></a>[/caption]</p>
<p>However there is more mathematical and analytical method. You most probably know that these n-cubes have certain elements to them, namely vertices (points), edges (lines), faces (planes), and then in the next dimension up, cells and then in general n-faces. These elements are summed up nicely <a href="http://en.wikipedia.org/wiki/Hypercube#Elements">here</a>. Firstly we take a field of say $latex \mathbb{R}^n$. Next we construct the vertices of the n-cube. Basically we are taking all the <em>n</em> dimensional vectors which have all the combinations of 0's and 1's for each entry of the vector. More mathematically,
There is a vertex described by each vector $latex \begin{pmatrix}a_1\ a_2\ \vdots\ a_n\end{pmatrix}$ where $latex a_i \in {0, 1}.$
There is an edge between vertices $latex \begin{pmatrix}a_1\ a_2\ \vdots\ a_n\end{pmatrix}$ and $latex \begin{pmatrix}b_1\ b_2\ \vdots\ b_n\end{pmatrix}$ if and only if $latex a_j \ne b_j$ for exactly one $latex j \in {1, \dots, n}$.
$latex \qquad \qquad \vdots&s=4$
There is an m-face between (or though) vertices $latex \begin{pmatrix}a_1\ a_2\ \vdots\ a_n\end{pmatrix}$ and $latex \begin{pmatrix}b_1\ b_2\ \vdots\ b_n\end{pmatrix}$ and ... and $latex \begin{pmatrix}m_1\ m_2\ \vdots\ m_n\end{pmatrix}$ if and only if $latex a_j \ne b_j \ne \dots \ne m_j$ for exactly $latex (m - 1), \;\; j \in {1, \dots, n}$.</p>
<p>Basically this means we list the vertices just as if were were counting in base 2. And then we can group these vertices into different groups based on the n-face level and (if we think of the vertices of a bit string) how many bits we have to change to make two vertices bit streams the same. This approach is very interesting because the concept of grouping these vertices relates strongly to hypergraphs.</p>
<p>Another way to think about it is as follows. Edges, from the set of all edges (i.e. joining each vertex with every other vertex), are the ones that are perpendicular to one of the standard basis vectors. This generalises to n-faces; from the set of all n-faces (i.e. all ways of grouping vertices into groups of <em>n</em>) are those that the object constructed is parallel to the span of any set of <em>n</em> of the standard basis vectors.</p>
<p>When you think about it, a lot of things that you can say about the square or cube generalise. For instance you can think of a square being surrounded by 4 lines, and cube by 6 surfaces, a tesseract by 8 cells, etc.</p>
<h2>Visualisation Methods</h2>
<p>Now that we have some idea how to describe and build n-cubes, the next question is how do we draw them. There are numerous methods and I can't explain them all in this post (such as slicing and stereographic projection, as well as other forms of projection (I'll leave these for another blog article)). But another question is also what aspects do we draw and how do we highlight them. For instance it may seem trivial in two dimensions to ask do I place a dot at each vertex and use just 4 solid lines for the edges. But in higher dimensions we have to think about how do we show the different cells and n-faces.</p>
<p>Firstly, how can we draw or project these <em>n</em> dimensional objects in a lower dimensional world (ultimately we want to see them in 2D or 3D as this is the only space we can draw in). This first method is basically the exact same approach that most people would have first learnt back in primary school. Although, I do not think it makes the most sense or makes visualisation easiest. Basically this method is just the take a dot and perform a series of stretches on it that I described earlier, although most people wouldn't think this is what they were doing. Nor would we usually start with a dot, we would normally start with the square. Although we will, so we start with this.</p>
<p>[caption id="attachment_79" align="aligncenter" width="15" caption="0-cube."]<a href="http://andrewharvey4.files.wordpress.com/2008/10/lines_0-cube.png"><img class="size-full wp-image-79" title="lines_0-cube" src="http://andrewharvey4.files.wordpress.com/2008/11/lines_0-cube.png" alt="0-cube, showing verticies." width="15" height="20" /></a>[/caption]</p>
<p>We would now draw a line along some axis from that dot, and place another dot at the end of this line.</p>
<p>[caption id="attachment_74" align="aligncenter" width="112" caption="1-cube, showing vertices and edges."]<a href="http://andrewharvey4.files.wordpress.com/2008/10/lines_1-cube.png"><img class="size-full wp-image-74" title="lines_1-cube" src="/blog/attachments/2008/11/lines_1-cube.png" alt="1-cube, showing verticies and edges." width="112" height="20" /></a>[/caption]</p>
<p>Now from each of the dots we have, we would draw another line along some other axis and again draw a dot at the end of each of those two lines. We would then connect the newly formed dots.</p>
<p>[caption id="attachment_75" align="aligncenter" width="120" caption="2-cube, showing vertices and edges."]<a href="http://andrewharvey4.files.wordpress.com/2008/10/lines_2-cube.png"><img class="size-full wp-image-75" title="lines_2-cube" src="/blog/attachments/2008/11/lines_2-cube.png" alt="2-cube, showing verticies and edges." width="120" height="120" /></a>[/caption]</p>
<p>Now, we just keep repeating this process where by each time we are drawing another dimension. So we take each of these four dots and draw lines from them in the direction of another axis, placing a dot at the end of each of these lines, and joining each of the dots that came from other dots that were adjacent, with a line.</p>
<p>[caption id="attachment_91" align="aligncenter" width="180" caption="3-cube, showing vertices and edges."]<a href="/blog/attachments/2008/11/lines_3-cube.png"><img class="size-full wp-image-91" title="lines_3-cube" src="/blog/attachments/2008/11/lines_3-cube.png" alt="" width="180" height="180" /></a>[/caption]</p>
<p>Now for 4D and beyond we basically keep the process going, just choosing really anywhere from the new axis, so long as it passes though the origin.</p>
<p>[caption id="attachment_78" align="aligncenter" width="240" caption="4-cube, showing vertices and edges."]<a href="/blog/attachments/2008/11/lines_4-cube.png"><img class="size-full wp-image-78" title="lines_4-cube" src="/blog/attachments/2008/11/lines_4-cube.png" alt="4-cube, showing verticies and edges." width="240" height="240" /></a>[/caption]</p>
<p>If we do a little bit of work we can see that this map is given by the matrix,</p>
<p style="text-align:center;">$latex \begin{pmatrix}1&0&r_1\cos \theta&-r_2\cos\phi\\ 0&1&r_1\sin\theta&r_2\sin\phi \\ 0&0&0&0 \\ 0&0&0&0 \end{pmatrix}$</p>
<p>where $latex \theta$ is the angle of the projected <em>z</em> axis from the <em>x</em> axis, and $latex \phi$ is the angle of the projected <em>w</em> axis from the negative <em>x</em> axis. Also <em>r</em><sub>1</sub> and <em>r</em><sub>2</sub> are the scales of the third and fourth respective receding axis (it makes it "look" more realistic when we use a number less than 1) This is just an extension of oblique projection for 3D to 2D.</p>
<p>Now this method seems very primitive, and a much better approach is to use all the dimensions we have. We live in a three dimensional world, so why just constrict our drawings to two dimensions! Basically, an alternate approach to draw an n-cube in three dimensional space would be to draw <em>n</em> lines all passing though a single point. Although it is not necessary to make all these lines as spread out as possible, we will try to. (This actually presents another interesting idea of how do we equally distribute <em>n</em> points on a sphere. For instance we can try to make it so that all the angles between any two of the points and the origin are equal. But I will leave this for another blog article later.) We then treat each of these lines as one dimension from there we can easily draw, or at least represent an n-dimensional point in 3D space. Now obviously we can have two different points in 4D that map to the same 3D point, but that is always going to happen no matter what map we use. The following set of 4 vectors are the projected axis we will use as a basis.</p>
<p style="text-align:center;">$latex \left \{ \mathbf{e_1}, \mathbf{e_2}, \mathbf{e_3}, \mathbf{e_4} \right \} = \left \{ \begin{pmatrix}1\\1\\1 \end{pmatrix}, \begin{pmatrix}-1\\-1\\1 \end{pmatrix}, \begin{pmatrix}-1\\1\\-1 \end{pmatrix}, \begin{pmatrix}1\\-1\\-1 \end{pmatrix} \right \}$</p>
<p>Now I won't say how I got these (actually I took them from Wikipedia, they are just the vertices of a 3-simplex) but all of the vectors share a common angle between any two and the origin.</p>
<p style="text-align:left;">Now if we draw in our tesseract, highlighting the cells with different colours (not this became problematic with some faces and edges as they are a common boundary for two different faces, so you cannot really make them one colour or the other) we get something like this,</p>
<p>[caption id="attachment_93" align="aligncenter" width="450" caption="Tesseract projected onto R3. The cells are shown in different colours, the purple lines show the four axis."]<a href="/blog/attachments/2008/11/tesseractwithcells1.png"><img class="size-full wp-image-93" title="tesseractwithcells1" src="/blog/attachments/2008/11/tesseractwithcells1.png" alt="Tesseract projected onto R3. The cells are shown in different colours, the purple lines show the four axis." width="450" height="390" /></a>[/caption]</p>
<p>The projection matrix for this projection is then simply (from the vectors that each of the standard basis maps to),</p>
<p style="text-align:center;">$latex \begin{pmatrix}1&-1&-1&1\\ 1&-1&1&-1\\ 1&1&-1&-1 \end{pmatrix}$</p>
<p>Now if we compare this to our original drawing (note I'm not talking about the projection used, but rather the presentation of the drawings, i.e. the colour.) I think you will see that the second one is clearer and try's to show where the cells and faces are, not just the vertices and edges. Note also the second one is in 3D so you can rotate around it. Looking at the first one though, you will notice it doesn't show where the faces or cells are. Remember that we have more than just vertices, edges and faces. We have cells, and n-faces. These are essentially just different groupings of the vertices. But how can we show these. Now the most mathematical way would be to just list all the different groupings. This is okay, but I like to see things in a visual sense. So another way would just show different elements. Like you draw all the vertices on one overhead, edges on another, and so on. Then when you put all these overheads on top of each other we get the full image, but we can also look at just one at a time to see things more clearly. This would be particularly more useful for the higher dimensional objects and higher dimensional elements. We can also use different colours to show the different elements. For example in the square, we can see that the line around surrounding it is 4 lines, but in higher dimensions its not so easy, so we can colour the different parts to the element differently. (When I say part I mean the 4 edges of a square are 4 different parts. Whereas the edges are all one element, but are a different element to the vertices.)</p>
<h2>Some Interesting Properties</h2>
<p>Once you start defining hypercubes there are many interesting properties that we can investigate. For this section lets just assume that we have the standard hypercube of side length 1. Now we can trivially see that the area, volume, etc. for the respective hypercube will always be 1. As described above each time we add another dimension and sweep the object out into that dimension we effectively multiply this hypervolume by 1. So for an n-cube, the hypervolume of it will be $latex 1^n$. When I say hypervolume I mean the one that makes sense for that dimension. E.g. in 2D, area, in 3D, volume, and so on.</p>
<p>The next obvious question to ask is what is the perimeter, surface area, cell volume, ..., n-face hypervolume of the respective n-cube? It gets a little confusing as you have to think about what exactly you are finding. Is it a length, an area, a volume? Well it will just be an (<em>n</em> - 1) volume. Eg. in 2D we are finding a length (the perimeter), in 3D, an area (surface area), and so on so that each time we increase the dimension of the n-cube we increase the units we are measuring in. Well if we just start listing the sequence (starting with a square), 4, 6... we notice this is just the number of (<em>n</em> - 1) degree elements. Namely, the number of edge, faces, cells, etc.</p>
<p>This leads me in the obvious question of how can I calculate the number of m-elements of the n-cube?</p>
<p>Well instead of me just going to the formula, which you can find on Wikipedia anyway, I will go though my lines of thinking when I first tried to work this out. Number of vertices is easy, each component of the n-vector can be either a 0 or a 1. So for each component there is 2 possibilities, but we have n of them, so it is just 2x2x2... <em>n</em> times, or 2<sup><em>n</em></sup>. Now originally when I tried to work out the number of edges, I started listing them and saw that I could construct the recurrence... Although with the help of graph theory it is very simple. In graph theory the handshaking theorem says $latex \displaystyle 2\left |E \right| = \sum_{v \in V} \mbox{deg}(v).$ Where $latex \left | E \right |$ means the number of edges, and $latex \mbox{deg}(V)$ means the degree of vertex <em>V</em>, which means the number of edges connected two it. Now if we think of an edge being a group of two vertices where you only make one entry of the vector change to get from one vector to the other, then we can see that there are exactly <em>n</em> way of doing this. We can either change the 1st entry of the vector, or the 2nd, or the ...., or the <em>n</em>th. Thus each vertex has of the n-cube graph will have degree <em>n</em>. So as we have 2<sup><em>n</em></sup> vertices and each vertex has degree <em>n</em>, then the sum of the vertex degrees will be <em>n</em>2<sup><em>n</em></sup>. Hence by the handshaking theorem, $latex |E| = \frac{1}{2} n 2^n = n 2^{n-1}.$ I am not exactly sure how to generalise this further. I will leave it for another article. However, the formula is $latex 2^{n-m} \binom{n}{m}.$</p>
<p><em>(I shall try to write more at a later date.)</em></p>
<p><strong>References:</strong></p>
<ul>
<li>Hypercube. (2008, October 14). In <em>Wikipedia, The Free Encyclopedia</em>. Retrieved 08:19, October 21, 2008, from <a class="external free" title="http://en.wikipedia.org/w/index.php?title=Hypercube&oldid=245242295" rel="nofollow" href="http://en.wikipedia.org/w/index.php?title=Hypercube&oldid=245242295">http://en.wikipedia.org/w/index.php?title=Hypercube&oldid=245242295</a></li>
<li>Tran, T., & Britz, T. (2008). MATH1081 Discreet Matematics: 5 Graph Theory.</li>
</ul>
(x,y,z,w) in OpenGL/Direct3D (Homogeneous Coordinates)
/blog/archive/2008/09/_x_y_z_w__in_opengl_direct3d__homogeneous_coordinates_.html
/blog/archive/2008/09/_x_y_z_w__in_opengl_direct3d__homogeneous_coordinates_.htmlMon, 29 Sep 2008 09:33:12 +1000<p>I always wondered why 3D points in OpenGL, Direct3D and in general computer graphics were always represented as (<span style="font-style:italic;">x</span>,<span style="font-style:italic;">y</span>,<span style="font-style:italic;">z</span>,<span style="font-style:italic;">w</span>) (i.e. why do we use four dimensions to represent a 3D point, what's the <span style="font-style:italic;">w</span> for?). This representation of coordinates with the extra dimension is know as homogeneous coordinates. Now after finally getting formally taught linear algebra I know the answer, and its rather simple, but I'll start from the basics.</p>
<p>Points can be represented as vectors, eg. (1,1,1). Now a common thing we want to do in computer graphics is to move this point (translation). So we can do this by simply adding two vectors together,</p>
<p style="text-align:center;">$latex \begin{pmatrix}x'\\y'\\z'\end{pmatrix} = \begin{pmatrix}x\\y\\z\end{pmatrix} + \begin{pmatrix}a\\b\\c\end{pmatrix} = \begin{pmatrix}x + a\\y + b\\z + c\end{pmatrix}.$</p>
<p style="text-align:left;">If we wanted do some kind of linear transformation such as rotate about the origin, scale about the origin, etc, then we could just multiply a certain matrix with the point vector to obtain the image of the vector under that transformation. For example,</p>
<p style="text-align:center;">$latex \begin{pmatrix}x'\\ y'\\ z' \end{pmatrix} = \begin{pmatrix}\cos \theta &-\sin \theta &0\\ \sin \theta &\cos \theta &0\\ 0&0&1\end{pmatrix} \begin{pmatrix}x\\ y\\ z\end{pmatrix}$</p>
<p style="text-align:left;"></p>
<p style="text-align:left;">will rotate the vector (<span style="font-style:italic;">x</span>,<span style="font-style:italic;">y</span>,<span style="font-style:italic;">z</span>) by angle theta about the <span style="font-style:italic;">z</span> axis.</p>
<p>However as you may have seen you cannot do a 3D translation on a 3D point by just multiplying a 3 by 3 matrix by the vector. To fix this problem and allow all affine transformations (linear transformation followed by a translation) to be done by matrix multiplication we introduce an extra dimension to the point (denoted <span style="font-style:italic;">w</span> in this blog). Now we can perform the translation,</p>
<p style="text-align:center;">$latex \mathbb{R}^2 : (x,y) \to (x+a, y+b)$</p>
<p>by a matrix multiplication,</p>
<p style="text-align:center;">$latex \begin{pmatrix}1 & 0 & a\\ 0 & 1 & b\\ 0 & 0 & 1\end{pmatrix} \begin{pmatrix}x\\ y\\ 1\end{pmatrix} = \begin{pmatrix}x + a\\ y + b\\ 1 \end{pmatrix}.$</p>
<p>We need this extra dimension for the multiplication to make sense, and it allows us to represent all affine transformations as matrix multiplication.</p>
<p><span style="font-size:85%;">REFERENCES:
Homogeneous coordinates. (2008, September 29). In <em>Wikipedia, The Free Encyclopedia</em>. Retrieved 04:33, September 29, 2008, from <a class="external free" title="http://en.wikipedia.org/w/index.php?title=Homogeneous_coordinates&oldid=241693659" rel="nofollow" href="http://en.wikipedia.org/w/index.php?title=Homogeneous_coordinates&oldid=241693659">http://en.wikipedia.org/w/index.php?title=Homogeneous_coordinates&oldid=241693659</a></span></p>