QuadEdgeTriangle.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import QuadEdge from './QuadEdge'
  2. import Arrays from '../../../../../java/util/Arrays'
  3. import GeometryFactory from '../../geom/GeometryFactory'
  4. import Coordinate from '../../geom/Coordinate'
  5. import PointLocation from '../../algorithm/PointLocation'
  6. import Vertex from './Vertex'
  7. import ArrayList from '../../../../../java/util/ArrayList'
  8. import TriangleVisitor from './TriangleVisitor'
  9. export default class QuadEdgeTriangle {
  10. constructor() {
  11. QuadEdgeTriangle.constructor_.apply(this, arguments)
  12. }
  13. static constructor_() {
  14. this._edge = null
  15. this._data = null
  16. const edge = arguments[0]
  17. this._edge = Arrays.copyOf(edge, edge.length)
  18. for (let i = 0; i < 3; i++)
  19. edge[i].setData(this)
  20. }
  21. static toPolygon() {
  22. if (arguments[0] instanceof Array) {
  23. const v = arguments[0]
  24. const ringPts = [v[0].getCoordinate(), v[1].getCoordinate(), v[2].getCoordinate(), v[0].getCoordinate()]
  25. const fact = new GeometryFactory()
  26. const ring = fact.createLinearRing(ringPts)
  27. const tri = fact.createPolygon(ring)
  28. return tri
  29. } else if (arguments[0] instanceof Array) {
  30. const e = arguments[0]
  31. const ringPts = [e[0].orig().getCoordinate(), e[1].orig().getCoordinate(), e[2].orig().getCoordinate(), e[0].orig().getCoordinate()]
  32. const fact = new GeometryFactory()
  33. const ring = fact.createLinearRing(ringPts)
  34. const tri = fact.createPolygon(ring)
  35. return tri
  36. }
  37. }
  38. static nextIndex(index) {
  39. return index = (index + 1) % 3
  40. }
  41. static contains() {
  42. if (arguments[0] instanceof Array && arguments[1] instanceof Coordinate) {
  43. const tri = arguments[0], pt = arguments[1]
  44. const ring = [tri[0].getCoordinate(), tri[1].getCoordinate(), tri[2].getCoordinate(), tri[0].getCoordinate()]
  45. return PointLocation.isInRing(pt, ring)
  46. } else if (arguments[0] instanceof Array && arguments[1] instanceof Coordinate) {
  47. const tri = arguments[0], pt = arguments[1]
  48. const ring = [tri[0].orig().getCoordinate(), tri[1].orig().getCoordinate(), tri[2].orig().getCoordinate(), tri[0].orig().getCoordinate()]
  49. return PointLocation.isInRing(pt, ring)
  50. }
  51. }
  52. static createOn(subdiv) {
  53. const visitor = new QuadEdgeTriangleBuilderVisitor()
  54. subdiv.visitTriangles(visitor, false)
  55. return visitor.getTriangles()
  56. }
  57. getCoordinates() {
  58. const pts = new Array(4).fill(null)
  59. for (let i = 0; i < 3; i++)
  60. pts[i] = this._edge[i].orig().getCoordinate()
  61. pts[3] = new Coordinate(pts[0])
  62. return pts
  63. }
  64. getVertex(i) {
  65. return this._edge[i].orig()
  66. }
  67. isBorder() {
  68. if (arguments.length === 0) {
  69. for (let i = 0; i < 3; i++)
  70. if (this.getAdjacentTriangleAcrossEdge(i) === null) return true
  71. return false
  72. } else if (arguments.length === 1) {
  73. const i = arguments[0]
  74. return this.getAdjacentTriangleAcrossEdge(i) === null
  75. }
  76. }
  77. getEdgeIndex() {
  78. if (arguments[0] instanceof QuadEdge) {
  79. const e = arguments[0]
  80. for (let i = 0; i < 3; i++)
  81. if (this._edge[i] === e) return i
  82. return -1
  83. } else if (arguments[0] instanceof Vertex) {
  84. const v = arguments[0]
  85. for (let i = 0; i < 3; i++)
  86. if (this._edge[i].orig() === v) return i
  87. return -1
  88. }
  89. }
  90. getGeometry(fact) {
  91. const ring = fact.createLinearRing(this.getCoordinates())
  92. const tri = fact.createPolygon(ring)
  93. return tri
  94. }
  95. getCoordinate(i) {
  96. return this._edge[i].orig().getCoordinate()
  97. }
  98. getTrianglesAdjacentToVertex(vertexIndex) {
  99. const adjTris = new ArrayList()
  100. const start = this.getEdge(vertexIndex)
  101. let qe = start
  102. do {
  103. const adjTri = qe.getData()
  104. if (adjTri !== null)
  105. adjTris.add(adjTri)
  106. qe = qe.oNext()
  107. } while (qe !== start)
  108. return adjTris
  109. }
  110. getNeighbours() {
  111. const neigh = new Array(3).fill(null)
  112. for (let i = 0; i < 3; i++)
  113. neigh[i] = this.getEdge(i).sym().getData()
  114. return neigh
  115. }
  116. getAdjacentTriangleAcrossEdge(edgeIndex) {
  117. return this.getEdge(edgeIndex).sym().getData()
  118. }
  119. setData(data) {
  120. this._data = data
  121. }
  122. getData() {
  123. return this._data
  124. }
  125. getAdjacentTriangleEdgeIndex(i) {
  126. return this.getAdjacentTriangleAcrossEdge(i).getEdgeIndex(this.getEdge(i).sym())
  127. }
  128. getVertices() {
  129. const vert = new Array(3).fill(null)
  130. for (let i = 0; i < 3; i++)
  131. vert[i] = this.getVertex(i)
  132. return vert
  133. }
  134. getEdges() {
  135. return this._edge
  136. }
  137. getEdge(i) {
  138. return this._edge[i]
  139. }
  140. toString() {
  141. return this.getGeometry(new GeometryFactory()).toString()
  142. }
  143. isLive() {
  144. return this._edge !== null
  145. }
  146. kill() {
  147. this._edge = null
  148. }
  149. contains(pt) {
  150. const ring = this.getCoordinates()
  151. return PointLocation.isInRing(pt, ring)
  152. }
  153. getEdgeSegment(i, seg) {
  154. seg.p0 = this._edge[i].orig().getCoordinate()
  155. const nexti = (i + 1) % 3
  156. seg.p1 = this._edge[nexti].orig().getCoordinate()
  157. }
  158. }
  159. class QuadEdgeTriangleBuilderVisitor {
  160. constructor() {
  161. QuadEdgeTriangleBuilderVisitor.constructor_.apply(this, arguments)
  162. }
  163. static constructor_() {
  164. this._triangles = new ArrayList()
  165. }
  166. visit(edges) {
  167. this._triangles.add(new QuadEdgeTriangle(edges))
  168. }
  169. getTriangles() {
  170. return this._triangles
  171. }
  172. get interfaces_() {
  173. return [TriangleVisitor]
  174. }
  175. }
  176. QuadEdgeTriangle.QuadEdgeTriangleBuilderVisitor = QuadEdgeTriangleBuilderVisitor