{"id":324,"date":"2026-03-06T21:08:42","date_gmt":"2026-03-06T21:08:42","guid":{"rendered":"https:\/\/hackcuba.net\/?p=324"},"modified":"2026-03-06T21:08:42","modified_gmt":"2026-03-06T21:08:42","slug":"generacion-de-particulas-iii","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=324","title":{"rendered":"Generaci\u00f3n de part\u00edculas (III)"},"content":{"rendered":"\n<p>cap\u00edtulo todos los objetos implicados describir\u00e1n un nuevo tipo de movimiento: el arm\u00f3nico simple.<a href=\"file:\/\/\/home\/h0ax\/Hacking%20&amp;%20Programacion\/Rebista%20BlackHat\/BlackHat%2017\/_imgs\/0x660021.png\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/p>\n\n\n\n<p>Seguramente todos conocen que la cuerda de una guitarra al vibrar, las ondas sonoras, electromagn\u00e9ticas y las corrientes alternas efect\u00faan un movimiento ondulatorio que puede representarse como un sinusoide si trazamos dicho comportamiento en un eje coordenado rectangular, donde el eje <em>Y<\/em> indica la posici\u00f3n con respecto al tiempo rotulado en <em>X<\/em>. Veremos con detalle mediante un simple ejemplo:<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>El p\u00e9ndulo del \u00abreloj\u00bb de la figura 0x01 oscila durante diez segundos con la posici\u00f3n de equilibrio en SO , sin acci\u00f3n de fuerzas externas que puedan interferir en el movimiento. La analog\u00eda entre el caso real y el an\u00e1lisis gr\u00e1fico podr\u00eda establecerse si modelamos valores extremos -positivos y negativos- en el eje <em>Y<\/em> que correspondan al desplazamiento m\u00e1ximo del p\u00e9ndulo -hacia la izquierda y la derecha-, respectivamente. Luego, si en intervalos de tiempo suficientemente peque\u00f1os dibujamos puntos a lo largo del eje <em>X<\/em> que correspondan al valor posicional que tenga el p\u00e9ndulo en dichos instantes, resultar\u00e1 un gr\u00e1fico similar al de la figura 0x02:<a href=\"file:\/\/\/home\/h0ax\/Hacking%20&amp;%20Programacion\/Rebista%20BlackHat\/BlackHat%2017\/_imgs\/0x660024.png\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/p>\n\n\n\n<p>Como era de esperar, se producen curvas similares a la funci\u00f3n seno, donde valles y crestas coinciden en sus puntos cr\u00edticos con el valor l\u00edmite de la oscilaci\u00f3n del p\u00e9ndulo del modelo real. En Adobe Flash podemos generar comportamientos similares, adaptando las interpretaciones f\u00edsicas de dichos fen\u00f3menos a la metodolog\u00eda del ActionScript 2.0.<\/p>\n\n\n\n<p>Pues comencemos a establecer que un oscilador arm\u00f3nico simple cumple con un conjunto de propiedades que definen su curso a trav\u00e9s del tiempo. Los tres par\u00e1metros fundamentales con los que debemos lidiar para lograr que una part\u00edcula describa tal movimiento son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Amplitud<\/strong>: viene dada por el valor modular de Sm.<\/li>\n\n\n\n<li><strong>Longitud de onda<\/strong>: distancia que separa dos puntos en fase adyacentes.<\/li>\n\n\n\n<li><strong>Velocidad de fase<\/strong>: rapidez con que la onda se desplaza.<\/li>\n<\/ul>\n\n\n\n<p>La fase de una onda puede comprenderse, b\u00e1sicamente, como su estado de movimiento en funci\u00f3n del tiempo transcurrido y nos puede servir de mucha utilidad para la modelaci\u00f3n de nuestro problema. Sabemos, gracias a los f\u00edsicos, que la posici\u00f3n de la onda en el eje <em>Y<\/em>, en funci\u00f3n de la posici\u00f3n en <em>X<\/em> y del tiempo, viene dada por la f\u00f3rmula:<\/p>\n\n\n\n<p>Y(x, t) = Amplitud * sen ( (2 * \u03c0) \/ Longitud de onda ) * ( x &#8211; Velocidad de fase * t )<\/p>\n\n\n\n<p>Adaptando dicha f\u00f3rmula para nuestros intereses, tenemos que en el eje <em>X<\/em> cada part\u00edcula generada va a incrementarse en funci\u00f3n del tiempo en el valor <code>phase_velocity<\/code> y para el eje <em>Y<\/em>, la part\u00edcula va a describir un movimiento <code>amplitude<\/code> * sen ( ( 2 * \u03c0 * <code>_increment<\/code>) \/ <code>wave_length<\/code>). Ese valor incremental a\u00f1adido tiene una funci\u00f3n importante a la hora de plantear el problema sobre ActionScript 2.0 o cualquier otro lenguaje de programaci\u00f3n similar.<\/p>\n\n\n\n<p>Ya resuelta la parte inicial, comenzaremos a convertir en un MovieClip un c\u00edrculo diminuto trazado sobre el escenario. Luego le asignaremos dentro de la ventana <em>Biblioteca<\/em> un nombre e identificador <code>point<\/code>, vinculado a la clase <code>Particle<\/code>. Enseguida crearemos en <em>File<\/em> \u00bb <em>New<\/em> \u00bb <em>ActionScript File<\/em> un nuevo documento que guardaremos en la misma carpeta del proyecto, y escribiremos en \u00e9l la clase <code>Particle<\/code>, que hereda de la clase <code>MovieClip<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: as3; title: ; notranslate\" title=\"\">\nclass Particle extends MovieClip{\n\u00a0\u00a0private var amplitude:Number = 0;\n\u00a0\u00a0private var wave_length:Number = 0;\n\u00a0\u00a0private var phase_velocity:Number = 0;\n\u00a0\u00a0private var _increment:Number = 0; \/\/ Incremento del \u00e1ngulo (en radianes)\n\u00a0\u00a0private var init_y:Number = 0; \/\/ Posici\u00f3n inicial en el eje Y\n\n\u00a0\u00a0\/\/ Constructor\n\u00a0\u00a0public function Particle(){}\n\n\u00a0\u00a0public function onEnterFrame():Void{\n\u00a0\u00a0\u00a0\u00a0this._x += phase_velocity;\n\u00a0\u00a0\u00a0\u00a0this._y = init_y + amplitude * Math.sin((2 * Math.PI * _increment) \/ wave_length);\n\u00a0\u00a0\u00a0\u00a0_increment++;\n\u00a0\u00a0\u00a0\u00a0if(this._x &gt; Stage.width){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.removeMovieClip(); \/\/ Elimina la part\u00edcula cuando sale del escenario \n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0}\n\n\u00a0\u00a0\/\/ Amplitud \n\u00a0\u00a0public function setAmplitude(_amplitude:Number):Void{\n\u00a0\u00a0\u00a0\u00a0this.amplitude = _amplitude;\n\u00a0\u00a0}\n\u00a0\u00a0public function getAmplitude():Number{\n\u00a0\u00a0\u00a0\u00a0return this.amplitude;\n\u00a0\u00a0}\n\n\u00a0\u00a0\/\/ Longitud de onda\n\u00a0\u00a0public function setWave_length(_wave_length:Number):Void{\n\u00a0\u00a0\u00a0\u00a0this.wave_length = _wave_length\n\u00a0\u00a0}\n\u00a0\u00a0public function getWave_length():Number{\n\u00a0\u00a0\u00a0\u00a0return this.wave_length;\n\u00a0\u00a0}\n\n\u00a0\u00a0\/\/ Velocidad de fase \n\u00a0\u00a0public function setPhase_velocity(_phase_velocity:Number):Void{\n\u00a0\u00a0\u00a0\u00a0this.phase_velocity = _phase_velocity;\n\u00a0\u00a0}\n\u00a0\u00a0public function getPhase_velocity():Number{\n\u00a0\u00a0\u00a0\u00a0return this.phase_velocity;\n\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p>Ya tenemos lista la clase, con valores encapsulados, polimorfismo aplicado al <code>onEnterFrame<\/code> de la clase <code>MovieClip<\/code> y los m\u00e9todos para pasar valores a los futuros objetos de <code>Particle<\/code>. Luego, vamos al documento de Flash, quitamos el peque\u00f1o c\u00edrculo del escenario y escribimos en el primer fotograma lo siguiente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: as3; title: ; notranslate\" title=\"\">\nvar init_x:Number = 0;\nvar init_y:Number = Stage.height * 2 \/ 5;\nvar input_amplitude:Number = 20;\nvar input_wave_length:Number = 100;\nvar input_phase_velocity:Number = 1;\nvar counter:Number = 2; \/\/ contador de part\u00edculas generadas\n\nonEnterFrame = function(){\n\u00a0\u00a0\/\/ generar part\u00edcula\n\u00a0\u00a0attachMovie(&quot;point&quot;, &quot;point&quot; + counter, getNextHighestDepth() + counter,{_x:init_x, _y:init_y, init_y:init_y});\n\u00a0\u00a0\/\/ almacenar la ruta de la \u00faltima part\u00edcula generada\n\u00a0\u00a0current_point = eval(&quot;_root.point&quot; + counter);\n\u00a0\u00a0current_point.setAmplitude(input_amplitude);\n\u00a0\u00a0current_point.setWave_length(input_wave_length);\n\u00a0\u00a0current_point.setPhase_velocity(input_phase_velocity);\n\u00a0\u00a0counter++; \/\/ vamos, que venga la pr\u00f3xima part\u00edcula!\n}\n<\/pre><\/div>\n\n\n<p>Cuando reproduzcamos esta pel\u00edcula Flash, las part\u00edculas se generar\u00e1n a una velocidad por defecto de 12 fotogramas por segundo. Si disminuimos demasiado el valor de la longitud de onda, la mayor parte de los microprocesadores se ver\u00e1n forzados por la carga de procesamiento y disminuir\u00e1 el rendimiento del sistema operativo. Es necesario, para que corra bien nuestro Flash, configurar adecuadamente los par\u00e1metros <code>input_amplitude<\/code>, <code>input_wave_length<\/code> e <code>input_phase_velocity<\/code>, que son pasados a cada objeto en tiempo de ejecuci\u00f3n. En el siguiente Flash -similar al que usted obtendr\u00e1- se pueden evaluar cada uno de esos par\u00e1metros directamente a trav\u00e9s de la interfaz gr\u00e1fica (para verlo correctamente, su navegador debe tener instalado el complemento Flash Player 8 o superior; es recomendable no insertar una amplitud superior a 50 p\u00edxeles):<\/p>\n\n\n\n<p><object width=\"400\" height=\"100\"><\/object><\/p>\n\n\n\n<p>Pr\u00f3ximamente estaremos resolviendo sistemas m\u00e1s complejos de movimiento. Los interesados vayan pensando en el t\u00edpico juego de matar moscas, donde cada insecto realiza una trayectoria diferente de vuelo no rectil\u00edneo y no uniforme. A eso se le puede agregar tambi\u00e9n velocidad y direcci\u00f3n del viento, que afecte el vuelo de cada mosca.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para saber m\u00e1s&#8230;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/es.wikipedia.org\/wiki\/Webcam\" target=\"_blank\" rel=\"noreferrer noopener\">\u00bfQu\u00e9 es una WebCam?<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.adobe.com\/es\/devnet\/flash\/\" target=\"_blank\" rel=\"noreferrer noopener\">Centro de desarrollo de Adobe Flash<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.ffiles.com\" target=\"_blank\" rel=\"noreferrer noopener\">Flash Files Library<\/a><\/li>\n<\/ul>\n\n\n\n<p>Escrito por ZorphDark [<a href=\"mailto:blackhat4all@gmail.com?subject=para ZorphDark\">blackhat4all@gmail.com<\/a>]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>cap\u00edtulo todos los objetos implicados describir\u00e1n un nuevo tipo de movimiento: el arm\u00f3nico simple. Seguramente todos conocen que<\/p>\n","protected":false},"author":2,"featured_media":325,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,36],"tags":[101,88,38],"class_list":["post-324","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigos","category-proyecto-blackhat","tag-actionscript","tag-codigos","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=324"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/324\/revisions"}],"predecessor-version":[{"id":326,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/324\/revisions\/326"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/325"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}