diff --git a/src/Components/SVG/Elements/Dimension.tsx b/src/Components/SVG/Elements/Dimension.tsx index c5f6f86..3a20b9c 100644 --- a/src/Components/SVG/Elements/Dimension.tsx +++ b/src/Components/SVG/Elements/Dimension.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import { NOTCHES_LENGTH } from '../../../utils/default'; +import { Qrsqrt } from '../../../utils/math'; interface IDimensionProps { id: string @@ -32,8 +33,8 @@ export const Dimension: React.FC = (props: IDimensionProps) => const [deltaX, deltaY] = [(props.xEnd - props.xStart), (props.yEnd - props.yStart)]; // Get the unit vector - const norm = Math.sqrt(deltaX * deltaX + deltaY * deltaY); - const [unitX, unitY] = [deltaX / norm, deltaY / norm]; + const inv = Qrsqrt(deltaX * deltaX + deltaY * deltaY); + const [unitX, unitY] = [deltaX * inv, deltaY * inv]; // Get the perpandicular vector const [perpVecX, perpVecY] = [unitY, -unitX]; diff --git a/src/utils/math.ts b/src/utils/math.ts new file mode 100644 index 0000000..38a1039 --- /dev/null +++ b/src/utils/math.ts @@ -0,0 +1,21 @@ +const bytes = new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT); +const floatView = new Float32Array(bytes); +const intView = new Uint32Array(bytes); +const threehalfs = 1.5; + +/** + * Fast inverse square root + * http://en.wikipedia.org/wiki/Fast_inverse_square_root + * https://youtu.be/p8u_k2LIZyo + * @param number Number to square root + * @returns Approximation of the squqre root of the number + */ +export function Qrsqrt(number: number): number { + const x2 = number * 0.5; + floatView[0] = number; + intView[0] = 0x5f3759df - (intView[0] >> 1); + let y = floatView[0]; + y = y * (threehalfs - (x2 * y * y)); + + return y; +}