{"id":403,"date":"2008-08-07T15:33:36","date_gmt":"2008-08-07T20:33:36","guid":{"rendered":"http:\/\/www.pixelwit.com\/blog\/?p=403"},"modified":"2009-08-15T18:04:49","modified_gmt":"2009-08-15T23:04:49","slug":"draw-rotated-oval","status":"publish","type":"post","link":"https:\/\/www.pixelwit.com\/blog\/2008\/08\/07\/draw-rotated-oval\/","title":{"rendered":"Rotated Oval Tutorial"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/rotated-oval.png\" alt=\"rotated oval\" title=\"Rotated Oval\" width=\"264\" height=\"184\" class=\"alignnone size-full wp-image-411\" \/><\/p>\n<p>Making the transition from <a title=\"How to Draw a Circle\" href=\"https:\/\/www.pixelwit.com\/blog\/2007\/06\/basic-circle-drawing-actionscript\/\">drawing circles<\/a> to <a title=\"How to Draw an Oval\" href=\"https:\/\/www.pixelwit.com\/blog\/2008\/08\/oval-tutorial\/\">drawing ovals<\/a> is pretty simple but when you need to go from drawing ovals to drawing <em>rotated<\/em> ovals, you might run into a few problems.  This article documents some of the pitfalls I encountered and presents them as a learning experience.  If you just want some solid code to draw rotated ovals or twisted ellipses, skip ahead to the end of the article and copy the <a href=\"https:\/\/www.pixelwit.com\/blog\/2008\/08\/draw-rotated-oval\/#solidcode\">last block of code<\/a>.  If you think you might gain from my experience then by all means&#8230; read on.<!--more--><\/p>\n<p>In the simplest of terms, the goal is to plot the points of the rotated oval just like you would plot the points of a normal oval, but you also want to add a &#8220;twist&#8221; to each point so the whole oval ends up being rotated.  &#8220;No duh!&#8221; right?  If you want to rotate the whole oval, you have to rotate each and every point in the oval.  Thanks for the tip Captain Obvious, Commander of the S.S. A&#8217;Durrrrrrr.<\/p>\n<p>While the concept of rotating each point may be a no-brainer, simply adding &#8220;twist&#8221; won&#8217;t do the trick.<\/p>\n<p>Here&#8217;s the standard oval drawing code (for comparison purposes):<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">function<\/span> drawOval<span class=\"br0\">&#40;<\/span>centerX, centerY, xRadius, yRadius, sides<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">this<\/span>.<span class=\"kw3\">moveTo<\/span><span class=\"br0\">&#40;<\/span>centerX + xRadius, &nbsp;centerY<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">var<\/span> i=<span class=\"nu0\">0<\/span>; i<span class=\"sy0\">&lt;<\/span>=sides; i++<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> pointRatio = i<span class=\"sy0\">\/<\/span>sides;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> radians = pointRatio <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">*<\/span> <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> xSteps = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>radians<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> ySteps = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>radians<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> pointX = centerX + xSteps <span class=\"sy0\">*<\/span> xRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> pointY = centerY + ySteps <span class=\"sy0\">*<\/span> yRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">this<\/span>.<span class=\"kw3\">lineTo<\/span><span class=\"br0\">&#40;<\/span>pointX, pointY<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw3\">lineStyle<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; &nbsp; X, &nbsp; Y, &nbsp; W, &nbsp; H, steps.<\/span><br \/>\ndrawOval<span class=\"br0\">&#40;<\/span><span class=\"nu0\">250<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">150<\/span>, <span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>And here&#8217;s my first failed attempt at simply adding &#8220;twist&#8221; to each point:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"co1\">\/\/ Add &quot;twist&quot; argument.<\/span><br \/>\n<span class=\"kw2\">function<\/span> drawOval<span class=\"br0\">&#40;<\/span>centerX, centerY, xRadius, yRadius, twist, sides<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ Convert &quot;twist&quot; to radians.<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> twistRadians = twist <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">*<\/span><span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">this<\/span>.<span class=\"kw3\">moveTo<\/span><span class=\"br0\">&#40;<\/span>centerX + xRadius, centerY<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">var<\/span> i=<span class=\"nu0\">0<\/span>; i<span class=\"sy0\">&lt;<\/span>=sides; i++<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> pointRatio = i<span class=\"sy0\">\/<\/span>sides;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> radians = pointRatio <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">*<\/span> <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Add &quot;twist&quot; to &quot;radians&quot; .<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; radians += twistRadians;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> xSteps = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>radians<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> ySteps = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>radians<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> pointX = centerX + xSteps <span class=\"sy0\">*<\/span> xRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">var<\/span> pointY = centerY + ySteps <span class=\"sy0\">*<\/span> yRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">this<\/span>.<span class=\"kw3\">lineTo<\/span><span class=\"br0\">&#40;<\/span>pointX, pointY<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw3\">lineStyle<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; &nbsp; X, &nbsp; Y, &nbsp; W, &nbsp; H, &nbsp;twist, steps.<\/span><br \/>\ndrawOval<span class=\"br0\">&#40;<\/span><span class=\"nu0\">250<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">150<\/span>, <span class=\"nu0\">45<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">360<\/span>, <span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>The above code produced this SWF:<\/p>\n\n<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t\t\tid=\"fm_rotated-oval-fail_01_465959249\"\n\t\t\tclass=\"flashmovie\"\n\t\t\twidth=\"500\"\n\t\t\theight=\"400\">\n\t<param name=\"movie\" value=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/rotated-oval-fail_01.swf\" \/>\n\t<!--[if !IE]>-->\n\t<object\ttype=\"application\/x-shockwave-flash\"\n\t\t\tdata=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/rotated-oval-fail_01.swf\"\n\t\t\tname=\"fm_rotated-oval-fail_01_465959249\"\n\t\t\twidth=\"500\"\n\t\t\theight=\"400\">\n\t<!--<![endif]-->\n\t\t\n\t<!--[if !IE]>-->\n\t<\/object>\n\t<!--<![endif]-->\n<\/object>\n<p><strong>FAIL!<\/strong><\/p>\n<p>All that did was find a point on the circle, spin said point around the circle (by adding twist), and THEN scale the X and Y axis to make it an oval.  Twisting or spinning the points on a circle before they are scaled is useless, <strong>you must scale first and then twist<\/strong>.<\/p>\n<p><strong>*NOTE:<\/strong> The straight line is caused by the \"moveTo\" command sending the pen to the standard oval's starting point (3 O'clock) and then jumping to the (supposedly) \"rotated\" oval's new starting point 45 degrees around.<\/p>\n<p>It might be clearer now that one possible solution is to:<\/p>\n<ol>\n<li>Plot the point as if you were drawing a standard non-rotated oval being sure to scale X and Y (by multiplying times the xRadius and yRadius).<\/li>\n<li>After the point has been scaled, find its new distance from center.<\/li>\n<li>Find the point's new angle from center.<\/li>\n<li>Add \"twist\" to the new angle.<\/li>\n<li>Use distance and rotation values to plot the point at its new \"spun\" location.<\/li>\n<\/ol>\n<p>Here's what it looks like in code:<\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">function<\/span> drawOval<span class=\"br0\">&#40;<\/span>centerX, centerY, xRadius, yRadius, spin, steps<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> ratio, scaledAngle, ratioRadians, scaledRadius, angl, i;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> spinRadians = spin <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">*<\/span> <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> xx = centerX + <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>spinRadians<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> xRadius;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> yy = centerY + <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>spinRadians<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> xRadius;<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">moveTo<\/span><span class=\"br0\">&#40;<\/span>xx, yy<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span>i=<span class=\"nu0\">1<\/span>; i<span class=\"sy0\">&lt;<\/span>=steps; i++<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; ratio = i<span class=\"sy0\">\/<\/span>steps;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; ratioRadians = ratio <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">*<\/span> <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Scale the points like you would with a standard oval.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; xx = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>ratioRadians<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> xRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; yy = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>ratioRadians<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> yRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Find the scaled point's new distance from center.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; scaledRadius = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sqrt<\/span><span class=\"br0\">&#40;<\/span>xx<span class=\"sy0\">*<\/span>xx + yy<span class=\"sy0\">*<\/span>yy<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Find the scaled point's new angle from center.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; scaledAngle = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">atan2<\/span><span class=\"br0\">&#40;<\/span>yy, xx<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Spin the point.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; scaledAngle += spinRadians;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Plot the point with its new scaled and rotated values.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; xx = centerX + <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>scaledAngle<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> scaledRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; yy = centerY + <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>scaledAngle<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> scaledRadius;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">lineTo<\/span><span class=\"br0\">&#40;<\/span>xx, yy<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw3\">lineStyle<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\ndrawOval<span class=\"br0\">&#40;<\/span><span class=\"nu0\">250<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">100<\/span>, <span class=\"nu0\">45<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">360<\/span>, <span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>And here's the SWF created using the above code:<\/p>\n\n<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t\t\tid=\"fm_rotated-oval-way-1_615741833\"\n\t\t\tclass=\"flashmovie\"\n\t\t\twidth=\"500\"\n\t\t\theight=\"400\">\n\t<param name=\"movie\" value=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/rotated-oval-way-1.swf\" \/>\n\t<!--[if !IE]>-->\n\t<object\ttype=\"application\/x-shockwave-flash\"\n\t\t\tdata=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/rotated-oval-way-1.swf\"\n\t\t\tname=\"fm_rotated-oval-way-1_615741833\"\n\t\t\twidth=\"500\"\n\t\t\theight=\"400\">\n\t<!--<![endif]-->\n\t\t\n\t<!--[if !IE]>-->\n\t<\/object>\n\t<!--<![endif]-->\n<\/object>\n<p><strong>SUCCESS!<\/strong><\/p>\n<p>That's pretty sweet but there's still room for improvement because \"Math.atan2\" and \"Math.sqrt\" are redundant and use more resources than necessary.  There's a way to reduce the calculations above into a nice and compact formula but I must admit that the logic of the Math is a bit beyond me.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/oval-formula-diagram.png\" alt=\"diagram\" title=\"Oval Formula Diagram\" width=\"264\" height=\"184\" \/><br \/>\nFor an oval where...<\/p>\n<ul>\n<li>h = centerX;<\/li>\n<li>k = centerY;<\/li>\n<li>a = xRadius;<\/li>\n<li>b = yRadius;<\/li>\n<li>&#934; = spin angle<\/li>\n<li>t = initial angle (point ratio)<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/x-oval-formula.png\" alt=\"\" title=\"X Oval Formula\" width=\"297\" height=\"19\" class=\"alignnone size-full wp-image-432\" \/><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.pixelwit.com\/blog\/wp-content\/uploads\/2008\/08\/y-oval-formula.png\" alt=\"\" title=\"Y Oval Formula\" width=\"296\" height=\"19\" class=\"alignnone size-full wp-image-431\" \/><\/p>\n<p>Here's what the above formula looks like after it's been adapted to ActionScript:<a name=\"solidcode\">&nbsp;<\/a><\/p>\n<div class=\"codecolorer-container actionscript default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"actionscript codecolorer\"><span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw2\">function<\/span> drawOval<span class=\"br0\">&#40;<\/span>centerX, centerY, radiusX, radiusY, spin, steps<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> i, radian, radianSin, radianCos;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> spinRadians = spin <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">*<\/span> <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> spinSin = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>spinRadians<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> spinCos = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>spinRadians<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> xx = centerX + spinCos <span class=\"sy0\">*<\/span> radiusX;<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">var<\/span> yy = centerY + spinSin <span class=\"sy0\">*<\/span> radiusX;<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">moveTo<\/span><span class=\"br0\">&#40;<\/span>xx, yy<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> <span class=\"br0\">&#40;<\/span>i=<span class=\"nu0\">1<\/span>; i<span class=\"sy0\">&lt;<\/span>=steps; i++<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; radian = i<span class=\"sy0\">\/<\/span>steps <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy0\">*<\/span> <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">PI<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; radianSin = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">sin<\/span><span class=\"br0\">&#40;<\/span>radian<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; radianCos = <span class=\"kw3\">Math<\/span>.<span class=\"kw3\">cos<\/span><span class=\"br0\">&#40;<\/span>radian<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Apply the compact and efficient oval formula.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; xx = centerX+<span class=\"br0\">&#40;<\/span>radiusX<span class=\"sy0\">*<\/span>radianCos<span class=\"sy0\">*<\/span>spinCos-radiusY<span class=\"sy0\">*<\/span>radianSin<span class=\"sy0\">*<\/span>spinSin<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; yy = centerY+<span class=\"br0\">&#40;<\/span>radiusX<span class=\"sy0\">*<\/span>radianCos<span class=\"sy0\">*<\/span>spinSin+radiusY<span class=\"sy0\">*<\/span>radianSin<span class=\"sy0\">*<\/span>spinCos<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">lineTo<\/span><span class=\"br0\">&#40;<\/span>xx, yy<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"co1\">\/\/<\/span><br \/>\n<span class=\"kw3\">lineStyle<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\ndrawOval<span class=\"br0\">&#40;<\/span><span class=\"nu0\">250<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">200<\/span>, <span class=\"nu0\">100<\/span>, <span class=\"nu0\">45<\/span><span class=\"sy0\">\/<\/span><span class=\"nu0\">360<\/span>, <span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n<span class=\"co1\">\/\/<\/span><\/div><\/div>\n<p>The above code may be a lot harder to remember but it's tight and runs about 60% faster than the previous code sample.  \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tutorial explaining the ActionScript code used to plot a series of points around the circumference of a rotated oval.  Based on the <a title=\"PixelWit's Circle Drawing Tutorial\" href=\"https:\/\/www.pixelwit.com\/blog\/2007\/06\/basic-circle-drawing-actionscript\/\">Circle Drawing<\/a> and <a title=\"PixelWit's Oval Drawing Tutorial\" href=\"https:\/\/www.pixelwit.com\/blog\/2008\/08\/oval-tutorial\/\">Oval Drawing<\/a> tutorials.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[8],"tags":[23,42,45,36,37],"class_list":["post-403","post","type-post","status-publish","format-standard","hentry","category-flash","tag-actionscript","tag-code","tag-draw","tag-swfs","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/posts\/403","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/comments?post=403"}],"version-history":[{"count":0,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/posts\/403\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/media?parent=403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/categories?post=403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pixelwit.com\/blog\/wp-json\/wp\/v2\/tags?post=403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}