Mapping coordinates from one range to another in ActionScript 3.0

I am very fond of Processing, and the way it easily makes it possible to experiment with design ideas. One of the powerful features are it’s map() function, that takes a value and remaps it from one range to another. I haven’t seen a similar function in the ActionScript 3.0 reference, so I decided to make one to my own utils-library, because it is something the can come in handy in many situations. First I looked at using the Point() class, and interpolation to describe the ratios, but actually found it easier to just do it with regular math.

I haven’t looked at performance yet, and there is possibly a lot of ways to optimize this code – this article can be a start for further fine tuning. The helper function looks like this:

function map(val:Number, inMin:Number, inMax:Number, outMin:Number, outMax:Number, decimals:uint=0):Number
{
var returnVal:Number;
 
// Sets the total range for both in and out
var inRange:Number = inMax - inMin;
var outRange:Number = outMax - outMin;
 
//calculates the ratio for the value in relation to the in range
var ratio:Number = (val - inMin)/inRange;
//makes sure that the value is within range
val = Math.max(inMin, val);
val = Math.min(inMax, val);
//Finds the same ratio in the out range and shift it into place
returnVal = (outRange * ratio) + outMin;
 
//rounding of the decimals
var factor:int = Math.pow(10,decimals);
returnVal = Math.round(returnVal*factor)/factor;
 
return returnVal;
}

The function takes the the following arguments:

  • val: the number to be remapped
  • inMin and inMax: The original range, in which the value is measures in relation to.
  • outMin and outMax: The destination range, that the value will be re-mapped to
  • decimals: sets the precision in decimals (optional)
First it calculates the ranges with
var inRange:Number = inMax - inMin;
var outRange:Number = outMax - outMin;
These variables are defining the total range for both the incoming number, and the range of number is eventually will be placed within.
val = Math.max(inMin, val);
val = Math.min(inMax, val);
In this function I have decided to make sure, that the value is within the boundaries of the inRange. If i took the value 4, and sets the range of number to be within 10 and 100, I would get some unexpected results. You could treat this differently, or even make it possible by omitting these lines.
var ratio:Number = (val - inMin)/inRange;
ratio holds a number between 0 and 1 that defines where in the original range it is located. The closer to zero it gets, the lower the value – closer to one goes towards inMax.
returnVal = (outRange * ratio) + outMin;
Then the number is multiplied to the outRange to find the same relative point in the target range, and finally shifted into place by adding the outMin value. Negative values are treated fine in these ranges – when you add -200 to something, it is actually subtracted from the number.
var factor:int = Math.pow(10,decimals);
returnVal = Math.round(returnVal*factor)/factor;
The last part of the function is meant to round of the values. For performance, this could easily be removed, but it may be useful in some cases to have odd long numbers rounded and presented with only a few digits precition. First, the variable factor holds the value to be used in the rounding proces. For 1 digit it should be “10″, 2 digits is “100″, 3 is “1000″ and so forth. That value is used in the line below, where it first multiplies the final value by the factor and then rounds it to an integer. Then it divides with the factor again. It goes something like this:
  1. factor is 1000 (3 digits)
  2. value is 134.744637
  3. Multiplication results in 134744.637
  4. Rounding returns 134745
  5. divided by 1000 gives the result 134.745
Finally the value is returned as a Number.

Optimization

There are a lot of code shortening, that can produce a speed improvement. You could also work with int or uint exclusively to gain some performance i suppose. Finally, you can remove the decimals and the lines that check if the number is in range. I have left the to show what functionality that could come in handy.

An example

As a practical example of the map() function you can  copy the following code into a Flash document. Here the map() fuction is directly inside the main code, but you could start building your own utils-library with the helper functions as public static function for easier access.
The code draws two squares with different sizes. When the mouse moves over the small square, it draw lines in the larger square, while maintaining the relative coordinates inside the squares.
import flash.display.Sprite;
import flash.events.MouseEvent;
 
//make the small square and color it dark grey
var inArea:Sprite = new Sprite();
inArea.graphics.beginFill(0x333333);
inArea.graphics.drawRect(0,0,100, 100);
inArea.graphics.endFill();
addChild(inArea);
 
//make the large square and color it black
var outArea:Sprite = new Sprite();
outArea.graphics.beginFill(0x000000);
outArea.graphics.drawRect(0,0,400,400);
outArea.graphics.endFill();
outArea.graphics.lineStyle(1, 0xFFFFFF, 0.3);
addChild(outArea);
outArea.x = inArea.width;
 
//adds a listener for the small square, that listens for mouse movement
inArea.addEventListener(MouseEvent.MOUSE_MOVE, updateDrawing, false, 0, true);
function updateDrawing(event:MouseEvent):void
{
	//Map the local coordinates from the mouse movement to the size of the large square
	var targetX:int = map(event.localX, 0, event.target.width, 0, outArea.width);
	var targetY:int = map(event.localY, 0, event.target.height, 0, outArea.height);
 
	//Draws the line in the large square.
	outArea.graphics.lineTo(targetX, targetY);
}
 
//Helper function
function map(val:Number, inMin:Number, inMax:Number, outMin:Number, outMax:Number, decimals:uint=0):Number
{
	var returnVal:Number;
	// Sets the total range for both in and out
	var inRange:Number = inMax - inMin;
	var outRange:Number = outMax - outMin;
 
	//makes sure that the value is within range
	val = Math.max(inMin,val);
	val = Math.min(inMax,val);
 
	//calculates the ratio for the value in relation to the in range
	var ratio:Number = (val - inMin) / inRange;
 
	//Finds the same ratio in the out range and shift it into place
	returnVal = (outRange * ratio) + outMin;
 
	//rounding of the decimals
	var factor:int = Math.pow(10,decimals);
	returnVal = Math.round(returnVal*factor)/factor;
 
	return returnVal;
}

Calling a function dynamically in ActionScript 3.0

Have you ever wondered, how you could use a String to decide, which function to be called. You could go so far to let the user enter the function name in an input field and call a function by that name, if it exists.

I have made a short article with an example on how that is done in Flash and ActionScript 3.0. You can read the article at http://www.hjaelpmignu.dk/content/dynamic-call-functions

Apple bøjer sig for presset … måske.

En “hvad sagde jeg oplevelse” kom til mig her til formiddag efter at have læst Apples statement fra igår. De meget omtalte section 3.3.1 og 3.3.2 fra deres “Review Guidelines” bliver lempet igen, så du nu kan bruge 3de parts programmer til at udvikle til iPhone og iPad. Hvem husker ikke den dag i starten af april, hvor Apple bekendtgjorde følgende:

3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).

Dette fjernede effektivt muligheden for at andre værktøjer end C-familiens udviklingsværktøjer, med direkte tilgang til en provisioning profile, at kunne indsende applikationer til godkendelse. Det er nu ændret tilbage til den “gode gamle”:

3.3.1 Applications may only use Documented APIs in the manner prescribed by Apple and
must not use or call any private APIs.

Rygter og udmeldinger om dispensation fra enkelte udbydere og problemer med større spilfirmaer, der ikke kunne leve op til aftalen, fik beslutningen til at ryste lidt fra starten af. Større udviklere valgte også at forlade platformen, hvilket ikke bidrog til fornuften i ændringen. I den nylige, men hurtigt udbredte Android-platform var den forrige stramning et lock-in forsøg på udviklere for at “tvinge” dem til at bruge x-code til at udvikle på. Var det lykkedes havde det også været en god strategi. IPhone var blevet den altdominerende platform og alle udviklere sad på en Mac og skrev Objective-C. Verden udviklede sig dog lidt anderledes, og Android har sendt iPhones markedsandel ned på en fjerde plads i 2Q 2010. Set i lyset af and Symbian og RIM er et lidt andet segment, og Android og iPhone er de eneste (eller vigtigste) kombetanter, er det selvfølgelig en interessant drejning.

En yderligere problematisering er, at der er mange producenter af Android telefoner og tablets, og nogle overgår iPhone/iPad i specs. Dette gør valget af telefon mere bred og andre parametre end “iPhone vs. skodPhone” kommer i spil. Udviklere vil helst være på den platform som der er flest brugere til, og så brede sig ud og supportere andre platforme, efterhånden som der er økonomi.

Som tingene har været ind til nu, har man haft et relativt isoleret udviklingsmiljø til iPhone/iPad og et andet til Android-platformen. Nu hvor restriktionerne forsvinder er der mulighed for at der kan laves en fælles platform, der virker hen over platformene. I en lykkelig verden kan man udvikle til mobile enheder og håndtere, hvilken enhed der er tale om i distributionen … der er lang vej endnu, men vi er på vej :-)

Adobe, der med Flash CS5 leverede et værktøj til at kompilere Flash-dokumenter til iPhone er selvfølgelig mere end normalt begejstret for denne nyhed. Som det står i deres blog har de allerede hørt om udviklere, der har fået applikationer godkendt.

Det er dog vigtigt at pointere at det stadig ikke er muligt at se swf-filer i Safari-browseren på iPhone. Skyfire, prøver at få en browser igennem, der kan vise flash-video, men ingen reelle forsøg på at få Flash Player 10.1 til iPhone endnu. Sålænge Apple ikke står på denne liste, eller i hvertfald forholder sig til den, kommer det nok heller ikke til at ske. Et andet alternativ er at iPhone for en markant mindre markedsandel, hvilket vil gøre at de må trække yderligere i land – det kan kun fremtiden vise.

Indtil da må vi glæde os over at knappen i Flash CS5 der opretter et iPhone projekt, nu rent faktisk vil kunne få pustet liv i sig, når den bliver sendt til App Store. Det bliver en spændende tid, nu hvor Adobe aktivt vil udvikle mod iPhone-platformen igen.

Learning ActionScript 3.0 – A Beginner’s Guide : Boganmeldelse

Learning ActionScript 3.0 - A Beginner's Guide

Titel: Learning ActionScript 3.0 – A Beginner’s Guide

Sider: 363

Forfatter: Rich Shupe, Zevan Rosser

Udgiver: O’Reilly

Genre: ActionScript 3.0

ISBN:
ISBN-10: 0-596-52787-X
ISBN-13: 978-0-596-52787-7

Introduktion

Jeg har læst mange bøger om ActionScript 3.0, men det er sjældent at jeg er blevet så fanget af en bog som jeg er blevet af Learning ActionScript 3.0 – A Beginner’s Guide. Der er flere grunde til at jeg har lyst til at fremhæve den, og give den topkarakter.

Farver og linjer

Jeps, En ActionScript bog i farver. Jeg har egentlig aldrig rigtig tænkt over, hvor meget det forbedrer læsevenligheden – det er ret vildt. Al koden er skrevet i farver som du genkender fra Flash. Derudover er linjerne nummereret, hvilket gør det uhyre nemt at overskue længere kodestumper. De steder i bogen hvor koden bygges op lidt ad gangen er det også nemt at orientere sig i forhold til de brudstykker der bliver pillet ud og forklaret.

For børn i alle aldre

Du må ikke lade dig narre af titlen: “A Beginner’s Guide” for der er sandelig rigtig meget at komme efter for en trænet udvikler. Der er nok af små fif i de senere kapitler, og måder forfatterne forklarer det på, til at alle føler der er gods i bogen. Nogen vil måske mene at der er så meget i bogen at begyndere bliver hægtet af til sidst.

Sproget er vigtigt

Bogen er uhyre velskrevet. Der bliver brugt lange afsnit på forklaringer om begreber, metoder og egenskaber. Hvor mange andre ActionScript bøger fokuserer meget på at vise en masse kode, kan der her nemt tages et opslag eller to fra, til at forklare om principperne i det som koden udfører.

Billeder, Illustrationer osv

Der er rigtig mange illustrationer. Ikke kun skærmdumps af Flash, eller resultatet af din kode, men også gedigen infografik, der viser principperne i noget af den matematik e. lign. du skal arbejde med.

Indhold

Hvad skriver de så om, i bogen? De dækker faktisk et meget bredt område. Uden at gå for meget i kapitel tilstand kan jeg dele det lidt op i faser:

Overblik

Den starter med et dybdegående overblik over Flash Platformen, hvad det betyder og hvilke programmer der leverer til den. Den gennemgår derefter forskellene i procedural- og Object-Orientered programming. Når alt det indledende er på plads løber den en 40 sider igennem med variabler, funktioner, klasser osv – der er fart på, så hvis man er helt ny er det vigtigt at man “tygger maden godt her” og prøver de ting der er beskrevet.

Display List

Ingen ActionScript-bog uden en god gennemgang af display listen – et problem de fleste ridligere bruger bøvler med. Her gennemgås hvordan man tilføjer- eller fjerner objekter, bytter rundt på dem osv. Der kommer også et OOP afsnit, der fortæller om Classes, Inheritance, Composition og et par andre relevante Design Patterns.

Bevægelse og tegning

Efter man har læst de første 100 sider, skulle man allerede være ret habil i forhold til sproget. Nu begynder nogle af koncepterne at udfolde sig i programmeret bevægelse og partikelsystemer. Endelig bliver Graphics-klassen gennemgået og du bliver præsenteret for nogle meget tunge emner som matricer og trigonometri (Arrgh) :-)

Der er også afsat god plads til at forstå hvordan Flash arbejder med pixels. Du gennemgår BitmapData, Blend Modes, filtre og Color Effects, og her (200 sider inde) burde din hjerne sprudle af idéer til, hvordan den nyvundne viden kan udnyttes i praksis.

Tekst

I en særskilt sektion bliver teksten behandlet. Bogen går godt i dybden med forklaringerne når det kommer til at oprette tekstfelter, redigere dem, indlejre fonte og tilknytte CSS. Der bliver også taget fat på, hvordan HTML arbejder inde i flash og hvilke muligheder du har for at kalde ActionScript fra HTML.

Lyd og video

Næsten til slut, tages der hul på behandlingen af video og lyd. Du lærer at hente ID3 data fra musik. Visualisere waveforms, arbejde med webcam og mikrofon, streame lyd og video osv. osv. Her skal du virkelig have ørene ind til hovedet for at følge med.

Input/Output

Til allersidst tages der hul på mulighederne for at hente data ind i flash. Det har været gennemgået sporadisk tidligere, men nu bliver der taget fat om nældens rod og du bliver trukket godt rundt til de forskellige emner der normalt hentes (text, video, billede, swf og lyd). Derefter er et helt kapitel tilegnet XML og E4X. For en Flashudvikler, -designer er det et must at kunne håndtere XML, og dette kapitel ruster dig rigtig godt til at løfte opgaven.

Ressourcer

Sidst i bogen er der en beskrivelse af nogle metoder til at gribe et flash-projekt an på og en række referencer til ressourcer, blogs osv.

Afslutning

Slap af, Karsten. Du får penge for det. Niks – ikke i dette tilfælde i hvertfald. Jeg synes denne her bog er så god at jeg vil sige det til alle der gider at høre på det. Den gennemgår så mange teknikker (mange som jeg ikke kendte) og forklarer det på en måde som jeg i hvertfald synes gør den let fordøjelig.

Held og lykke med den, hvis I anskaffer jer den. Skriv gerne kommentarer hvis i har læst den, eller vil høre om den tager bestemte emner op.

Med venlig hilsen
Karsten Vestergaard (ockley)

Adobe Community Expert listen har fået et nyt medlem

Jeg blev lige mindet om på http://blog.petermolgaard.com/2008/08 … rt-list-has-been-updated/ at listen med medlemmer af Adobe Community Experts er blevet opdateret. I den forbindelse er det nok på sin plads og nævne, at jeg er blevet én af dem. Du kan se listen her – hvor jeg står under Vestergaard, Karsten (Jeps, det er mig) :-)

Med fokus på “Interactive Experiences” og tilhørende programmer (Photoshop, Illustrator, Flash, Dreamweaver og InDesign) er mit job, som medlem, at drive og levere undervisning og forum hjælp af høj kvalitet, samt levere artikler og foredrag rundt om i landet/verden.

Jeg takker for tilliden, Adobe, og smøger ærmerne op.

I samme åndedrag, skal der også lyde et tillykke til Peter Mølgaard og Asger “Flashger” Lauersen, der begge har opnået samme status i henholdsvis Flex og Flash.

/ockley