Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 14-08-2004, 15:39   #1 (permalink)
_Thomas_
Gast
 
Beiträge: n/a
Question hex-werte mischen?

hallo

ich habe zum mischen von farben bisher immer den 'umweg' verwendet, die hex-codes der farben zunächst in ein rgb-objekt mit dezimalwerten umzuwandeln..kann ich mir das nicht unter umständen sparen und gleich mit den hex-werten rechnen?

ich komm irgendwie nicht ganz dahinter, wie ich die zahlen handeln soll..

gruß,
Tante Amanda
  Mit Zitat antworten
Alt 14-08-2004, 16:08   #2 (permalink)
All-rounder
 
Benutzerbild von thebiz
 
Registriert seit: Mar 2004
Ort: Bayerische Rhön
Beiträge: 2.507
Hi.
Ich kann es nicht 100% nachvollziehen.
Vielleicht helfen Dir aber folgenden Beispiele:

PHP-Code:
trace((0xff));
trace((0xff 0xff).toString(10));
trace((255).toString(16)); 
__________________

--------------------------------
Ich klicke, ergo bin ich. (me)
--------------------------------
thebiz ist offline   Mit Zitat antworten
Alt 14-08-2004, 16:38   #3 (permalink)
_Thomas_
Gast
 
Beiträge: n/a
hi thebiz..

mh nein..das hilft mir nicht wirklich weiter...

die farbe die ausgegeben wird, entspricht der angegeben mischung. was mich nur stört ist der umweg über die dezimalwerte..was ich eigentlich bräuchte, wäre ein beispiel bzw. ein gednklichen ansatz, wie ich für die hexadezimalwerte, sofern möglich, genau so ein mischungsverhältnis berechnen kann...

ActionScript:
  1. //// COLOR METHODS
  2. MovieClip.prototype.mixColor = function(b, m, p) {
  3.     var b = hex2rgb(b), m = hex2rgb(m), nrgb = {};
  4.     for (var n in b) {
  5.         nrgb[n] = b[n]+Math.round((m[n]-b[n])/100*p);
  6.     }
  7.     return rgb2hex(nrgb);
  8. };
  9. MovieClip.prototype.hex2rgb = function(h) {
  10.     return {r:h >> 16, g:h >> 8 & 255, b:h & 255};
  11. };
  12. MovieClip.prototype.rgb2hex = function(o) {
  13.     return (o.r << 16 | o.g << 8 | o.b);
  14. };
  15. ////
  16. trace(mixColor(0xFFFFFF, 0x0066BB, 10).toString(16));
  17. trace((0xffffff+Math.round((0x0066bb-0xffffff)/100*10)).toString(16)); // so gehts ja leider nicht :D
  18.  

gruß,
Tante Amanda
  Mit Zitat antworten
Alt 14-08-2004, 18:27   #4 (permalink)
All-rounder
 
Benutzerbild von thebiz
 
Registriert seit: Mar 2004
Ort: Bayerische Rhön
Beiträge: 2.507
Also man kann doch nicht Hexadezimal-Zahlen
druch Dezimal-Zahlen teilen und mal nehmen etc.

Man muss schon in einem Zahlensystem bleiben.
Also entweder alles nach Hexa oder alles nach Dezi
umwandeln um zu rechnen.
__________________

--------------------------------
Ich klicke, ergo bin ich. (me)
--------------------------------
thebiz ist offline   Mit Zitat antworten
Alt 14-08-2004, 23:40   #5 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
also! du möchtest vermutlich einfach die hex werte miteinander verrechnen,
ohne vorher die einzelnen bytes (r,g,b) aufzusplitten. das wird so AFAIK aber
nicht funktionieren, weill drei einzelne byte werte (FF, FF, FF) was anderes
sind als ein wert (FFFFFF). (die werte werden ja nur in einen integer
gapackt um speicherplatz zu sparen) für deinen farbmixer musst du also
erstmal jedes byte extrahieren und dann neu berechnen.

ich sehe da momentan die einzige möglichkeit alles in eine funktion zu
quetschen und so die funktionen, objekte und schleifen zu sparen (zu
lasten der modularität).

ich habe die funktionen mal ein bischen gebenchmarkt. meine funktion
ist etwas mehr als doppelt so schnell. wobei die zweite version nicht viel
zuwachs hat.

möglich das es noch irgendwelche rechentricks gibt um die berechnung zu
vereinfachen, aber mathe ist nicht mein ding.

achso hier nen netter link zu bitweisen operatoren:
http://www.gamedev.net/reference/art...rticle1563.asp

und ja ich hatte langeweile!

ActionScript:
  1. var time, res;
  2. var loops = 10000;
  3.  
  4. var one = 0xFFFFFF;
  5. var two = 0x0066bb;
  6.  
  7. function rasMixColor1(a, b, f){
  8.     var r1 = a >> 16 & 255;
  9.     var g1 = a >> 8 & 255;
  10.     var b1 = a & 255;
  11.     var r2 = b >> 16 & 255;
  12.     var g2 = b >> 8 & 255;
  13.     var b2 = b & 255;
  14.     var m = Math.round;
  15.    
  16.     var r3 = r1 + m( (r2 - r1) / 100*f );
  17.     var g3 = g1 + m( (g2 - g1) / 100*f );
  18.     var b3 = b1 + m( (b2 - b1) / 100*f );
  19.    
  20.     return (r3 << 16 | g3 << 8 | b3);
  21. }
  22. time = getTimer();
  23. for (var i = 0; i < loops; i++) res = rasMixColor1(one, two, 10).toString(16);
  24. time = getTimer() - time;
  25. trace('rasMixColor1: ' + res);
  26. trace('-- time needed: ' + time);
  27.  
  28. function rasMixColor2(a, b, f){
  29.     var r1 = a >> 16 & 255;
  30.     var g1 = a >> 8 & 255;
  31.     var b1 = a & 255;
  32.     var m = Math.round;
  33.    
  34.     return ((r1 + m( ((b >> 16 & 255) - r1) / 100*f )) << 16 |
  35.             (g1 + m( ((b >> 8 & 255) - g1) / 100*f )) << 8 |
  36.             (b1 + m( ((b & 255) - b1) / 100*f )));
  37. }
  38. time = getTimer();
  39. for (var i = 0; i < loops; i++) res = rasMixColor2(one, two, 10).toString(16);
  40. time = getTimer() - time;
  41. trace('rasMixColor2: ' + res);
  42. trace('-- time needed: ' + time);
  43.  
  44. MovieClip.prototype.mixColor = function(b, m, p) {
  45.     var b = hex2rgb(b), m = hex2rgb(m), nrgb = {};
  46.     for (var n in b) {
  47.         nrgb[n] = b[n]+Math.round((m[n]-b[n])/100*p);
  48.     }
  49.     return rgb2hex(nrgb);
  50. }
  51. MovieClip.prototype.hex2rgb = function(h) {
  52.     return {r:h >> 16, g:h >> 8 & 255, b:h & 255};
  53. }
  54. MovieClip.prototype.rgb2hex = function(o) {
  55.     return (o.r << 16 | o.g << 8 | o.b);
  56. }
  57. time = getTimer();
  58. for (var i = 0; i < loops; i++) res = mixColor(one, two, 10).toString(16);
  59. time = getTimer() - time;
  60. trace('Amandas - mixColor: ' + res );
  61. trace('-- time needed: ' + time.toString());

hier die zeiten. wenns um geschwindigkeit geht sollte man wirklich den
code extrem reduzieren. allerdings sollte man von lokalen variablen gebrauch
machen, weil der code übersichlicher wird und nicht wirklich viel performance
drauf geht.

Code:
// Ausgabe (10000 Loops):

rasMixColor1: e6f0f8
-- time needed: 972
rasMixColor2: e6f0f8
-- time needed: 961
Amandas - mixColor: e6f0f8
-- time needed: 2172
__________________
elias ist offline   Mit Zitat antworten
Alt 16-08-2004, 10:03   #6 (permalink)
_Thomas_
Gast
 
Beiträge: n/a


danke für die erläuterungen, binary blade..

mh...wenn ich im gleichen zahlensystem bleibe...wieso funktioniert das hier dann nicht..:

ActionScript:
  1. 0xffffff+Math.round((0x0066bb-0xffffff)/0x64)*0xa

die hexadezimalwerte werden hier ja sowieso als dezimalwerte ausgegeben, insofern sollte die rechnung ja in sich stimmig sein. oder hab ich jetzt einfach ein brett vor dem kopf...ich mein..eigentlich ist das ja so etwas wie ein term und die werte beliebig austauschbar, wenn ihr verhältnis zueinander gleich bleibt...

gruß,
Tante Amanda
  Mit Zitat antworten
Alt 16-08-2004, 10:53   #7 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
da mathe bei mir eher ausm bauch kommt habe ich mal ein bischen
rumprobiert. und es kam die erleuchtung.

ActionScript:
  1. //test 1
  2.  
  3. function rasMixColor1(a, b, f){
  4.     var r1 = a >> 16 & 255;
  5.     var g1 = a >> 8 & 255;
  6.     var b1 = a & 255;
  7.     var r2 = b >> 16 & 255;
  8.     var g2 = b >> 8 & 255;
  9.     var b2 = b & 255;
  10.     var m = Math.round;
  11.    
  12.     var r3 = r1 + m( (r2 - r1) / 100 * f );
  13.     var g3 = g1 + m( (g2 - g1) / 100 * f );
  14.     var b3 = b1 + m( (b2 - b1) / 100 * f );
  15.    
  16.     return (r3 << 16 | g3 << 8 | b3);
  17. }
  18.  
  19. trace(rasMixColor1(0xcccccc, 0xaaaaaa, 10)); //13224393
  20. trace(
  21.      0xcccccc + Math.round( (0xaaaaaa - 0xcccccc) / 100 * 10 )
  22.       );
  23. var a = 0xcc + Math.round( (0xaa - 0xcc) / 100 * 10 )
  24. trace((a << 16 | a << 8 | a));
  25.  
  26. /*
  27. rasMixColor1(0xcccccc, 0xaaaaaa, 10) = 13224393
  28. ganze hex = 13198076
  29. hex einzeln = 13224393
  30. */
  31.  
  32.  
  33. //test 2
  34. function rasMixColor1(a, b, f){
  35.     var r1 = a >> 16 & 255;
  36.     var g1 = a >> 8 & 255;
  37.     var b1 = a & 255;
  38.     var r2 = b >> 16 & 255;
  39.     var g2 = b >> 8 & 255;
  40.     var b2 = b & 255;
  41.     var m = Math.round;
  42.    
  43.     var r3 = r1 + m( (r2 - r1)  );
  44.     var g3 = g1 + m( (g2 - g1)  );
  45.     var b3 = b1 + m( (b2 - b1)  );
  46.    
  47.     return (r3 << 16 | g3 << 8 | b3);
  48. }
  49.  
  50. trace(rasMixColor1(0xcccccc, 0xaaaaaa, 10)); //13224393
  51. trace(
  52.      0xcccccc + Math.round( (0xaaaaaa - 0xcccccc)  )
  53.       );
  54. var a = 0xcc + Math.round( (0xaa - 0xcc) )
  55. trace((a << 16 | a << 8 | a));
  56.  
  57. /*
  58. rasMixColor1(0xcccccc, 0xaaaaaa, 10) = 11184810
  59. ganze hex = 11184810
  60. hex einzeln = 11184810
  61. */

also eigentlich ganz simpel. es liegt daran das das dividieren oder
multiplizieren mit einzelnen bytes (0xff/100*10)andere werte hervorbring als
mit den drei bytes (0xffffff/100*10).
__________________
elias ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:12 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele