Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package mygame;
- import com.jme3.math.FastMath;
- import com.jme3.math.Quaternion;
- import com.jme3.math.Vector3f;
- public class Main {
- static class QV {
- float x, y, z, w;
- Vector3f v;
- public QV(Quaternion q, Vector3f v) {
- x = q.getX();
- y = q.getY();
- z = q.getZ();
- w = q.getW();
- this.v = v;
- }
- public void mult15(Vector3f store) {
- Vector3f v = this.v;
- float vx = y * v.z - z * v.y;
- float vy = z * v.x - x * v.z;
- float vz = x * v.y - y * v.x;
- vx += vx;
- vy += vy;
- vz += vz;
- store.x = v.x + w * vx + y * vz - z * vy;
- store.y = v.y + w * vy + z * vx - x * vz;
- store.z = v.z + w * vz + x * vy - y * vx;
- }
- public void mult60(Vector3f store) {
- Vector3f v = this.v;
- float vx = v.x, vy = v.y, vz = v.z;
- store.x = w * w * vx + 2 * y * w * vz - 2 * z * w * vy + x * x
- * vx + 2 * y * x * vy + 2 * z * x * vz - z * z * vx - y
- * y * vx;
- store.y = 2 * x * y * vx + y * y * vy + 2 * z * y * vz + 2 * w
- * z * vx - z * z * vy + w * w * vy - 2 * x * w * vz - x
- * x * vy;
- store.z = 2 * x * z * vx + 2 * y * z * vy + z * z * vz - 2 * w
- * y * vx - y * y * vz + 2 * w * x * vy - x * x * vz + w
- * w * vz;
- }
- }
- public static void main(String[] args) {
- Quaternion q = new Quaternion();
- Vector3f store = new Vector3f();
- int items = 100000;
- int tests = 1000;
- int reps = 100;
- QV[] qv = new QV[items];
- for (int i = 0; i < items; i++) {
- Vector3f v = new Vector3f();
- q.fromAngleNormalAxis(FastMath.PI * FastMath.nextRandomFloat(),
- new Vector3f(2 * FastMath.nextRandomFloat() - 1f,
- 2 * FastMath.nextRandomFloat() - 1f,
- 2 * FastMath.nextRandomFloat() - 1f).normalizeLocal());
- v.set(FastMath.nextRandomFloat() * 10000f,
- FastMath.nextRandomFloat() * 10000f,
- FastMath.nextRandomFloat() * 10000f);
- qv[i] = new QV(q, v);
- }
- float vx, vy, vz;
- float x, y, z, w;
- Vector3f a = new Vector3f();
- System.out.println("=== Test ===");
- System.out.println("items : " + items);
- System.out.println("test : " + tests);
- System.out.println("reps : " + reps + " * " + items * tests);
- System.out.println("CSV output style :");
- System.out.println("rep, mult15 nanoS, mult60 nanoS");
- //dry run
- for (int i = 0; i < items; i++) {
- qv[i].mult15(store);
- a.addLocal(store);
- }
- for (int i = 0; i < items; i++) {
- qv[i].mult60(store);
- a.addLocal(store);
- }
- //test
- long t0, t1, t2;
- for (int r = 0; r < reps; r++) {
- t0 = System.currentTimeMillis();
- for (int j = 0; j < tests; j++) {
- for (int i = 0; i < items; i++) {
- qv[i].mult15(store);
- // x = qv[i].x;y = qv[i].y;z = qv[i].z;w = qv[i].w;
- // Vector3f v = qv[i].v;
- // vx = y*v.z-z*v.y;
- // vy = z*v.x-x*v.z;
- // vz = x*v.y-y*v.x;
- // vx += vx; vy += vy; vz += vz;
- // store.x = v.x + w*vx + y*vz-z*vy;
- // store.y = v.y + w*vy + z*vx-x*vz;
- // store.z = v.z + w*vz + x*vy-y*vx;
- }
- }
- t1 = System.nanoTime();
- for (int j = 0; j < tests; j++) {
- for (int i = 0; i < items; i++) {
- qv[i].mult60(store);
- // x = qv[i].x;y = qv[i].y;z = qv[i].z;w = qv[i].w;
- // Vector3f v = qv[i].v;
- // vx = v.x; vy = v.y; vz = v.z;
- // store.x = w * w * vx + 2 * y * w * vz - 2 * z * w * vy + x * x
- // * vx + 2 * y * x * vy + 2 * z * x * vz - z * z * vx - y
- // * y * vx;
- // store.y = 2 * x * y * vx + y * y * vy + 2 * z * y * vz + 2 * w
- // * z * vx - z * z * vy + w * w * vy - 2 * x * w * vz - x
- // * x * vy;
- // store.z = 2 * x * z * vx + 2 * y * z * vy + z * z * vz - 2 * w
- // * y * vx - y * y * vz + 2 * w * x * vy - x * x * vz + w
- // * w * vz;
- }
- }
- t2 = System.nanoTime();
- System.out.println( r+1 + ", "+ (t1-t0) + ", " + (t2-t1));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement