{"id":98,"date":"2011-01-05T23:38:42","date_gmt":"2011-01-05T23:38:42","guid":{"rendered":"http:\/\/paulsarduino.co.uk\/?page_id=98"},"modified":"2011-01-05T23:38:42","modified_gmt":"2011-01-05T23:38:42","slug":"lib3d-cpp","status":"publish","type":"page","link":"https:\/\/paulsarduino.co.uk\/?page_id=98","title":{"rendered":"lib3d.cpp"},"content":{"rendered":"<pre>#include &lt;TVout.h&gt;\r\n#include \"stdlib.h\"\r\n#include \"math.h\"\r\n#include \"lib3d.h\"\r\n\r\nLine3D::Line3D()\r\n{\r\n Line3D(0,0,0,0,0,0);\r\n}\r\n\r\nLine3D::Line3D(short x1, short y1, short z1, short x2, short y2, short z2)\r\n{\r\n p1.x = x1;\r\n p1.y = y1;\r\n p1.z = z1;\r\n \r\n p2.x = x2;\r\n p2.y = y2;\r\n p2.z = z2;\r\n}\r\n\r\nScene3D::Scene3D()\r\n{\r\n pTV = (TVout*)0;\r\n iNumLines = 0;\r\n mv = 0;\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ middle vertically\r\n mh = 0;\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ the horizontal middle\u00a0\u00a0 \u00a0\r\n h = 0;\r\n v = 0;\r\n UpdateConsts();\r\n}\r\n\r\n\r\nvoid Scene3D::CreateScene(short resX, short resY,\u00a0 TVout* pTVout)\r\n{\r\n pTV = pTVout;\r\n\r\n iNumLines = 0;\r\n mv = resX \/ 2;\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ middle vertically\r\n mh = resY \/ 2;\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ the horizontal middle\u00a0\u00a0 \u00a0\r\n h = 0;\r\n v = 0;\r\n UpdateConsts();\r\n}\r\n\r\nvoid Scene3D::SetVAngle(float vNew)\r\n{\r\n v = vNew;\r\n UpdateConsts();\r\n}\r\n\r\nvoid Scene3D::SetHAngle(float hNew)\r\n{\r\n h = hNew;\r\n UpdateConsts();\r\n}\r\n\r\nvoid Scene3D::UpdateConsts()\r\n{\r\n cosh = cos(h);\r\n sinh = sin(h);\r\n cosv = cos(v);\r\n sinv = sin(v);\r\n}\r\n\r\nint Scene3D::xyztox(short x, short y, short z)\r\n{\r\n return mh + round(x*cosh+z*sinh);\r\n}\r\n\r\nint Scene3D::xyztoy(short x, short y, short z)\r\n{\r\n return mv + round(y*cosv+(-x*sinh+z*cosh)*sinv);\r\n}\r\n\r\nvoid Scene3D::AddLine(Line3D line)\r\n{\r\n if (iNumLines &lt; MAX_LINES)\r\n {\r\n lines[iNumLines] = line;\r\n iNumLines++;\r\n }\r\n}\r\n\r\nvoid Scene3D::AddCube(short cX, short cY, short cZ, short edgeLen)\r\n{\r\n Line3D\u00a0\u00a0\u00a0 l;\r\n short\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iOffs = edgeLen - 1;\r\n \r\n \/\/ top square first\r\n l.p1.z = cZ + iOffs;\u00a0\u00a0 l.p2.z = cZ + iOffs;\r\n\r\n l.p1.x = cX - iOffs;\u00a0\u00a0 l.p1.y = cY + iOffs;\r\n l.p2.x = cX - iOffs;\u00a0\u00a0 l.p2.y = cY - iOffs;\r\n AddLine(l);\r\n l.p1.x = cX + iOffs;\u00a0\u00a0 l.p1.y = cY - iOffs;\r\n AddLine(l);\r\n\r\n l.p1.x = cX + iOffs;\u00a0\u00a0 l.p1.y = cY + iOffs;\r\n l.p2.x = cX + iOffs;\u00a0\u00a0 l.p2.y = cY - iOffs;\r\n AddLine(l);\r\n l.p2.x = cX - iOffs;\u00a0\u00a0 l.p2.y = cY + iOffs;\r\n AddLine(l);\r\n \r\n\r\n \/\/ bottom square second\r\n l.p1.z = cZ - iOffs;\u00a0\u00a0 l.p2.z = cZ - iOffs;\r\n \r\n l.p1.x = cX - iOffs;\u00a0\u00a0 l.p1.y = cY + iOffs;\r\n l.p2.x = cX - iOffs;\u00a0\u00a0 l.p2.y = cY - iOffs;\r\n AddLine(l);\r\n l.p1.x = cX + iOffs;\u00a0\u00a0 l.p1.y = cY - iOffs;\r\n AddLine(l);\r\n\r\n l.p1.x = cX + iOffs;\u00a0\u00a0 l.p1.y = cY + iOffs;\r\n l.p2.x = cX + iOffs;\u00a0\u00a0 l.p2.y = cY - iOffs;\r\n AddLine(l);\r\n l.p2.x = cX - iOffs;\u00a0\u00a0 l.p2.y = cY + iOffs;\r\n AddLine(l);\r\n \r\n \/\/ 4 corner lines\r\n l.p1.z = cZ - iOffs;\u00a0\u00a0 l.p2.z = cZ + iOffs;\r\n l.p1.x = cX + iOffs;\u00a0\u00a0 l.p1.y = cY + iOffs;\r\n l.p2.x = cX + iOffs;\u00a0\u00a0 l.p2.y = cY + iOffs;\r\n AddLine(l);\r\n l.p1.x = cX - iOffs;\r\n l.p2.x = cX - iOffs;\r\n AddLine(l);\r\n l.p1.y = cY - iOffs;\r\n l.p2.y = cY - iOffs;\r\n AddLine(l);\r\n l.p1.x = cX + iOffs;\r\n l.p2.x = cX + iOffs;\r\n AddLine(l);\u00a0\u00a0 \u00a0\r\n}\r\n\r\nvoid Scene3D::UpdateDisplay()\r\n{\r\n int\u00a0\u00a0 \u00a0\u00a0 x;\r\n\r\n if (pTV)\r\n {\r\n for(x = 0; x&lt; iNumLines; x++)\r\n {\r\n pTV-&gt;draw_line(xyztox(lines[x].p1.x,lines[x].p1.y,lines[x].p1.z), \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n xyztoy(lines[x].p1.x,lines[x].p1.y,lines[x].p1.z),\r\n xyztox(lines[x].p2.x,lines[x].p2.y,lines[x].p2.z),\r\n xyztoy(lines[x].p2.x,lines[x].p2.y,lines[x].p2.z),\r\n 1);\r\n }\r\n }\r\n}\r\n\r\nvoid Scene3D::AddSphere(float r, Point3D c)\r\n{\r\n \/\/ r = the radius of the sphere\r\n \/\/ c = the centre point of the sphere\r\n Line3D\u00a0\u00a0 \u00a0ln1;\r\n int\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0x;\r\n int\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0y;\r\n float\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0flat;\r\n float\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0flong;\r\n float\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0cr; \u00a0\u00a0 \u00a0\/\/ the radius of a circle inside the \r\n float\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pi = 3.1416259;\r\n\r\n for(y=-3; y&lt;= 3; y++)\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ draw lines in circles parallel to the equator\r\n {\r\n flat\u00a0 = y*pi\/6;\r\n ln1.p1.y = r*sin(flat)+c.y;\r\n ln1.p2.y = ln1.p1.y;\r\n \r\n \/\/ calculated the y coordinate of a circle in the sphere\r\n for(x=0; x &lt;= 12; x++)\r\n {\r\n flong = x*pi\/6;\r\n cr = r*cos(flat);\r\n ln1.p1 = ln1.p2;\r\n ln1.p2.x = cr*cos(flong) + c.x;\r\n ln1.p2.z = cr*sin(flong) + c.z;\r\n if (x != 0)\r\n {\r\n AddLine(ln1);\r\n }\r\n }\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n for(x=0; x &lt;= 12; x++) \/\/ reverse the wire pattern so it looks like a grid\r\n {\r\n \/\/ draw the pattern parallel to the meridians\u00a0\u00a0\u00a0 \u00a0\r\n flong = x*pi\/6;\r\n for(y=-3; y&lt;= 3; y++)\r\n {\r\n flat = y*pi\/6;\r\n ln1.p1 = ln1.p2;\r\n cr = r*cos(flat);\r\n ln1.p2.x = cr*cos(flong)+c.x;\r\n ln1.p2.z = cr*sin(flong)+c.z;\r\n ln1.p2.y = r*sin(flat)+c.y;\r\n \/\/ calculated the y coordinate of a circle in the sphere\r\n if (y != -3)\r\n {\r\n AddLine(ln1);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#include &lt;TVout.h&gt; #include &#8220;stdlib.h&#8221; #include &#8220;math.h&#8221; #include &#8220;lib3d.h&#8221; Line3D::Line3D() { Line3D(0,0,0,0,0,0); } Line3D::Line3D(short x1, short y1, short z1, short x2, short y2, short z2) { p1.x = x1; p1.y = y1; p1.z = z1; p2.x = x2; p2.y = y2; p2.z = z2; } Scene3D::Scene3D() { pTV = (TVout*)0; iNumLines = 0; mv = 0;\u00a0\u00a0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":16,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-98","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/98","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=98"}],"version-history":[{"count":2,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/98\/revisions"}],"predecessor-version":[{"id":287,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/98\/revisions\/287"}],"up":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/16"}],"wp:attachment":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=98"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}