epos-helper.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Vec3 } from '../linear-algebra/3d';
  7. import { CentroidHelper } from './centroid-helper';
  8. // implementing http://www.ep.liu.se/ecp/034/009/ecp083409.pdf
  9. export class EposHelper {
  10. private minDist: number[] = []
  11. private maxDist: number[] = []
  12. private extrema: Vec3[] = []
  13. private centroidHelper = new CentroidHelper()
  14. private computeExtrema(i: number, p: Vec3) {
  15. const d = Vec3.dot(this.dir[i], p)
  16. if (d < this.minDist[i]) {
  17. this.minDist[i] = d
  18. Vec3.copy(this.extrema[i * 2], p)
  19. }
  20. if (d > this.maxDist[i]) {
  21. this.maxDist[i] = d
  22. Vec3.copy(this.extrema[i * 2 + 1], p)
  23. }
  24. }
  25. includeStep(p: Vec3) {
  26. for (let i = 0, il = this.dir.length; i < il; ++i) {
  27. this.computeExtrema(i, p)
  28. }
  29. }
  30. finishedIncludeStep() {
  31. for (let i = 0; i < this.extrema.length; i++) {
  32. this.centroidHelper.includeStep(this.extrema[i]);
  33. }
  34. this.centroidHelper.finishedIncludeStep();
  35. }
  36. radiusStep(p: Vec3) {
  37. this.centroidHelper.radiusStep(p);
  38. }
  39. getSphere() {
  40. return this.centroidHelper.getSphere();
  41. }
  42. reset() {
  43. for (let i = 0, il = this.dir.length; i < il; ++i) {
  44. this.minDist[i] = Infinity
  45. this.maxDist[i] = -Infinity
  46. this.extrema[i * 2] = Vec3()
  47. this.extrema[i * 2 + 1] = Vec3()
  48. }
  49. this.centroidHelper.reset()
  50. }
  51. constructor(private dir: Vec3[]) {
  52. this.reset()
  53. }
  54. }
  55. const DirEpos6 = [
  56. Vec3.create(1, 0, 0), Vec3.create(0, 1, 0), Vec3.create(0, 0, 1)
  57. ]
  58. export function Epos6() {
  59. return new EposHelper(DirEpos6)
  60. }
  61. const DirEpos14 = [
  62. Vec3.create(1, 0, 0), Vec3.create(0, 1, 0), Vec3.create(0, 0, 1),
  63. Vec3.create(1/3, 1/3, 1/3), Vec3.create(-1/3, 1/3, 1/3),
  64. Vec3.create(-1/3, -1/3, 1/3), Vec3.create(1/3, -1/3, 1/3)
  65. ]
  66. export function Epos14() {
  67. return new EposHelper(DirEpos14)
  68. }