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 static final double MINANGLE = 30D;
12 public Element(Tuple a, Tuple b, Tuple c) {
14 coords = new Tuple[3];
18 if (b.lessThan(a) || c.lessThan(a))
28 edges = new ElementEdge[3];
29 edges[0] = new ElementEdge(coords[0], coords[1]);
30 edges[1] = new ElementEdge(coords[1], coords[2]);
31 edges[2] = new ElementEdge(coords[2], coords[0]);
32 boolean l_bObtuse = false;
33 boolean l_bBad = false;
34 Tuple l_obtuse = null;
35 for (int i = 0; i < 3; i++) {
36 double angle = getAngle(i);
37 if (angle > 90.099999999999994D) {
39 l_obtuse = new Tuple(coords[i]);
40 } else if (angle < 30D)
47 Tuple x = b.subtract(a);
48 Tuple y = c.subtract(a);
49 double xlen = a.distance(b);
50 double ylen = a.distance(c);
51 double cosine = x.dotp(y) / (xlen * ylen);
52 double sine_sq = 1.0D - cosine * cosine;
53 double plen = ylen / xlen;
54 double s = plen * cosine;
55 double t = plen * sine_sq;
56 double wp = (plen - cosine) / (2D * t);
57 double wb = 0.5D - wp * s;
58 Tuple tmpval = a.scale(1.0D - wb - wp);
59 tmpval = tmpval.add(b.scale(wb));
60 center = tmpval.add(c.scale(wp));
61 radius_squared = center.distance_squared(a);
64 public Element(Tuple a, Tuple b) {
66 coords = new Tuple[2];
73 edges = new ElementEdge[2];
74 edges[0] = new ElementEdge(coords[0], coords[1]);
75 edges[1] = new ElementEdge(coords[1], coords[0]);
79 center = a.add(b).scale(0.5D);
80 radius_squared = center.distance_squared(a);
85 public Tuple center() {
89 public boolean inCircle(Tuple p) {
90 double ds = center.distance_squared(p);
91 return ds <= radius_squared;
94 public double getAngle(int i) {
104 return Tuple.angle(b, a, c);
107 public ElementEdge getEdge(int i) {
111 public Tuple getPoint(int i) {
115 public Tuple getObtuse() {
119 public boolean isBad() {
123 public int getDim() {
127 public int numEdges() {
128 return (dim + dim) - 3;
131 public boolean isObtuse() {
135 public ElementEdge getRelatedEdge(Element e) {
136 int edim = e.getDim();
137 ElementEdge e_edge2 = null;
138 ElementEdge my_edge = edges[0];
139 ElementEdge e_edge0 = e.edges[0];
140 if (my_edge.equals(e_edge0))
142 ElementEdge e_edge1 = e.edges[1];
143 if (my_edge.equals(e_edge1))
146 e_edge2 = e.edges[2];
147 if (my_edge.equals(e_edge2))
151 if (my_edge.equals(e_edge0))
153 if (my_edge.equals(e_edge1))
155 if (edim == 3 && my_edge.equals(e_edge2))
159 if (my_edge.equals(e_edge0))
161 if (my_edge.equals(e_edge1))
163 if (edim == 3 && my_edge.equals(e_edge2))
169 public Element getCopy() {
171 return new Element(coords[0], coords[1], coords[2]);
173 return new Element(coords[0], coords[1]);
176 public boolean lessThan(Element e) {
177 if (dim < e.getDim())
179 if (dim > e.getDim())
181 for (int i = 0; i < dim; i++) {
182 if (coords[i].lessThan(e.coords[i]))
184 if (coords[i].greaterThan(e.coords[i]))
191 public boolean isRelated(Element e) {
192 int edim = e.getDim();
193 ElementEdge e_edge2 = null;
194 ElementEdge my_edge = edges[0];
195 ElementEdge e_edge0 = e.edges[0];
196 if (my_edge.equals(e_edge0))
198 ElementEdge e_edge1 = e.edges[1];
199 if (my_edge.equals(e_edge1))
202 e_edge2 = e.edges[2];
203 if (my_edge.equals(e_edge2))
207 if (my_edge.equals(e_edge0))
209 if (my_edge.equals(e_edge1))
211 if (edim == 3 && my_edge.equals(e_edge2))
215 if (my_edge.equals(e_edge0))
217 if (my_edge.equals(e_edge1))
219 if (edim == 3 && my_edge.equals(e_edge2))
225 public String toString() {
227 for (int i = 0; i < dim; i++) {
228 ret += coords[i].toString();
229 if (i != (dim - 1)) {