Forked from: kacchan6's forked from: シェイプトゥイーンの実験 diff:12 wonderfl build Flash online 0xABCDEF forked:1favorite:5lines:671license : All rights reserved modified : 2011-06-15 18:54:12 Embed Tweet // forked from kacchan6's forked from: シェイプトゥイーンの実験 // forked from kacchan6's シェイプトゥイーンの実験 package { import flash.geom.ColorTransform; import flash.geom.Point; import flash.geom.Matrix; import flash.display.BitmapData; import flash.display.Bitmap; import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.filters.GlowFilter; [SWF(width=465, height=465, backgroundColor=0x000000, frameRate=30)] public class ShapeTween extends Sprite { public function ShapeTween() { //アイコンデータは以下から参照 http://raphaeljs.com/icons/ var path1:CompoundPath = new CompoundPath(); //wonderfl SVGPathParser.draw(path1, "M132.897,254.69c-0.14,0.49-0.49,0.771-1.12,0.771h-4.13c-0.56,0-0.91-0.28-1.12-0.771l-9.941-32.204c-3.431,10.851-6.931,21.422-10.361,32.134c-0.14,0.56-0.56,0.84-1.26,0.84h-3.851c-0.63,0-1.05-0.07-1.26-0.84l-11.691-36.054c-0.21-0.49,0.14-0.98,0.7-0.98h3.22c0.561,0,0.98,0.35,1.26,0.98l9.941,31.923c3.431-10.711,6.721-20.862,10.151-31.574c0.21-0.91,0.77-1.33,1.61-1.33h3.29c0.91,0,1.47,0.42,1.68,1.33l9.731,31.574c3.57-10.991,6.721-20.933,10.291-31.923c0.21-0.561,0.7-0.98,1.26-0.98h2.8c0.56,0,0.91,0.49,0.7,0.98L132.897,254.69zM185.536,236.559c0,5.531-1.75,10.291-4.34,13.861c-3.291,3.92-7.771,6.16-13.582,6.16s-10.361-2.24-13.651-6.16c-2.59-3.57-4.271-8.33-4.271-13.861c0-5.67,1.4-10.291,4.271-13.861c3.291-4.061,7.841-6.091,13.651-6.091c5.881,0,10.291,1.96,13.582,6.091C184.066,226.408,185.536,231.028,185.536,236.559z M180.355,236.559c0-4.411-1.26-8.261-3.29-11.271c-2.45-3.011-5.601-4.48-9.451-4.48c-3.92,0-7,1.61-9.451,4.48c-2.17,3.01-3.36,6.86-3.36,11.271c0,4.48,1.19,8.4,3.36,11.271c2.451,3.01,5.601,4.551,9.451,4.551c3.92,0,7.001-1.681,9.451-4.551C179.096,244.959,180.355,241.039,180.355,236.559zM225.015,254.48c0,0.63-0.35,0.98-0.98,0.98h-2.8c-0.63,0-0.98-0.351-0.98-0.98v-22.052c0-8.611-3.22-11.832-8.821-11.832c-7.561,0-11.622,4.411-11.622,11.971v21.913c0,0.63-0.35,0.98-0.98,0.98h-2.8c-0.63,0-0.98-0.351-0.98-0.98v-28.003c0-3.991,0-5.881-0.21-7.911c-0.07-0.63,0.42-0.98,0.98-0.98h2.52c0.63,0,0.98,0.35,0.98,0.98v3.85c2.59-3.99,5.88-5.811,12.321-5.811c8.891,0,13.371,5.391,13.371,14.702V254.48zM267.784,254.48c0,0.63-0.35,0.98-0.979,0.98h-2.73c-0.631,0-0.98-0.351-0.98-0.98v-5.25c-2.521,4.76-6.581,7.141-12.182,7.141c-4.97,0-8.891-1.891-11.69-5.741c-2.591-3.57-3.851-8.261-3.851-14.142c0-13.091,5.181-19.672,15.541-19.672c5.601,0,10.222,2.45,12.182,6.021v-22.052c0-0.63,0.35-0.98,0.98-0.98h2.73c0.63,0,0.979,0.35,0.979,0.98V254.48z M240.552,236.488c0,4.41,0.7,7.98,2.17,10.711c2.03,3.361,4.9,5.182,9.031,5.182c7.561,0,11.341-8.611,11.341-15.893c0-8.96-3.92-15.681-11.341-15.681c-3.991,0-7.001,1.68-9.031,5.11C241.252,228.648,240.552,232.288,240.552,236.488zM282.271,237.889c-0.21,9.24,4.971,14.492,12.602,14.492c3.71,0,7.001-0.631,9.801-2.24c0.63-0.281,0.91-0.141,0.91,0.489v3.15c0,0.42-0.28,0.771-0.77,0.979c-3.081,1.191-6.371,1.82-10.291,1.82c-11.481,0-17.433-6.65-17.433-20.092c0-5.95,1.471-10.711,4.411-14.351c3.08-3.71,7.001-5.531,11.691-5.531c5.25,0,8.961,1.89,11.69,5.601c2.381,3.291,3.57,7.771,3.57,13.301c0,2.451,0.07,2.381-2.52,2.381H282.271z M303.273,233.898c0-3.851-0.7-6.721-2.311-9.171c-1.75-2.73-4.2-4.13-7.491-4.13c-3.36,0-6.091,1.4-8.19,4.201c-1.681,2.52-2.94,6.021-3.011,9.101H303.273zM335.822,221.857c-0.841-0.28-1.961-0.42-3.36-0.42c-3.431,0-6.021,1.68-7.701,5.11c-1.33,2.66-1.96,6.091-1.96,10.221v17.712c0,0.63-0.351,0.98-0.98,0.98h-2.73c-0.63,0-0.979-0.351-0.979-0.98v-28.423c0-3.36-0.07-5.041-0.141-7.491c0-0.63,0.351-0.98,0.98-0.98h2.59c0.63,0,0.98,0.35,0.98,0.98v6.86c2.311-5.88,5.671-8.821,10.081-8.821c1.05,0,2.17,0.14,3.221,0.42c0.56,0.21,1.05,0.56,1.05,1.33v2.94C336.872,221.857,336.312,222.067,335.822,221.857zM359.341,199.175c0.63,0.21,0.91,0.7,0.841,1.47l-0.141,2.03c-0.07,0.56-0.49,0.7-0.979,0.49c-1.051-0.35-1.751-0.49-2.871-0.49c-2.729,0-4.55,1.4-5.32,4.13c-0.35,1.12-0.49,3.571-0.49,7.421v3.36h7.701c0.63,0,0.98,0.35,0.98,0.98v2.1c0,0.63-0.351,0.98-0.98,0.98h-7.701v32.833c0,0.63-0.35,0.98-0.979,0.98h-2.73c-0.63,0-0.98-0.351-0.98-0.98v-32.833h-6.79c-0.631,0-0.98-0.35-0.98-0.98v-2.1c0-0.63,0.35-0.98,0.98-0.98h6.79v-2.87c0-5.11,0.49-8.751,1.4-10.991c1.47-3.36,4.341-5.041,8.681-5.041C357.101,198.685,358.291,198.825,359.341,199.175zM371.869,255.461h-3.08c-0.631,0-0.98-0.351-0.98-0.98v-53.696c0-0.63,0.35-0.98,0.98-0.98h3.08c0.63,0,0.979,0.35,0.979,0.98v53.696C372.849,255.11,372.499,255.461,371.869,255.461z"); //build var path2:CompoundPath = new CompoundPath(); SVGPathParser.draw(path2, "M158.023,200.505c0-0.63,0.35-0.98,0.98-0.98h2.73c0.63,0,0.98,0.35,0.98,0.98v22.332c2.31-3.85,6.86-6.3,12.181-6.3c10.431,0,15.612,6.581,15.612,19.742c0.21,10.431-4.761,19.882-15.612,19.882c-5.601,0-9.661-2.38-12.181-7.141v5.461c0,0.631-0.35,0.98-0.98,0.98h-2.73c-0.63,0-0.98-0.35-0.98-0.98V200.505z M185.466,236.278c0.21-7.771-2.871-15.751-11.412-15.751c-7.63,0-11.341,7.071-11.341,15.751c0,8.472,4.9,15.892,11.341,15.892C182.595,252.17,185.676,244.189,185.466,236.278zM230.965,254.48c0,0.631-0.35,0.98-0.98,0.98h-2.521c-0.63,0-0.98-0.35-0.98-0.98v-5.811c-2.45,5.6-6.371,7.91-12.531,7.91c-8.751,0-13.091-4.9-13.091-14.631v-23.382c0-0.63,0.35-0.98,0.98-0.98h2.8c0.63,0,0.98,0.35,0.98,0.98v22.123c0,7.91,3.01,11.9,9.101,11.9c7.071,0,11.551-6.65,11.341-14.561v-19.462c0-0.63,0.35-0.98,0.98-0.98h2.8c0.63,0,0.98,0.35,0.98,0.98v28.142C230.825,249.79,230.895,252.03,230.965,254.48zM242.301,204.355c0-1.89,1.471-3.43,3.361-3.43c1.89,0,3.43,1.54,3.43,3.43c0,1.891-1.54,3.36-3.43,3.36C243.771,207.715,242.301,206.246,242.301,204.355z M247.271,255.461h-3.08c-0.631,0-0.98-0.35-0.98-0.98v-35.914c0-0.63,0.35-0.98,0.98-0.98h3.08c0.631,0,0.98,0.35,0.98,0.98v35.914C248.252,255.111,247.902,255.461,247.271,255.461zM264.281,255.461h-3.08c-0.631,0-0.98-0.35-0.98-0.98v-53.696c0-0.63,0.35-0.98,0.98-0.98h3.08c0.629,0,0.979,0.35,0.979,0.98v53.696C265.26,255.111,264.91,255.461,264.281,255.461zM307.473,254.48c0,0.631-0.35,0.98-0.98,0.98h-2.73c-0.629,0-0.979-0.35-0.979-0.98v-5.25c-2.521,4.76-6.582,7.141-12.182,7.141c-4.971,0-8.891-1.891-11.691-5.741c-2.59-3.57-3.852-8.261-3.852-14.142c0-13.091,5.182-19.672,15.543-19.672c5.6,0,10.221,2.45,12.182,6.021v-22.052c0-0.63,0.35-0.98,0.979-0.98h2.73c0.631,0,0.98,0.35,0.98,0.98V254.48z M280.24,236.488c0,4.41,0.699,7.98,2.17,10.711c2.029,3.361,4.9,5.182,9.031,5.182c7.561,0,11.342-8.611,11.342-15.893c0-8.96-3.922-15.681-11.342-15.681c-3.99,0-7.002,1.68-9.031,5.11C280.939,228.648,280.24,232.288,280.24,236.488z"); //Flash var path3:CompoundPath = new CompoundPath(); SVGPathParser.draw(path3, "M162.853,254.48c0,0.63-0.35,0.98-0.98,0.98h-3.221c-0.63,0-0.98-0.351-0.98-0.98v-48.795c0-2.03,0-2.03,2.03-2.03h23.382c0.63,0,0.98,0.35,0.98,0.98v2.38c0,0.63-0.35,0.98-0.98,0.98h-20.232v18.552h19.252c0.63,0,0.98,0.35,0.98,0.98v2.521c0,0.63-0.35,0.98-0.98,0.98h-19.252V254.48zM197.082,255.461h-3.081c-0.63,0-0.98-0.351-0.98-0.98v-53.696c0-0.63,0.35-0.98,0.98-0.98h3.081c0.63,0,0.98,0.35,0.98,0.98v53.696C198.062,255.11,197.712,255.461,197.082,255.461zM211.57,223.467c-0.49,0.28-0.98,0.14-0.98-0.35v-2.66c0-0.63,0.35-1.12,0.98-1.47c3.291-1.75,6.861-2.38,11.271-2.38c9.311,0,13.441,4.411,13.441,13.371v17.572c0,2.8,0.07,4.9,0.279,6.931c0,0.63-0.35,0.98-0.979,0.98h-2.521c-0.63,0-0.98-0.351-0.98-0.98v-5.391c-1.96,4.761-7.071,7.491-12.461,7.491c-4.691,0-8.191-1.4-10.361-4.131c-1.47-1.891-2.24-4.48-2.24-6.931c0-5.671,2.59-9.941,8.121-11.972c3.36-1.189,8.541-1.819,15.471-1.819h0.91v-2.101c0-5.881-2.45-9.031-8.681-9.031C218.641,220.597,214.931,221.437,211.57,223.467z M231.522,235.719h-1.33c-5.25-0.21-9.311,0.49-12.041,1.54c-3.92,1.4-5.881,4.2-5.881,8.051c0,2.311,0.7,4.48,2.311,5.601c1.4,1.12,3.29,1.68,5.601,1.68c6.511,0,11.341-5.25,11.341-14.491V235.719zM246.221,250.84c2.869,1.19,5.811,1.75,8.82,1.75c5.04,0,8.681-2.66,8.681-6.86c0-2.45-2.1-4.9-4.69-6.371c-2.87-1.609-6.021-2.939-8.82-4.55c-3.361-1.891-4.9-4.761-4.9-7.771c0-7.001,5.6-10.431,12.32-10.431c3.571,0,5.951,0.35,8.541,1.12c0.561,0.21,1.051,0.56,0.98,1.19l-0.21,2.101c-0.07,0.77-0.63,0.91-1.12,0.7c-2.311-0.84-4.41-1.12-7.701-1.12c-5.391,0-8.121,2.17-8.121,6.441c0,1.89,1.33,3.5,4.761,5.18c3.011,1.471,5.741,2.66,9.102,4.551c2.87,1.61,5.04,5.11,5.04,8.961c0,7.421-6.511,10.852-13.512,10.852c-4.061,0-6.301-0.28-9.66-1.19c-0.631-0.21-0.98-0.63-0.91-1.26l0.279-2.591C245.17,250.77,245.59,250.56,246.221,250.84zM307.753,254.48c0,0.63-0.35,0.98-0.979,0.98h-2.801c-0.63,0-0.98-0.351-0.98-0.98v-21.563c0-9.031-3.29-12.181-8.61-12.181c-7.631,0-11.831,3.851-11.831,10.292v23.452c0,0.63-0.351,0.98-0.98,0.98h-2.8c-0.631,0-0.98-0.351-0.98-0.98v-53.766c0-0.63,0.35-0.98,0.98-0.98h2.8c0.63,0,0.98,0.35,0.98,0.98v20.302c2.59-3.01,6.301-4.271,12.111-4.271c9.03,0,13.091,5.25,13.091,16.101V254.48z"); //online var path4:CompoundPath = new CompoundPath(); SVGPathParser.draw(path4, "M172.271,236.559c0,5.53-1.75,10.291-4.34,13.861c-3.291,3.921-7.771,6.161-13.582,6.161s-10.361-2.24-13.651-6.161c-2.59-3.57-4.271-8.331-4.271-13.861c0-5.671,1.4-10.291,4.271-13.861c3.291-4.061,7.841-6.091,13.651-6.091c5.881,0,10.291,1.96,13.582,6.091C170.801,226.407,172.271,231.028,172.271,236.559z M167.09,236.559c0-4.411-1.26-8.261-3.29-11.271c-2.45-3.01-5.601-4.48-9.451-4.48c-3.92,0-7,1.61-9.451,4.48c-2.17,3.011-3.36,6.861-3.36,11.271c0,4.48,1.19,8.4,3.36,11.271c2.45,3.01,5.601,4.55,9.451,4.55c3.92,0,7.001-1.68,9.451-4.55C165.831,244.959,167.09,241.039,167.09,236.559zM211.75,254.48c0,0.63-0.35,0.98-0.98,0.98h-2.8c-0.63,0-0.98-0.351-0.98-0.98v-22.052c0-8.611-3.22-11.832-8.821-11.832c-7.561,0-11.622,4.411-11.622,11.972v21.912c0,0.63-0.35,0.98-0.98,0.98h-2.8c-0.63,0-0.98-0.351-0.98-0.98v-28.003c0-3.99,0-5.881-0.21-7.911c-0.07-0.63,0.42-0.98,0.98-0.98h2.521c0.63,0,0.98,0.35,0.98,0.98v3.851c2.59-3.99,5.88-5.811,12.321-5.811c8.891,0,13.371,5.391,13.371,14.702V254.48zM228.267,255.461h-3.081c-0.63,0-0.98-0.351-0.98-0.98v-53.696c0-0.63,0.35-0.98,0.98-0.98h3.081c0.63,0,0.98,0.35,0.98,0.98v53.696C229.247,255.11,228.896,255.461,228.267,255.461zM240.165,204.355c0-1.89,1.471-3.43,3.36-3.43c1.891,0,3.431,1.54,3.431,3.43s-1.54,3.36-3.431,3.36C241.636,207.715,240.165,206.245,240.165,204.355z M245.136,255.461h-3.08c-0.63,0-0.98-0.351-0.98-0.98v-35.914c0-0.63,0.351-0.98,0.98-0.98h3.08c0.63,0,0.98,0.35,0.98,0.98v35.914C246.116,255.11,245.766,255.461,245.136,255.461zM288.047,254.48c0,0.63-0.35,0.98-0.979,0.98h-2.801c-0.63,0-0.98-0.351-0.98-0.98v-22.052c0-8.611-3.22-11.832-8.82-11.832c-7.561,0-11.621,4.411-11.621,11.972v21.912c0,0.63-0.351,0.98-0.98,0.98h-2.8c-0.631,0-0.98-0.351-0.98-0.98v-28.003c0-3.99,0-5.881-0.21-7.911c-0.07-0.63,0.42-0.98,0.98-0.98h2.52c0.63,0,0.98,0.35,0.98,0.98v3.851c2.59-3.99,5.881-5.811,12.321-5.811c8.891,0,13.371,5.391,13.371,14.702V254.48zM302.884,237.889c-0.21,9.241,4.971,14.491,12.602,14.491c3.711,0,7.001-0.63,9.801-2.24c0.631-0.28,0.91-0.14,0.91,0.49v3.15c0,0.42-0.279,0.771-0.77,0.98c-3.081,1.189-6.371,1.82-10.291,1.82c-11.481,0-17.433-6.651-17.433-20.093c0-5.95,1.471-10.711,4.411-14.351c3.08-3.71,7-5.531,11.691-5.531c5.25,0,8.961,1.89,11.69,5.601c2.381,3.291,3.57,7.771,3.57,13.301c0,2.451,0.07,2.381-2.52,2.381H302.884z M323.887,233.898c0-3.851-0.7-6.721-2.311-9.171c-1.75-2.73-4.2-4.131-7.491-4.131c-3.36,0-6.09,1.4-8.19,4.201c-1.681,2.52-2.94,6.021-3.011,9.101H323.887z"); var morphs:Array = []; morphs.push(CompoundPath.createMorphingPath(path1, path2)); morphs.push(CompoundPath.createMorphingPath(path2, path3)); morphs.push(CompoundPath.createMorphingPath(path3, path4)); morphs.push(CompoundPath.createMorphingPath(path4, path1)); var shape:Shape = new Shape(); var data:BitmapData = new BitmapData(465, 465, true, 0); var bitmap:Bitmap = new Bitmap(data); var m:Matrix = new Matrix(); //m.scale(10, 10); //m.translate(50, 50); addChild(bitmap); var g:Graphics = graphics; g.beginFill(0x000000); g.drawRect(0, 0, 465, 465); g.endFill(); var t:uint = 0; addEventListener(Event.ENTER_FRAME, function(e:Event):void { if (t >= 400) { t = 0; } var index:int = int(t / 100); var t0:Number = (t - index * 100) / 100; t0 *= t0; var morph:MorphingPath = morphs[index]; morph.interpolate(t0); var g:Graphics = shape.graphics; g.clear(); g.beginFill(0xffffff); g.drawPath(morph.commands, morph.data); g.endFill(); data.colorTransform(data.rect, new ColorTransform(0.9, 0.3, 0.5, 0.95)); data.draw(shape, m); t += 4; }); } } } import flash.display.GraphicsPathCommand; class SVGPathParser { private static var _svgPathCommands:Object = {a: 7, A: 7, q: 4, Q: 4, t: 2, T: 2, s: 4, S: 4, c: 6, C: 6, v: 1, V: 1, h: 1, H: 1, l: 2, L: 2, z: 0, Z: 0, m: 2, M: 2}; private static var _svgPathPattern:RegExp = /^\s*(([-+]?(([0-9]*\.?[0-9]+)|([0-9]+\.?[0-9]*)))|[aAqQtTsScCvVhHlLzZmM,])\s*/; public static function draw(path:CompoundPath, pathString:String):void { if (pathString === null || pathString === "") { return; } var tokens:Array; var lastCommand:String; var moved:Boolean = false; var args:Vector.<Number> = new Vector.<Number>(); var commaAccept:Boolean; var commandAccept:Boolean; var point:ControlPoint = new ControlPoint(); while (tokens = pathString.match(_svgPathPattern)) { var token:String = tokens[1]; pathString = pathString.substring(tokens[0].length); if (!moved && token !== "m" && token !== "M") { return; } else if (!moved) { moved = true; lastCommand = token; continue; } if (token in _svgPathCommands) { if (commandAccept) { return; } if (executeCommand(path, point, lastCommand, args)) { lastCommand = token; } else { return; } lastCommand = token; commaAccept = false; commandAccept = false; } else { if (token !== ",") { commandAccept = false; args.push(parseFloat(token)); } else { commandAccept = true; if (commaAccept) { continue; } else { return; } } commaAccept = true; } } if (lastCommand) { executeCommand(path, point, lastCommand, args) } } private static function executeCommand(path:CompoundPath, point:ControlPoint, command:String, args:Vector.<Number>):Boolean { var argLength:uint = _svgPathCommands[command]; var command0:String = command.toLocaleLowerCase(); var relative:Number = command0 === command ? 1 : 0; var x:Number, y:Number, x1:Number, y1:Number; args.reverse(); while (true) { if (args.length < argLength) { return false; } switch (command0) { case "a": //unsupported break; case "q": point.qx = args.pop() + relative * path.x; point.qy = args.pop() + relative * path.y; //passthrough case "t": x = args.pop() + relative * path.x; y = args.pop() + relative * path.y; if (isNaN(point.qx)) { point.qx = path.x; } if (isNaN(point.qy)) { point.qy = path.y; } path.curveTo(point.qx, point.qy, x, y); point.cx = point.cy = NaN; point.qx = x * 2 - point.qx; point.qy = y * 2 - point.qy; break; case "c": point.cx = args.pop() + relative * path.x; point.cy = args.pop() + relative * path.y; //passthrough case "s": x = args.pop() + relative * path.x; y = args.pop() + relative * path.y; x1 = relative * path.x + args.pop(); y1 = relative * path.y + args.pop(); if (isNaN(point.cx)) { point.cx = path.x; } if (isNaN(point.cy)) { point.cy = path.y; } path.cubicCurveTo(point.cx, point.cy, x, y, x1, y1); point.qx = point.qy = NaN; point.cx = x1 * 2 - x; point.cy = y1 * 2 - y; break; case "v": path.lineTo(path.x, relative * path.y + args.pop()); point.cx = point.qx = point.cy = point.qy = NaN; break; case "h": path.lineTo(relative * path.x + args.pop(), path.y); point.cx = point.qx = point.cy = point.qy = NaN; break; case "l": path.lineTo(relative * path.x + args.pop(), relative * path.y + args.pop()); point.cx = point.qx = point.cy = point.qy = NaN; break; case "z": path.close(); point.cx = point.qx = point.cy = point.qy = NaN; break; case "m": path.moveTo(relative * path.x + args.pop(), relative * path.y + args.pop()); point.cx = point.qx = point.cy = point.qy = NaN; break; default: return false; } if (args.length === 0) { break; } } return true; } private static function radiusToDegress(angle:Number):Number { return angle * (180 / Math.PI); } } class CompoundPath { private static var _cbt:Vector.<Number> = Vector.<Number>([0, 0, 0, 1, 0.001953125, 0.041015625, 0.287109375, 0.669921875, 0.015625, 0.140625, 0.421875, 0.421875, 0.052734375, 0.263671875, 0.439453125, 0.244140625, 0.125, 0.375, 0.375, 0.125, 0.244140625, 0.439453125, 0.263671875, 0.052734375, 0.421875, 0.421875, 0.140625, 0.015625, 0.669921875, 0.287109375, 0.041015625, 0.001953125, 1, 0, 0, 0]); public static function createMorphingPath(start:CompoundPath, end:CompoundPath):MorphingPath { start.close(); end.close(); var paths:uint = Math.max(start._paths.length, end._paths.length); var startData:Vector.<Number> = new Vector.<Number>(); var endData:Vector.<Number> = new Vector.<Number>(); var commands:Vector.<int> = new Vector.<int>(); for (var i:uint = 0; i < paths; i++) { var startPath:Path = start._paths[i]; var endPath:Path = end._paths[i]; var count:uint; if (startPath === null) { count = endPath.writeCoordCenter(endData, startData); } else if (endPath === null) { count = startPath.writeCoordCenter(startData, endData); } else if (startPath.coordsList.length !== endPath.coordsList.length) { count = startPath.writeCoordInterpolate(endPath, startData); endPath.writeCoordInterpolate(startPath, endData); } else { count = startPath.coordsList.length; startData.push(startPath.x, startPath.y); endData.push(endPath.x, endPath.y); for (var j:uint = 0, len:uint = startPath.coordsList.length; j < len; j++) { var startCoords:Coords = startPath.coordsList[j]; var endCoords:Coords = endPath.coordsList[j]; startData.push(startCoords.cx, startCoords.cy, startCoords.ax, startCoords.ay); endData.push(endCoords.cx, endCoords.cy, endCoords.ax, endCoords.ay); } } var commandIndex:uint = commands.length; commands[commandIndex++] = GraphicsPathCommand.MOVE_TO; for (var k:uint = 0; k < count; k++) { commands[commandIndex++] = GraphicsPathCommand.CURVE_TO; } } return new MorphingPath(commands, startData, endData); } private var _coordsList:Array; private var _lastMoveX:Number; private var _lastMoveY:Number; private var _paths:Array; private var _x:Number; private var _y:Number; public function CompoundPath() { _paths = []; _coordsList = []; _x = 0; _y = 0; _lastMoveX = 0; _lastMoveY = 0; } public function close():void { if (_coordsList.length > 0) { if (_x !== _lastMoveX || _y !== _lastMoveY) { lineTo(_lastMoveX, _lastMoveY); _x = _lastMoveX; _y = _lastMoveY; } _paths.push(new Path(_lastMoveX, _lastMoveY, _coordsList.splice(0))); } } public function cubicCurveTo(cx1:Number, cy1:Number, cx2:Number, cy2:Number, ax:Number, ay:Number):void { var t:Vector.<Number> = _cbt, x0:Number, x1:Number, x2:Number, y0:Number, y1:Number, y2:Number, i:int; for (i = 24; i >= 0; i -= 8) { x0 = t[i] * _x + t[i + 1] * cx1 + t[i + 2] * cx2 + t[i + 3] * ax; y0 = t[i] * _y + t[i + 1] * cy1 + t[i + 2] * cy2 + t[i + 3] * ay; x1 = t[i + 4] * _x + t[i + 5] * cx1 + t[i + 6] * cx2 + t[i + 7] * ax; y1 = t[i + 4] * _y + t[i + 5] * cy1 + t[i + 6] * cy2 + t[i + 7] * ay; x2 = t[i + 8] * _x + t[i + 9] * cx1 + t[i + 10] * cx2 + t[i + 11] * ax; y2 = t[i + 8] * _y + t[i + 9] * cy1 + t[i + 10] * cy2 + t[i + 11] * ay; var coords:Coords = new Coords(_x, _y, x1 * 2 - (x0 + x2) * 0.5, y1 * 2 - (y0 + y2) * 0.5, x0, y0); if (coords.length > 0) { _coordsList.push(coords); } _x = x0; _y = y0; } _x = ax; _y = ay; } public function curveTo(cx:Number, cy:Number, ax:Number, ay:Number):void { var coords:Coords = new Coords(_x, _y, cx, cy, ax, ay); if (coords.length > 0) { _coordsList.push(coords); } _x = ax; _y = ay; } public function lineTo(x:Number, y:Number):void { var coords:Coords = new Coords(_x, _y, x + (_x - x) * 0.5, y + (_y - y) * 0.5, x, y); if (coords.length > 0) { _coordsList.push(coords); } _x = x; _y = y; } public function moveTo(x:Number, y:Number):void { if (_coordsList.length > 0) { _paths.push(new Path(_lastMoveX, _lastMoveY, _coordsList.splice(0))); } _x = x; _y = y; _lastMoveX = x; _lastMoveY = y; } public function get x():Number { return _x; } public function get y():Number { return _y; } } class ControlPoint { public var cx:Number; public var cy:Number; public var qx:Number; public var qy:Number; } class Path { public var coordsList:Array; public var x:Number; public var y:Number; public function Path(x:Number, y:Number, coordsList:Array):void { var total:Number = 0; var coords:Coords; var current:Number = 0; for each (coords in coordsList) { total += coords.length; } for each (coords in coordsList) { coords.pos = current / total; current += coords.length; } this.x = x; this.y = y; this.coordsList = coordsList; } private function getNumCoords(from:Number, to:Number):uint { var count:uint = 0; for each (var coords:Coords in coordsList) { if (from <= coords.pos && coords.pos < to) { count++; } else if (to <= coords.pos) { break; } } return count; } public function writeCoordCenter(selfData:Vector.<Number>, centerData:Vector.<Number>):uint { var pointsX:Array = []; var pointsY:Array = []; var x:Number = this.x, y:Number = this.y; var len:uint = 0, index:uint = selfData.length; selfData.push(x, y); for each (var coords:Coords in coordsList) { selfData.push(coords.cx, coords.cy, coords.ax, coords.ay); getBounds1(coords.sy, coords.sx, coords.cx, coords.cy, coords.ax, coords.ay, pointsX, pointsY); len++; } x = Math.min.apply(null, pointsX); y = Math.min.apply(null, pointsY); x += (Math.max.apply(null, pointsX) - x) / 2; y += (Math.max.apply(null, pointsY) - y) / 2; centerData.push(x, y); for (var i:uint = 0; i < len; i++) { centerData.push(x, y, x, y); } return len; } public function writeCoordInterpolate(compare:Path, data:Vector.<Number>):uint { var self:Path = clone(), coords:Coords; var segments:uint = 4, i:uint, diff:int; var posFrom:Number, posTo:Number; for (i = 0; i < segments; i++) { posFrom = i / segments; posTo = (i + 1) / segments; diff = compare.getNumCoords(posFrom, posTo) - self.getNumCoords(posFrom, posTo); if (diff <= 0) { continue; } for each (coords in compare.coordsList) { if (posFrom <= coords.pos && coords.pos < posTo) { if (self.split(coords.pos)) { diff--; if (diff === 0) { break; } } } else if (posTo <= coords.pos) { break; } } } data.push(x, y); for each (coords in self.coordsList) { data.push(coords.cx, coords.cy, coords.ax, coords.ay); } return self.coordsList.length; } private function clone():Path { var coordsList:Array = new Array(this.coordsList.length); for (var i:uint = 0, len:uint = coordsList.length; i < len; i++) { coordsList[i] = this.coordsList[i].clone(); } return new Path(x, y, coordsList); } private function getBounds1(x1:Number, y1:Number, x2:Number, y2:Number, x3:Number, y3:Number, pointsX:Array, pointsY:Array):void { var left:Number = Math.min(x1, x3); var right:Number = Math.max(x1, x3); var top:Number = Math.min(y1, y3); var bottom:Number = Math.max(y1, y3); var t:Number, tp:Number, p:Number; t = (x1 - x2) / (x3 - 2 * x2 + x1); if (0 <= t && t <= 1) { tp = 1 - t; p = tp * tp * x1 + 2 * tp * t * x2 + t * t * x3; if (p < left) { left = p; } else if (right < p) { right = p; } } t = (y1 - y2) / (y3 - 2 * y2 + y1); if (0 <= t && t <= 1) { tp = 1 - t; p = tp * tp * y1 + 2 * tp * t * y2 + t * t * y3; if (p < top) { top = p; } else if (bottom < p) { bottom = p; } } pointsX.push(left, right); pointsY.push(bottom, top); } private function split(pos:Number):Boolean { if (pos === 0) { return false; } var coords0:Coords; var coords1:Coords; var index:uint = 0; var pos0:Number; var pos1:Number; for (var i:int = 0, len:uint = coordsList.length; i < len; i++) { coords0 = coordsList[i]; coords1 = coordsList[i + 1]; if (coords0.pos === pos) { return false; } pos0 = coords0.pos; pos1 = coords1 === null ? 1 : coords1.pos; if (pos0 < pos && pos < pos1) { index = i; break; } } var t:Number = 1 - (pos1 - pos) / (pos1 - pos0); var tp:Number = 1 - t; var dx:Number = tp * coords0.sx + t * coords0.cx; var dy:Number = tp * coords0.sy + t * coords0.cy; var ex:Number = tp * coords0.cx + t * coords0.ax; var ey:Number = tp * coords0.cy + t * coords0.ay; var fx:Number = tp * tp * coords0.sx + 2 * tp * t * coords0.cx + t * t * coords0.ax; var fy:Number = tp * tp * coords0.sy + 2 * tp * t * coords0.cy + t * t * coords0.ay; var coords2:Coords = new Coords(fx, fy, ex, ey, coords0.ax, coords0.ay); coords2.pos = pos; coords0.cx = dx; coords0.cy = dy; coords0.ax = fx; coords0.ay = fy; coordsList.splice(index + 1, 0, coords2); return true; } } class Coords { public var ax:Number; public var ay:Number; public var cx:Number; public var cy:Number; public var length:Number; public var pos:Number; public var sx:Number; public var sy:Number; public function Coords(sx:Number, sy:Number, cx:Number, cy:Number, ax:Number, ay:Number) { this.sx = sx; this.sy = sy; this.cx = cx; this.cy = cy; this.ax = ax; this.ay = ay; length = computeLength(); } public function clone():Coords { var coords:Coords = new Coords(sx, sy, cx, cy, ax, ay); coords.pos = pos; coords.length = length; return coords; } private function computeLength():Number { var xa:Number = 2 * (sx - 2 * cx + ax); var xb:Number = -2 * sx + 2 * cx; var ya:Number = 2 * (sy - 2 * cy + ay); var yb:Number = -2 * sy + 2 * cy; var a:Number = xa * xa + ya * ya; var b:Number = 2 * (xa * xb + ya * yb); var c:Number = xb * xb + yb * yb; if (b * b !== 4 * a * c) { return (2 * ((2 * a + b) * Math.sqrt(a * (a + b + c)) - b * Math.sqrt(a * c)) + (b * b - 4 * a * c) * Math.log((2 * Math.sqrt(a * c) + b) / (2 * (Math.sqrt(a * (a + b + c)) + a) + b))) / (8 * a * Math.sqrt(a)); } else if (a !== 0) { if (1 !== -b / (2 * a)) { return (2 * ((2 * a + b) * Math.sqrt(a * (a + b + c)) - b * Math.sqrt(a * c))) / (8 * a * Math.sqrt(a)); } return -b * Math.sqrt(c) / (4 * a); } return Math.sqrt(c); } } class MorphingPath { private var _commands:Vector.<int>; private var _data:Vector.<Number>; private var _endData:Vector.<Number>; private var _startData:Vector.<Number>; public function MorphingPath(commands:Vector.<int>, startData:Vector.<Number>, endData:Vector.<Number>) { _startData = startData; _endData = endData; _commands = commands; _data = new Vector.<Number>(_startData.length, true); interpolate(0); } public function get commands():Vector.<int> { return _commands; } public function get data():Vector.<Number> { return _data; } public function interpolate(t:Number):void { var i:int, len:uint, start:Number; for (i = 0, len = _startData.length; i < len; i++) { start = _startData[i]; _data[i] = start + (_endData[i] - start) * t; } } } Code Fullscreen Preview Fullscreen gameegg s26 syano andrewexex88.. ton_ pop Math.sqrt isNaN apply toLocaleLowerCase Vector GraphicsPathCommand.CURVE_TO GraphicsPathCommand.MOVE_TO splice Math.max parseFloat match push substring RegExp reverse clone Math.log split Boolean sort new page view favorite forked pv213 forked from: wonderfl build Fl.. bradsedito forked:0 favorite:1lines:677 (diff:12) tag: 煙