I habe 27 Kombinationen von 3 Werten von -1 bis 1 vom Typ:wie 27 vector3 in einen 0-256 Wert zu kodieren?
Vector3(0,0,0);
Vector3(-1,0,0);
Vector3(0,-1,0);
Vector3(0,0,-1);
Vector3(-1,-1,0);
... up to
Vector3(0,1,1);
Vector3(1,1,1);
Ich brauche sie zu und von einer 8-Bit-sbyte/Byte-Array zu konvertieren.
Eine Lösung ist die erste Ziffer zu sagen, von der 256 = X die zweite Ziffer ist Y und die dritte ist Z ...
so
Vector3(-1,1,1) becomes 022,
Vector3(1,-1,-1) becomes 200,
Vector3(1,0,1) becomes 212...
Ich würde es vorziehen, es zu codieren in einer kompakteren Weise, vielleicht mit Bytes (worüber ich keine Ahnung habe), weil die obige Lösung viele Multiplikationen und runde Funktionen zum Decodieren verwendet, haben Sie bitte einige Vorschläge? Die andere Möglichkeit ist 27 zu schreiben, wenn die Bedingungen zum Schreiben der Vector3-Kombination in ein Array ineffizient erscheinen.
Dank Böse Tak für die Führung, änderte ich den Code ein bisschen 0-1 Werte auf das erste Bit hinzuzufügen, und es für unity3d anzupassen:
function Pack4(x:int,y:int,z:int,w:int):sbyte {
var b: sbyte = 0;
b |= (x + 1) << 6;
b |= (y + 1) << 4;
b |= (z + 1) << 2;
b |= (w + 1);
return b;
}
function unPack4(b:sbyte):Vector4 {
var v : Vector4;
v.x = ((b & 0xC0) >> 6) - 1; //0xC0 == 1100 0000
v.y = ((b & 0x30) >> 4) - 1; // 0x30 == 0011 0000
v.z = ((b & 0xC) >> 2) - 1; // 0xC == 0000 1100
v.w = (b & 0x3) - 1; // 0x3 == 0000 0011
return v;
}
sehr cool, danke, es ist sehr schwierig ohne fundierte Kenntnisse des Themas. Ich habe den Code ein wenig für vector4 mit xyzw geändert. –
ok ich hatte einen fehler um die vec4-version zu konvertieren und ich reparierte es, prost. –
@komprehensible: etwas schneller mit '(v.x << 4) + (v.y << 2) + v.z + 21'. –