{"id":283,"date":"2009-05-13T13:03:12","date_gmt":"2009-05-13T20:03:12","guid":{"rendered":"https:\/\/actionsnippet.com\/?p=1336"},"modified":"2009-05-13T13:03:12","modified_gmt":"2009-05-13T20:03:12","slug":"parametric-uv-surface","status":"publish","type":"post","link":"https:\/\/actionsnippet.com\/?p=283","title":{"rendered":"Parametric UV Surface"},"content":{"rendered":"<pre class=\"brush: as3; title: ; notranslate\" title=\"\">\r\nvar matrix:Matrix3D = new Matrix3D();\r\nvar verts:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;();\r\nvar pVerts:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;();\r\nvar uvts:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;();\r\nvar sqrt2:Number = Math.sqrt(2)\r\nvar pi:Number = Math.PI;\r\nvar pi23:Number= 2 * Math.PI \/ 3;\r\nvar step:Number= pi \/ 50;\r\nfor (var u:Number = -pi; u&lt;pi; u+=step) {\r\n\tfor (var v:Number = -pi; v&lt;pi; v+=step) {\r\n\t\t\/\/ from here http:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/hexatorus\/\r\n\t\tvar px = Math.sin(u) \/ Math.abs(sqrt2+ Math.cos(v))\r\n        var py = Math.sin(u+pi23) \/ Math.abs(sqrt2 +Math.cos(v + pi23))\r\n        var pz = Math.cos(u-pi23) \/ Math.abs(sqrt2 +Math.cos(v - pi23))\r\n\t\tverts.push(px * 50);\r\n\t\tverts.push(py * 50);\r\n\t\tverts.push(pz * 50);\r\n\t}\r\n}\r\nvar brush:BitmapData=new BitmapData(3,2,true,0x41FFFFFF);\r\nvar canvas:BitmapData=new BitmapData(400,400,false,0x000000);\r\naddChild(new Bitmap(canvas));\r\nvar dx:Number=0;\r\nvar dy:Number=0;\r\naddEventListener(Event.ENTER_FRAME, onLoop);\r\nfunction onLoop(evt:Event):void {\r\n\tdx += (mouseX - dx)\/4;\r\n\tdy += (mouseY - dy)\/4;\r\n\tmatrix.identity();\r\n\tmatrix.appendRotation(dy,Vector3D.X_AXIS);\r\n\tmatrix.appendRotation(dx,Vector3D.Y_AXIS);\r\n\tmatrix.appendTranslation(200, 200, 0);\r\n\tUtils3D.projectVectors(matrix, verts, pVerts, uvts);\r\n\tcanvas.lock();\r\n\tcanvas.fillRect(canvas.rect, 0x000000);\r\n\tvar p = new Point();\r\n\tfor (var i:int = 0; i&lt;pVerts.length; i+=2) {\r\n\t\tp.x = pVerts&#x5B;i];\r\n\t\tp.y = pVerts&#x5B;i+1];\r\n\t\tcanvas.copyPixels(brush, brush.rect, p, null, null, true);\r\n\t}\r\n\tcanvas.unlock();\r\n}\r\n<\/pre>\n<p>More 3D shapes inspired by (taken from) <a href=\"http:\/\/local.wasp.uwa.edu.au\/~pbourke\/\">Paul Bourke&#8217;s website<\/a>. I figured I should probably add a parametric 3D surface to this set of posts &#8211; so I chose to plot the <a href=\"http:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/hexatorus\/\">Triaxial Hexatorus<\/a>. It&#8217;s important to note that U and V go from -PI to PI.<\/p>\n<p>I googled Triaxial Hexatorus and stumbled upon a great <a href=\"http:\/\/agit8.turbulent.ca\/bwp\/2008\/02\/25\/dynamic-shape-morphing-with-papervision-3d\/\" target=\"blank\">papervision demo<\/a> that creates meshes using parametric equations &#8211;  it also morphs between shapes.<\/p>\n<p>I also noticed that I don&#8217;t need to populate the uvts or pVerts Vectors with zeros &#8211; seems to work fine without doing that.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>var matrix:Matrix3D = new Matrix3D(); var verts:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;(); var pVerts:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;(); var uvts:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;(); var sqrt2:Number = Math.sqrt(2) var pi:Number = Math.PI; var pi23:Number= 2 * Math.PI \/ 3; var step:Number= pi \/ 50; for (var u:Number = -pi; u&lt;pi; u+=step) { for (var v:Number = -pi; v&lt;pi; v+=step) [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101,24,114,121,25,79],"tags":[3,4],"class_list":["post-283","post","type-post","status-publish","format-standard","hentry","category-3d","category-bitmapdata","category-graphics-algorithms","category-math","category-pixel-manipulation","category-vector","tag-actionscript","tag-flash"],"_links":{"self":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/posts\/283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=283"}],"version-history":[{"count":0,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/posts\/283\/revisions"}],"wp:attachment":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}