math.functions.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { FloatArray, Nullable, IndicesArray } from '../types';
  2. import { Vector2, Vector3 } from './math';
  3. /**
  4. * Extracts minimum and maximum values from a list of indexed positions
  5. * @param positions defines the positions to use
  6. * @param indices defines the indices to the positions
  7. * @param indexStart defines the start index
  8. * @param indexCount defines the end index
  9. * @param bias defines bias value to add to the result
  10. * @return minimum and maximum values
  11. */
  12. export function extractMinAndMaxIndexed(positions: FloatArray, indices: IndicesArray, indexStart: number, indexCount: number, bias: Nullable<Vector2> = null): { minimum: Vector3; maximum: Vector3 } {
  13. var minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
  14. var maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
  15. for (var index = indexStart; index < indexStart + indexCount; index++) {
  16. const offset = indices[index] * 3;
  17. const x = positions[offset];
  18. const y = positions[offset + 1];
  19. const z = positions[offset + 2];
  20. minimum.minimizeInPlaceFromFloats(x, y, z);
  21. maximum.maximizeInPlaceFromFloats(x, y, z);
  22. }
  23. if (bias) {
  24. minimum.x -= minimum.x * bias.x + bias.y;
  25. minimum.y -= minimum.y * bias.x + bias.y;
  26. minimum.z -= minimum.z * bias.x + bias.y;
  27. maximum.x += maximum.x * bias.x + bias.y;
  28. maximum.y += maximum.y * bias.x + bias.y;
  29. maximum.z += maximum.z * bias.x + bias.y;
  30. }
  31. return {
  32. minimum: minimum,
  33. maximum: maximum
  34. };
  35. }
  36. /**
  37. * Extracts minimum and maximum values from a list of positions
  38. * @param positions defines the positions to use
  39. * @param start defines the start index in the positions array
  40. * @param count defines the number of positions to handle
  41. * @param bias defines bias value to add to the result
  42. * @param stride defines the stride size to use (distance between two positions in the positions array)
  43. * @return minimum and maximum values
  44. */
  45. export function extractMinAndMax(positions: FloatArray, start: number, count: number, bias: Nullable<Vector2> = null, stride?: number): { minimum: Vector3; maximum: Vector3 } {
  46. var minimum = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
  47. var maximum = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
  48. if (!stride) {
  49. stride = 3;
  50. }
  51. for (var index = start, offset = start * stride; index < start + count; index++ , offset += stride) {
  52. const x = positions[offset];
  53. const y = positions[offset + 1];
  54. const z = positions[offset + 2];
  55. minimum.minimizeInPlaceFromFloats(x, y, z);
  56. maximum.maximizeInPlaceFromFloats(x, y, z);
  57. }
  58. if (bias) {
  59. minimum.x -= minimum.x * bias.x + bias.y;
  60. minimum.y -= minimum.y * bias.x + bias.y;
  61. minimum.z -= minimum.z * bias.x + bias.y;
  62. maximum.x += maximum.x * bias.x + bias.y;
  63. maximum.y += maximum.y * bias.x + bias.y;
  64. maximum.z += maximum.z * bias.x + bias.y;
  65. }
  66. return {
  67. minimum: minimum,
  68. maximum: maximum
  69. };
  70. }