Skip to content

Commit

Permalink
Optimize various things (#334)
Browse files Browse the repository at this point in the history
Optimizations:
- Math.PI + Math.PI -> Math.PI_TIMES_2
- multiply with inverse numbers instead of dividing (excl. single-use scenarios)
- move some calculations outside of loops
  • Loading branch information
0x000006 committed Jun 22, 2024
1 parent 0f66b42 commit b36a5cc
Show file tree
Hide file tree
Showing 12 changed files with 250 additions and 197 deletions.
135 changes: 75 additions & 60 deletions src/main/java/org/joml/AxisAngle4d.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public AxisAngle4d(AxisAngle4d a) {
x = a.x;
y = a.y;
z = a.z;
angle = (a.angle < 0.0 ? Math.PI + Math.PI + a.angle % (Math.PI + Math.PI) : a.angle) % (Math.PI + Math.PI);
angle = (a.angle < 0.0 ? Math.PI_TIMES_2 + a.angle % Math.PI_TIMES_2 : a.angle) % Math.PI_TIMES_2;
}

/**
Expand All @@ -89,7 +89,7 @@ public AxisAngle4d(AxisAngle4f a) {
x = a.x;
y = a.y;
z = a.z;
angle = (a.angle < 0.0 ? Math.PI + Math.PI + a.angle % (Math.PI + Math.PI) : a.angle) % (Math.PI + Math.PI);
angle = (a.angle < 0.0 ? Math.PI_TIMES_2 + a.angle % Math.PI_TIMES_2 : a.angle) % Math.PI_TIMES_2;
}

/**
Expand Down Expand Up @@ -158,7 +158,7 @@ public AxisAngle4d(double angle, double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
this.angle = (angle < 0.0 ? Math.PI + Math.PI + angle % (Math.PI + Math.PI) : angle) % (Math.PI + Math.PI);
this.angle = (angle < 0.0 ? Math.PI_TIMES_2 + angle % Math.PI_TIMES_2 : angle) % Math.PI_TIMES_2;
}

/**
Expand Down Expand Up @@ -192,7 +192,7 @@ public AxisAngle4d set(AxisAngle4d a) {
x = a.x;
y = a.y;
z = a.z;
angle = (a.angle < 0.0 ? Math.PI + Math.PI + a.angle % (Math.PI + Math.PI) : a.angle) % (Math.PI + Math.PI);
angle = (a.angle < 0.0 ? Math.PI_TIMES_2 + a.angle % Math.PI_TIMES_2 : a.angle) % Math.PI_TIMES_2;
return this;
}

Expand All @@ -207,7 +207,7 @@ public AxisAngle4d set(AxisAngle4f a) {
x = a.x;
y = a.y;
z = a.z;
angle = (a.angle < 0.0 ? Math.PI + Math.PI + a.angle % (Math.PI + Math.PI) : a.angle) % (Math.PI + Math.PI);
angle = (a.angle < 0.0 ? Math.PI_TIMES_2 + a.angle % Math.PI_TIMES_2 : a.angle) % Math.PI_TIMES_2;
return this;
}

Expand All @@ -228,7 +228,7 @@ public AxisAngle4d set(double angle, double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
this.angle = (angle < 0.0 ? Math.PI + Math.PI + angle % (Math.PI + Math.PI) : angle) % (Math.PI + Math.PI);
this.angle = (angle < 0.0 ? Math.PI_TIMES_2 + angle % Math.PI_TIMES_2 : angle) % Math.PI_TIMES_2;
return this;
}

Expand Down Expand Up @@ -345,24 +345,27 @@ public AxisAngle4d set(Matrix3fc m) {
double yz = (nm21 + nm12) / 4;
if ((xx > yy) && (xx > zz)) {
x = Math.sqrt(xx);
y = xy / x;
z = xz / x;
double invX = 1.0 / x;
y = xy * invX;
z = xz * invX;
} else if (yy > zz) {
y = Math.sqrt(yy);
x = xy / y;
z = yz / y;
double invY = 1.0 / y;
x = xy * invY;
z = yz * invY;
} else {
z = Math.sqrt(zz);
x = xz / z;
y = yz / z;
double invZ = 1.0 / z;
x = xz * invZ;
y = yz * invZ;
}
return this;
}
double s = Math.sqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
double s = Math.invsqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
angle = Math.safeAcos((nm00 + nm11 + nm22 - 1) / 2);
x = (nm12 - nm21) / s;
y = (nm20 - nm02) / s;
z = (nm01 - nm10) / s;
x = (nm12 - nm21) * s;
y = (nm20 - nm02) * s;
z = (nm01 - nm10) * s;
return this;
}

Expand Down Expand Up @@ -405,24 +408,27 @@ public AxisAngle4d set(Matrix3dc m) {
double yz = (nm21 + nm12) / 4;
if ((xx > yy) && (xx > zz)) {
x = Math.sqrt(xx);
y = xy / x;
z = xz / x;
double invX = 1.0 / x;
y = xy * invX;
z = xz * invX;
} else if (yy > zz) {
y = Math.sqrt(yy);
x = xy / y;
z = yz / y;
double invY = 1.0 / y;
x = xy * invY;
z = yz * invY;
} else {
z = Math.sqrt(zz);
x = xz / z;
y = yz / z;
double invZ = 1.0 / z;
x = xz * invZ;
y = yz * invZ;
}
return this;
}
double s = Math.sqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
double s = Math.invsqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
angle = Math.safeAcos((nm00 + nm11 + nm22 - 1) / 2);
x = (nm12 - nm21) / s;
y = (nm20 - nm02) / s;
z = (nm01 - nm10) / s;
x = (nm12 - nm21) * s;
y = (nm20 - nm02) * s;
z = (nm01 - nm10) * s;
return this;
}

Expand Down Expand Up @@ -465,24 +471,27 @@ public AxisAngle4d set(Matrix4fc m) {
double yz = (nm21 + nm12) / 4;
if ((xx > yy) && (xx > zz)) {
x = Math.sqrt(xx);
y = xy / x;
z = xz / x;
double invX = 1.0 / x;
y = xy * invX;
z = xz * invX;
} else if (yy > zz) {
y = Math.sqrt(yy);
x = xy / y;
z = yz / y;
double invY = 1.0 / y;
x = xy * invY;
z = yz * invY;
} else {
z = Math.sqrt(zz);
x = xz / z;
y = yz / z;
double invZ = 1.0 / z;
x = xz * invZ;
y = yz * invZ;
}
return this;
}
double s = Math.sqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
double s = Math.invsqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
angle = Math.safeAcos((nm00 + nm11 + nm22 - 1) / 2);
x = (nm12 - nm21) / s;
y = (nm20 - nm02) / s;
z = (nm01 - nm10) / s;
x = (nm12 - nm21) * s;
y = (nm20 - nm02) * s;
z = (nm01 - nm10) * s;
return this;
}

Expand Down Expand Up @@ -525,24 +534,27 @@ public AxisAngle4d set(Matrix4x3fc m) {
double yz = (nm21 + nm12) / 4;
if ((xx > yy) && (xx > zz)) {
x = Math.sqrt(xx);
y = xy / x;
z = xz / x;
double invX = 1.0 / x;
y = xy * invX;
z = xz * invX;
} else if (yy > zz) {
y = Math.sqrt(yy);
x = xy / y;
z = yz / y;
double invY = 1.0 / y;
x = xy * invY;
z = yz * invY;
} else {
z = Math.sqrt(zz);
x = xz / z;
y = yz / z;
double invZ = 1.0 / z;
x = xz * invZ;
y = yz * invZ;
}
return this;
}
double s = Math.sqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
double s = Math.invsqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
angle = Math.safeAcos((nm00 + nm11 + nm22 - 1) / 2);
x = (nm12 - nm21) / s;
y = (nm20 - nm02) / s;
z = (nm01 - nm10) / s;
x = (nm12 - nm21) * s;
y = (nm20 - nm02) * s;
z = (nm01 - nm10) * s;
return this;
}

Expand Down Expand Up @@ -585,24 +597,27 @@ public AxisAngle4d set(Matrix4dc m) {
double yz = (nm21 + nm12) / 4;
if ((xx > yy) && (xx > zz)) {
x = Math.sqrt(xx);
y = xy / x;
z = xz / x;
double invX = 1.0 / x;
y = xy * invX;
z = xz * invX;
} else if (yy > zz) {
y = Math.sqrt(yy);
x = xy / y;
z = yz / y;
double invY = 1.0 / y;
x = xy * invY;
z = yz * invY;
} else {
z = Math.sqrt(zz);
x = xz / z;
y = yz / z;
double invZ = 1.0 / z;
x = xz * invZ;
y = yz * invZ;
}
return this;
}
double s = Math.sqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
double s = Math.invsqrt((nm12 - nm21) * (nm12 - nm21) + (nm20 - nm02) * (nm20 - nm02) + (nm01 - nm10) * (nm01 - nm10));
angle = Math.safeAcos((nm00 + nm11 + nm22 - 1) / 2);
x = (nm12 - nm21) / s;
y = (nm20 - nm02) / s;
z = (nm01 - nm10) / s;
x = (nm12 - nm21) * s;
y = (nm20 - nm02) * s;
z = (nm01 - nm10) * s;
return this;
}

Expand Down Expand Up @@ -744,7 +759,7 @@ public AxisAngle4d normalize() {
*/
public AxisAngle4d rotate(double ang) {
angle += ang;
angle = (angle < 0.0 ? Math.PI + Math.PI + angle % (Math.PI + Math.PI) : angle) % (Math.PI + Math.PI);
angle = (angle < 0.0 ? Math.PI_TIMES_2 + angle % Math.PI_TIMES_2 : angle) % Math.PI_TIMES_2;
return this;
}

Expand Down Expand Up @@ -868,7 +883,7 @@ public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits((angle < 0.0 ? Math.PI + Math.PI + angle % (Math.PI + Math.PI) : angle) % (Math.PI + Math.PI));
temp = Double.doubleToLongBits((angle < 0.0 ? Math.PI_TIMES_2 + angle % Math.PI_TIMES_2 : angle) % Math.PI_TIMES_2);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(x);
result = prime * result + (int) (temp ^ (temp >>> 32));
Expand All @@ -887,8 +902,8 @@ public boolean equals(Object obj) {
if (getClass() != obj.getClass())
return false;
AxisAngle4d other = (AxisAngle4d) obj;
if (Double.doubleToLongBits((angle < 0.0 ? Math.PI + Math.PI + angle % (Math.PI + Math.PI) : angle) % (Math.PI + Math.PI)) !=
Double.doubleToLongBits((other.angle < 0.0 ? Math.PI + Math.PI + other.angle % (Math.PI + Math.PI) : other.angle) % (Math.PI + Math.PI)))
if (Double.doubleToLongBits((angle < 0.0 ? Math.PI_TIMES_2 + angle % Math.PI_TIMES_2 : angle) % Math.PI_TIMES_2) !=
Double.doubleToLongBits((other.angle < 0.0 ? Math.PI_TIMES_2 + other.angle % Math.PI_TIMES_2 : other.angle) % Math.PI_TIMES_2))
return false;
if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
return false;
Expand Down
Loading

0 comments on commit b36a5cc

Please sign in to comment.