2 private final boolean bObtuse;
3 private final boolean bBad;
4 private final Tuple obtuse;
5 private final Tuple coords[];
6 private final ElementEdge edges[];
8 private final Tuple center;
9 private final double radius_squared;
10 private final double MINANGLE;
12 public Element(Tuple a, Tuple b, Tuple c) {
15 coords = new Tuple[3];
19 if (b.lessThan(a) || c.lessThan(a))
29 edges = new ElementEdge[3];
30 edges[0] = new ElementEdge(coords[0], coords[1]);
31 edges[1] = new ElementEdge(coords[1], coords[2]);
32 edges[2] = new ElementEdge(coords[2], coords[0]);
33 boolean l_bObtuse = false;
34 boolean l_bBad = false;
35 Tuple l_obtuse = null;
36 for (int i = 0; i < 3; i++) {
37 double angle = getAngle(i);
38 if (angle > 90.099999999999994D) {
40 l_obtuse = new Tuple(coords[i]);
41 } else if (angle < 30D)
48 Tuple x = b.subtract(a);
49 Tuple y = c.subtract(a);
50 double xlen = a.distance(b);
51 double ylen = a.distance(c);
52 double cosine = x.dotp(y) / (xlen * ylen);
53 double sine_sq = 1.0D - cosine * cosine;
54 double plen = ylen / xlen;
55 double s = plen * cosine;
56 double t = plen * sine_sq;
57 double wp = (plen - cosine) / (2D * t);
58 double wb = 0.5D - wp * s;
59 Tuple tmpval = a.scale(1.0D - wb - wp);
60 tmpval = tmpval.add(b.scale(wb));
61 center = tmpval.add(c.scale(wp));
62 radius_squared = center.distance_squared(a);
65 public Element(Tuple a, Tuple b) {
67 coords = new Tuple[2];
74 edges = new ElementEdge[2];
75 edges[0] = new ElementEdge(coords[0], coords[1]);
76 edges[1] = new ElementEdge(coords[1], coords[0]);
80 center = a.add(b).scale(0.5D);
81 radius_squared = center.distance_squared(a);
86 public Tuple center() {
90 public boolean inCircle(Tuple p) {
91 double ds = center.distance_squared(p);
92 return ds <= radius_squared;
95 public double getAngle(int i) {
105 return Tuple.angle(b, a, c);
108 public ElementEdge getEdge(int i) {
112 public Tuple getPoint(int i) {
116 public Tuple getObtuse() {
120 public boolean isBad() {
124 public int getDim() {
128 public int numEdges() {
129 return (dim + dim) - 3;
132 public boolean isObtuse() {
136 public ElementEdge getRelatedEdge(Element e) {
137 int edim = e.getDim();
138 ElementEdge e_edge2 = null;
139 ElementEdge my_edge = edges[0];
140 ElementEdge e_edge0 = e.edges[0];
141 if (my_edge.equals(e_edge0))
143 ElementEdge e_edge1 = e.edges[1];
144 if (my_edge.equals(e_edge1))
147 e_edge2 = e.edges[2];
148 if (my_edge.equals(e_edge2))
152 if (my_edge.equals(e_edge0))
154 if (my_edge.equals(e_edge1))
156 if (edim == 3 && my_edge.equals(e_edge2))
160 if (my_edge.equals(e_edge0))
162 if (my_edge.equals(e_edge1))
164 if (edim == 3 && my_edge.equals(e_edge2))
170 public Element getCopy() {
172 return new Element(coords[0], coords[1], coords[2]);
174 return new Element(coords[0], coords[1]);
177 public boolean lessThan(Element e) {
178 if (dim < e.getDim())
180 if (dim > e.getDim())
182 for (int i = 0; i < dim; i++) {
183 if (coords[i].lessThan(e.coords[i]))
185 if (coords[i].greaterThan(e.coords[i]))
192 public boolean isRelated(Element e) {
193 int edim = e.getDim();
194 ElementEdge e_edge2 = null;
195 ElementEdge my_edge = edges[0];
196 ElementEdge e_edge0 = e.edges[0];
197 if (my_edge.equals(e_edge0))
199 ElementEdge e_edge1 = e.edges[1];
200 if (my_edge.equals(e_edge1))
203 e_edge2 = e.edges[2];
204 if (my_edge.equals(e_edge2))
208 if (my_edge.equals(e_edge0))
210 if (my_edge.equals(e_edge1))
212 if (edim == 3 && my_edge.equals(e_edge2))
216 if (my_edge.equals(e_edge0))
218 if (my_edge.equals(e_edge1))
220 if (edim == 3 && my_edge.equals(e_edge2))
226 public String toString() {
228 for (int i = 0; i < dim; i++) {
229 ret += coords[i].toString();
230 if (i != (dim - 1)) {