Allowed characters number and disabling textfield scrolling

How can we do if we have an "input" textfield and we wish to bind the max characters without making our textfield scrolling?
Think for example that we've only 4 visible lines for a textField t. How to prevent that users will write or just paste more text overfolwing on line 5?

below the solution I adopted:

1 I add a custom textfield with some height;
the first trouble is how many line the textfield is if this text is empty? (i just add a recursive function for understand this) check at getLastVisibleLine.
2 I slice each character under the last visible line.
package
{
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.text.TextFormat;
    import flash.events.Event;
    import flash.events.TextEvent;
    
    public class TextFieldUtil extends Sprite {
        
        public function TextFieldUtil()    { }
        
        //undestand how many lines we can insert in a textField without scrolling
        public static function getLastVisibleLine(t:TextField):int {
            t.type = TextFieldType.INPUT;
            var current_string:String = t.text;
            t.text = "";
            var l:int = 0;
            var scrld:Boolean = false;
            t.addEventListener(Event.SCROLL, checkScrl);
            function checkScrl(e:Event) {
                e.target.scrollV = 0;
                t.text = current_string;
                scrld = true;
            }
            while (scrld == false) {
                l++
                t.appendText("\n");
            }
            t.removeEventListener(Event.SCROLL, checkScrl);
            return l;
        }
        
        public static function createCustomTextField(x:Number, y:Number, width:Number, height:Number):TextField {
            var t:TextField = new TextField();
            t.type = TextFieldType.INPUT;
            t.mouseWheelEnabled = false
            t.wordWrap = true;
            t.multiline = true;
            t.x = x;
            t.y = y;
            t.width = width;
            t.height = height;
            //t.background = true;
            //t.border = true;
            var visiblesLines:int = getLastVisibleLine(t);
            
            t.addEventListener(Event.CHANGE, function (e:Event) { // lock text insertion and delete exceeding characters.
                var t:TextField = e.target as TextField;
                if (t.numLines > visiblesLines)    {
                    t.type = "dynamic";
                }
                while (t.numLines > visiblesLines){
                    var current_string:String = t.text;
                    t.text = current_string.slice(0, -1);
                }
                t.type = "input"; 
            });
            
            return t;
        }
    }
}
I wrote also a version with styles and special textFormat. Maybe I'll post in the future.

Jingle bells - Disney Advent Calendar


Advent Calendar
Here some screenshot of the latest job I did in Disney. It's an Advent calendar, that kind of Christmas gadgets... For each day you'll find something. It's made using papervision and the performance optimization was a terrible activity. We localized it for Italy, Spain, France and United Kingdom. I hope you'll enjoy it. My favorite days are 6 and 19 December, but you have to wait for see what I mean!
Ho catturato qualche schermata dell'ultimo progetto che ho concluso. Il classico calendario dell'avvento, costruito come un ancora più classico carosello. Ogni giorno si clicca e si trova qualcosa. Regali, sconti, e tutto quello che siamo riusciti a strappare ai nostri colleghi dell'area publishing, film e videogames. L'ho sviluppato usando Papervision. L'ottimizzazione è stata un'attività ostica come al solito. Qualsiasi cosa fai ed inevitabilmente fonderai la cpu del tuo computer. Alla fine però mi ritengo abbastanza soddisfatto del lavoro. Ovviamente i sorgenti delle classi principali sono a disposizione.
Vai al calendario

TESSILE OFFICINA - another job is over


Sfrutto ancora questo spazio per segnalare un altro lavoro concluso durante il mio tempo "libero". Questa volta si tratta di Tessile Officina, ovvero un laboratorio che produce tessuti unici di altissima qualità.
http://www.tessileofficina.it/
Questo progetto andrà ancora rimaneggiato e sistemato in alcune parti, ma nel complesso posso ritenermi soddisfatto. Le soluzioni tecniche più interessanti risiedono nel passaggio fra video secondari e video primario, il cui caricamento prosegue in ogni momento durante la visualizzazione del sito, la gallery abbastanza carina in cui ho imitato i movimenti meccanici del telaio, e il "layout liquido" su tutte le pagine, che m'è costato non poca fatica.
Dopo una lunghissima assenza su queste pagine, rieccomi a "spammare" l'ultima mia "fatica" per gli amici della Disney. Questa volta si tratta di una gallery avventurosa sviluppata per l'uscita di UP, il nuovo film Disney Pixar.

burloni, false notizie e mancate smentite.

Some days ago I got an interesting article. An older Nokia 1100 has been bought from hackers, because this telephone has the elusive ability to clone a SIM remotely, which were then used to steal bank codes TAN, (that’s sort of temporary password for access to current accounts). The news is that this phone was sold at $ 25,000, and… I already have this old phone, So that, I thought... bang!!! Now I sell it and I buy a car. Needless to say, the news is the newest hoax running on the web.
Here you can see something about...
Do you Remember I-Doser? The virtual sound drug? Obviously this was a hoax, but this hoax diddles our “Guardia di Finanza”, (the Italian customs officer)... really a bad impression for our police!!!
And what about Bonsai kittens? "Ok better don’t say more about ... Ah, the mobile phones that baked the popcorn ... Perhaps there is still someone that believe on this.
Maybe it works only with nokia 1100 ...
These stories are 'ridiculous', 'plausible and not', and sometimes harmless, but these stories are quite danger, however, that aura of non-official gives an irrational truth, as we see amateur video of phones cooking popcorn. It seems so amateur that it seems real. In addition to, the unofficial news may not match official denial, so credulous people will never understand.
Qualche giorno fa mi sono imbattuto in una notizia interessante. Ovvero che un vecchio modello di Nokia 1100 è diventato ricercatissimo da alcuni pirati informatici, per la fantomatica capacità di clonare SIM a distanza, che poi venivano usate per rubare i codici TAN bancari, sorta di password provvisorie per l'accesso ai conti correnti. La notizia sta nel fatto che il cellulare veniva venduto anche a 25.000 dollari, e dato che io possiedo proprio questo obsoleto telefonino ho pensato... che colpaccio adesso me lo vendo e mi compro una macchina. Inutile dire che la notizia è l'ennesima bufala che gira nel web.
eccola qua
Vi ricordate I-doser? Una fantomatica droga sonora virtuale su cui si erano pronunciate le più alte sfere della Guardia di Finanza, mettendoci in guardia dai terribili "toni binaurali"... Ovviamente anche questa era una bufala, il bello è che ci sono cascati anche i paladini dell'antifrode, -che figura da gonzi!-
Vogliamo parlare poi dei gatti in bottiglia? -Ma possiamo pure evitarlo...- Se per qualche assurda ragione non sapete di che parlo, andate a vedere qui.
Ah, già i telefonini che cuocevano i popcorn... Forse c'è ancora qualcuno che ci crede.
Forse funziona solo con i nokia 1100...
Ho visto che gli americani hanno trovato una parola anche per queste bufale, un po' ridicole, un po' innocue, un po' verosimili e un po' no, le chiamano HOAX.
Un pericolo queste notizie ce l'hanno però, ovvero che l'aura di non ufficialità della notizia ne conferisce una irrazionale veridicità; lo vediamo molto bene nei video dei telefonini col raggio della morte, e della cottura del popcorn. Sembrano così amatoriali che paiono veri. Inoltre a notizia non ufficiale non può corrispondere smentita ufficiale, quindi i creduloni, non avranno mai modo di ricredersi.

The 11Th Independent Games Festival

Ho sempre sognato di sviluppare un progetto di videogame indipendente; qualche anno fa ci ho anche provato...

Purtroppo la mia nazionalità e i miei limiti intellettivi mi hanno provvisoriamente lasciato al palo, e quando vedo che oltreoceano si possono realizzare idee innovative senza grosse risorse economiche non posso far altro che inchinarmi e dire:
-non credevo fosse possibile-

In Italia non c'è una comunità di sviluppatori indipendenti, né scuole o corsi, né un mercato locale... Ecco che ci si spiega perché i pochi sviluppatori italiani producono esclusivamente giochini per iPhone e iPod che distribuiscono con iTunes. Non vorrei generalizzare, perché qualche eccezione c'è, ad esempio all'IGN del 2008 c'era Bloody Monkey un gruppo di 3 ragazzi scoperto casualmente:

http://www.bloodymonkey.com/

Non li conosco ancora personalmente, ma mi piacerebbe allacciare un contatto.

Tornando al discorso iniziale, in America, qualche canale di promozione per gli sviluppatori indipendenti c'è; canale condiviso e sfruttato anche da società europee, ne ho scovata anche una di Zurigo, che sarebbe a due passi... Ma noi italiani siamo quasi assenti.

Già un mese si è concluso dall ultimo IGN (Independent Games Festival) 2009, il sito ufficiale della manifestazione è:

http://www.igf.com/

Ovviamente io non ero lì (a San Francisco), purtroppo, non so nulla della California, so solo che da lì arrivano un mucchio di nuove idee, e che la Silicon Valley, assomiglia alla nostra bigia Brianza, anzi, guardando le foto su Google Earth, assmomiglia ad una gigantesca Brianza nel cuore della Sicilia.

Il festival, prodotto da Game Developer magazine, Gamasutra.com e da Game Developers Conference, nasce nel 1998 per promuovere innovazione e per individuare e far incontrare i migliori game developers indipendenti.

I giochi, per quanto ho potuto vedere sono quasi tutti dei casualgame, realizzati da team ridottissimi, mediamente composti da 3-4 persone, dove elementi di innovazione, arte visionaria e nostalgia per gli albori dei videogames da "cassone" si fondono assieme in esperimenti, a volte interessanti.

Il gioco più carino su cui ho appena messo le mani si chiama Cortex Command scaricabile gratuitamente dal sito della Data Realms, società che lo sviluppa.

Ho appena iniziato a giocarci, e non c'ho capito quasi nulla, quindi, un commento sul gameplay, al momento è impossibile. La cosa che mi colpisce maggiormente è la resa della fisica 2D, che sembra influenzare tutto: proiettili, schizzi di sangue, fumo, polvere, sabbia, insomma qualsiasi cosa. Il tutto inserito in una grafica che ricorda un po' il mitico Metal Slug. In più c'è la promessa di avere uno scenario "fully destructible", così da realizzare quella catarsi che cerchiamo quando bestemmiamo su avventure o giochi nei quali è necessario risolvere rompicapi impossibili per aprire porte o passaggi bloccati. In Cortex Command, in queste situazioni sembra sufficiente usare missili più potenti di qualche megatone.

Qua sotto metto qualche animazione presa direttamente dal sito.







flash fader effect walk cycle (actionscript 3)

In the previous post, I showed you how to implement a simple fader effect... Playing around this I made another fun effect (and nothing else… It’s totally inuseful thing). It was also great understand that with actionscript 3 you can change the framerate at runtime! Anyway I used an old walk cycle that I drawn for a project I did in bsmart. As you can see, I also changed the trail effect by the speed of the guy…
Nello scorso post, vi ho fatto vedere qualcosa sulla classe bitmapData e sugli effetti di fader. Giochicchiando un po' ho partorito un'altra stupidaggine (ovviamente si tratta solo di un esercizio di stile totalmente inutile). Comunque mi è stato molto utile perchè ho scoperto che con actionscript 3 si possono modificare alcune proprietà globali come il "framerate" a runtime! Per fare questo esempio ho usato un vecchio ciclo di camminata che disegnai per un vecchio progetto ai tempi del mio lavoro in Bsmart, una società di e-learning per la quale ho lavorato qualche anno fa. Come si vede dall esempio, sopstando il mouse a destra e a sinistra si incrementa o decrementa la velocità dell'omino (framerate più veloce o lento) e si altera anche la scia prodotta.

Flash fader effect (actionscript 3)

Here another piece of code about a collection of fader effects.

It’s beautiful what we can do with filters and bitmapData class. A stupid animation can become deeper and immersive. I’ve to integrate something with music, like the Winamp AVS. I’m thinking about a QX game, using this two concepts… A sort of rhythm and game and arcade game… Bah... maybe in the future.
Ecco un altro po' di codice sugli effetti fader. È interessante come una semplice stupida animazione può guadagnare profondità, con un semplice effetto di questo tipo. Mi piacerebbe integrare qualcosa con la musica, tipo gli effetti del winamp. Mi piacerebbe realizzare un gioco tipo QX (chi se lo ricorda?), ma più incentrato sull'aspetto musicale. Quindi per poter giocare ad un gioco simile sarebbe utile soprattutto il senso del ritmo... boh, comunque vedremo.

Here a "Strar Wars" tribute:

package
{
  import flash.display.*;
  import flash.events.*;
  import flash.filters.*;
  import flash.geom.*;
  import flash.ui.*;
  import flash.utils.*;

  public class Plasma extends MovieClip
  {
      var canvas:Bitmap;
      var plasma:MovieClip;
      var fader:ColorChanger;
      var blurFilter:BlurFilter;
      var bkgd:BitmapData;

      public function Plasma() : void
      {
          bkgd = new BitmapData(1000, 900, true, 4278190080);
          canvas = new Bitmap(bkgd);
          plasma = new MovieClip();
          blurFilter = new BlurFilter(1, 2, 1);
          fader = new ColorChanger();
          fader.alpha = 1;
   fader.x = 500;
   fader.y = 350;
   fader.scaleX = fader.scaleY = .6
          addChild(plasma);
          plasma.addChild(canvas);
          plasma.addChild(fader);
          addEventListener(Event.ENTER_FRAME, activateVisual);
          return;
      }

      private function activateVisual(param1:Event) : void
      {
   fader.rotation+=.5
   bkgd.applyFilter(bkgd, bkgd.rect, new Point(0, 0), blurFilter);

          bkgd.draw(plasma);
  
          return;
      }
  }
}

Maybe it's better to speak English

I started some control on analytics, and I see that visitors that are coming on this blog aren’t Italians… Unfortunately I’m not a good English speaker, but I’ll try it! Maybe it can be also a good exercise. I don’t know if it can be useful, but I’ll try to translate the previous post too… hoping that someone all around the world will start reading this blog.

Gioco di Wall-e con box2d (wall-e game)

Hi, this is a Wall-e game. I started one year ago, and it was never completed.
As you can see a lot of buttons are disabled and it's graphically unfinished.
Anyway you can play using:
[space] to collect garbage.
[shift] to release compacted cubes.
Hoping that you enjoy this demo.
Ciao, questo è un giochino di Wall-e iniziato ormai quasi un anno fa e mai completato.
Infatti verdrete che molti bottoni sono disabilitati e la grafica è un po' approssimativa.
Comunque i controlli sono:
[spazio] per raccogliere i rifiuti.
[shift] per sganciare i cubi compattati.

Credo che questa sia l'unica informazione necessaria per poter giocare.

Concorso "destinazione Earth"


Ciao, questo è l'ultimo minisito su cui ho lavorato; così sono anche riuscito ad usare la terra rotante di cui avevo scritto.

Mappamondo

Semplice ma efficace, un mappamondo che al click slitta randomicamente dal Sahara a Cuba, passando per l'Italia, la Siberia, la Groenlandia, ecc...

burrattino con i fili sviluppato con box2d

Ecco l'ultima versione del burrattino con i fili... Come vedete dal braccino sinistro spastico, ci sono ancora diversi problemi relativi ai punti di registrazione. Spero di risolverli al più presto. Intanto guardate i fili che finalmente "fanno i fili".



E questa è una delle versioni che ho preparato per il sito Disney.it guarda l'animazione flash.

Un altro lavoretto extra sembra finito.



Non posso fare a meno di fare qualche piccolo lavoretto extra ogni tanto. Non riesco a spiegarmi il perché di questa cosa che per qualcuno può essere assimilata all'autolesionismo.

Io invece mi diverto, almeno nella fase iniziale, cioè quando devo definire il progetto, capire come fare il lavoro, affrontare subito le difficoltà più interessanti...

Ad un certo punto sopraggiungono i problemi più ostici... quali? Quelli grafico/puntigliosi - sposta quella freccia un pixel a destra, aggiungi un po' di blu, rendi la dissolvenza più fluida, non si può rallentare l'animazione di una frazione di secondo? E così via -. C'è da impazzire!

Comunque dato che questo blog è anche un portfolio delle mie realizzazioni, ecco l'ultima fatica:

Un video player a "mitragliatrice" (le interazioni su rollOver sono una poco felice scelta imposta dal committente) e un carosello per il sito Deagostini Edicola

Il sito è stato realizzato dalla società Exmachina s.r.l con cui ho collaborato realizzando questi due piccoli componenti.

problema: una corda non è un punzone

nell'articolo Digital Toys vi mostravo un giochino Flash "marionetta", in cui cercavo di simulare il comportamento di una marionetta.

Purtroppo come si vede il problema è che i fili si comportano un po' come dei punzoni, assolutamente rigidi.
Così ho deciso di sviluppare un componente corda.
C'ho perso un mare di tempo, ma alla fine, il lavoro sembra aver dato i suoi frutti. Ho anche aggiornato la versione della "sdk" sulla quale ho sviluppato tutti questi componenti. Si tratta di box2d, un motore fisico sviluppato da tale Erin Catto, un vero guru fra i programmatori. Il motore è programmato così bene che è stato possibile "portarlo" per una infinità di linguaggi, così non è difficile vedere giochi anche per iphone, nintendo ds, wii, ecc...

Digital Toys sviluppati con Box2d

Una parola che usano spesso quelli di Disney Online per descrivere tutte quelle piccole applicazioncine flash che appaiono un po' come giocattoli all'interno del sito. Ma forse di giocattolo c'è veramente poco... Ricordo quando da piccolo con mio fratello passavo giornate intere a costruire astronavi o robot usando le mollette come fossero costruzioni.
Io ho pensato di creare dei giocattolini che ammiccano ai giochi della realtà, quelli che i nostri figli forse non vedranno mai.

L system - Animazione

Ed ecco un'animazione completa. Un amico agronomo mi ha fatto notare che la forma dell'albero non può essere definita così meccanicamente.
Tanto per iniziare, come per ogni forma di vita, esistono delle fasi, (chissà com'è la pubertà dell'albero?).

L System (rappresentazioni grafiche)

Ecco alcune delle immagini ottenute:




Ed ecco la classe completa:


// Fern Fractal Nicola Sirago - an - Jim Bumgardner 2008 -port
package 
{
 import flash.geom.*;
 import GeomUtil;
 import flash.events.Event;
 import flash.display.DisplayObject;
 import flash.display.Sprite;

 public class FernSprite2 extends Sprite
 {
  var maxLevels:Number// = 6;
  var initBendAngle:Number// = 15;
  var initBranchAngle:Number// = 37;
  var trunkRatio:Number// = .1;
  var branchRatio:Number// = .4;
  var heightScale:Number// = 2.5;
  var regularity:Number// = 1;
  var offshoot:Number// = 1;
  
  public function FernSprite2(initObj)
  {
   maxLevels = initObj.maxLevels;
   initBendAngle = initObj.initBendAngle;
   initBranchAngle = initObj.initBranchAngle;
   trunkRatio = initObj.trunkRatio;
   branchRatio = initObj.branchRatio;
   heightScale = initObj.heightScale;
   regularity = initObj.regularity;
   offshoot = initObj.offshoot;
   initObj.parMC.addChild(this);
  }
  public function drawFern(p,a,rad,level)
  {
   var c:Point = new Point(p.x + Math.cos(a) * rad * trunkRatio, p.y + Math.sin(a) * rad * trunkRatio);
   p.height = Point.distance(new Point (p.x,p.y), c);
   p.width = (level + 1)*trunkRatio*30
   p.rotation = GeomUtil.radToGrad(a)-90;
   this.addChild(p);
   if (level > 0) {
    a += bendAngle;
    level--;
    var b1:ramo = new ramo;
    var b2:ramo = new ramo;
    var b3:ramo = new ramo;
    b1.x = b2.x = b3.x = c.x;
    b1.y = b2.y = b3.y = c.y;
    if(randRange(0,offshoot))
    drawFern(b1, a - branchAngle * randRange2(1, regularity), rad * branchRatio * randRange2(1, regularity), level);
    if(randRange(0,offshoot))
    drawFern(b2, a + branchAngle * randRange2(1, regularity), rad * branchRatio * randRange2(1, regularity), level);
    if(randRange(0,offshoot))
    drawFern(b3,a * randRange2(1, regularity),rad*antiTrunkRatio * randRange2(1, regularity),level);
   }else {
    var f:foglie = new foglie; 
    f.x = c.x;
    f.y = c.y;
   // f.rotation = p.rotation
    if(randRange(0,offshoot))
    this.addChild(f);
   }
  }
  public function redrawFern()
  {
   bendAngle = initBendAngle*Math.PI/180;
   branchAngle = initBranchAngle*Math.PI/180;
   lastMaxLevels = maxLevels;
   antiTrunkRatio = 1-trunkRatio;
   startAngle = -Math.PI/2;
   var b:t2 = new t2;
   drawFern(b, startAngle, heightScale, maxLevels);
  }
  public static function randRange(min:Number, max:Number):Number {
   var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
   return randomNum;
  }
  public static function randRange2(min:Number, max:Number):Number {
   if (min == max)
   return min
   var d = 0
   while (d == 0) { d = randRange( -1, 1) }
   var randomNum:Number =Math.abs( Math.random() * (max - min) + min * d);
   return randomNum;
  }
 }
}

Per modificare le texture basta modificare i disegni all'interno dei movieclip "ramo" e "foglie"

L system MovieClip texturization

Ora che abbiamo trovato l'algoritmo di base le variazioni possono essere infinite.
Con Flash ad esempio si può texturizzare il nostro albero come ci piace distorcendo delle figure ed adattandole alla nostra struttura.
Ho preparato un esempio per consentire a chiunque di inserire le proprie texture all'interno dell'albero.
public function drawFern(p,a,rad,level)
  {
   var c:Point = new Point(p.x + Math.cos(a) * rad * trunkRatio, p.y + Math.sin(a) * rad * trunkRatio);
   p.height = Point.distance(new Point (p.x,p.y), c);
   p.width = (level + 1)*trunkRatio*30
   p.rotation = GeomUtil.radToGrad(a)-90;
   this.addChild(p);
   if (level > 0) {
    a += bendAngle;
    level--;
    var b1:tronco = new tronco;
    var b2:tronco = new tronco;
    var b3:tronco = new tronco;
    b1.x = b2.x = b3.x = c.x;
    b1.y = b2.y = b3.y = c.y;
    drawFern(b1, a - branchAngle, rad * branchRatio, level);
    drawFern(b2, a + branchAngle, rad * branchRatio, level);
    drawFern(b3,a, rad*antiTrunkRatio, level);
   }else {
    var f:foglie = new foglie; 
    f.x = c.x;
    f.y = c.y;
    f.rotation = p.rotation
    this.addChild(f);
   }
  }
Questa volta gli input iniziali non sono le coordinate di un punto (px, py) ma un MovieClip.
Ora abbiamo 2 differenti texture (tronco, foglie).
A differenza del primo esempio, foglie viene posizionato solo quando la variabile level è scesa a zero, quindi nell'ultima recursione.
Inoltre ho inserito una funzione radToGrad, che effettua una conversione da radianti a gradi (non ho mai capito come mai la proprietà rotation si esprime in scomodissimi gradi.)
public static function radToGrad(rad:Number) {
   return rad/Math.PI*180;
  }
Domani cerco di postare la classe completa e qualche immagine di esempio.

Sempre su L system (Un po' di codice)

Ciao, dopo aver smanettato alla ricerca di un buon syntax highliter, ovvero di un programino che stampa codice come Dio comanda rieccomi a parlare di L system. Infatti dopo aver visto qualche fantastico esempio offerto dalle potenzialità di questo algoritmo, mi sono dato alla sperimentazione (più che altro grafica).
la funzione da cui sono partito scritta da Jim Bumgardner è la seguente:
function drawFern(px,py,a,rad,level)
  {
   var cx = px+Math.cos(a)*rad*trunkRatio;
   var cy = py+Math.sin(a)*rad*trunkRatio;
   lineTo(cx, cy);
   if (level > 0) {
    a += bendAngle;
    level--;
    drawFern(cx,cy,a-branchAngle,rad*branchRatio,level);
    moveTo(cx,cy);
    drawFern(cx,cy,a+branchAngle,rad*branchRatio,level);
    moveTo(cx,cy);
   }
  }

Con una sintassi semplificata il procedimento può anche essere scritto così:
R(i)     :  Livello del Ramo
t        :  trasla la fine del ramo
s        :  Scala 
r1,r2    :  ruota in senso orario e antiorario
R(i) = s(t[T(i-1)] r1[R(i-1)] r2[R(i-1)])

Purtroppo nel nostro caso non abbiamo un metodo dinamico basato sulla sostituzione, la struttura di base dell'albero è scolpita all'interno dell'applicazione.

A proposito dell'arte generativa e di L system

È da qualche giorno che mi sono perso dietro L system. Di che cosa sta parlando questo qua??? in questo sito è spiegato tutto molto meglio: http://www.johngrindall.com/maths/lsystems/index.php http://www.webfract.it/FRATTALI/lsystem.htm L systems è un algoritmo inventato da Lindenmayer per simulare la crescita di alcuni tipi di organismi. Reiterando e sostituendo delle coordinate, seguendo determinate regole è possibile creare figure veramente suggestive.
ecco un estratto estrapolato da uno dei siti citati:
FRATTALI CREATI CON LA TECNICA L - SYSTEM

L-System è l'acronimo di Lindenmayer-Systems, dal nome di Aristide Lindenmayer (1925-1989), un biologo olandese che per primo sviluppò la tecnica usata per generare questi frattali. Lo scopo di Lindenmayer era di riprodurre in modo virtuale la crescita di svariati tipi di organismi.

L-System non è perciò un tipo di frattale, ma è un metodo che permette di ritrovare i frattali, anche i più noti, come Koch, Sierpinski, alberi etc., che si possono costruire per altra via, purché lineare.

Il metodo adottato da Lindenmayer è molto suggestivo. Si parte da un disegno iniziale (che può essere, ad esempio, un segmento o anche una poligonale). Questo disegno viene riprodotto al computer usando delle regole ben precise:
Regola F
Avanzare di un segmento di lunghezza assegnata
Regola f
Avanzare di un segmento di lunghezza assegnata ma senza lasciare traccia
Regola +
Ruotare in senso antiorario di un angolo assegnato
Regola -
Ruotare in senso orario di un angolo assegnato

Ad esempio, per costruire il triangolo equilatero in figura, partendo dal vertice A, potremo dare le seguenti istruzioni: vai avanti di un segmento di lunghezza data (arriviamo in B), ruota in senso orario di 120°, vai avanti di un segmento di lunghezza data (arriviamo in C), ruota in senso orario di 120°, vai avanti di un segmento di lunghezza data (torniamo in A). Tradotte queste istruzioni nel nostro linguaggio, potremo scrivere: F-F-F

Ovviamente, affinché la procedura sia effettivamente eseguita da un computer, dovremo dare le istruzioni necessarie per eseguire una rotazione, e dovremo immettere come dati iniziali un valore per l'angolo (in questo caso 120°) e un valore per la lunghezza del segmento (in questo caso 90 pixel).

Fatte queste premesse, vediamo come si possa costruire un frattale.

La costruzione iniziale prende il nome di axiom (assioma). Sulla costruzione iniziale viene poi effettuata una sostituzione secondo una regola assegnata, si ripete il procedimento più volte... ed ecco il frattale!

Applichiamo il procedimento per costruire il frattale di Koch:

Dati iniziali:
angolo= 60°
lato= numero pixel prescelto (esempio: 900 pixel)
axiom: F
Viene tracciata una linea di lunghezza assegnata
Ripeti:
lato <-- lato/3 Il lato diventa un terzo del precedente
Sostituzione: F <-- F+F--F+F Sostituendo ad ogni F questa stringa,
il segmento viene sostituito
dalla spezzata
(Avanza, ruota di 60° in senso antiorario, avanza, ruota di 60° + 60° = 120° in senso orario, avanza, ruota di 60° in senso antiorario, avanza).
Fino a quando il lato diventa minore di un numero assegnato.

ephemeral swf