projects
/
anneal.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
checkpoint
[anneal.git]
/
src
/
edu
/
berkeley
/
qfat
/
Mesh.java
diff --git
a/src/edu/berkeley/qfat/Mesh.java
b/src/edu/berkeley/qfat/Mesh.java
index
1e83eee
..
34a8de2
100644
(file)
--- a/
src/edu/berkeley/qfat/Mesh.java
+++ b/
src/edu/berkeley/qfat/Mesh.java
@@
-52,6
+52,7
@@
public class Mesh implements Iterable<Mesh.T> {
ArrayList<Vertex> set = new ArrayList<Vertex>();
for(Vertex v : vertices) set.add(v);
for(Vertex v : set) v.transform(m.times(v.p), true, null);
ArrayList<Vertex> set = new ArrayList<Vertex>();
for(Vertex v : vertices) set.add(v);
for(Vertex v : set) v.transform(m.times(v.p), true, null);
+ for(Vertex v : set) v.goodp = v.p;
}
public void rebuild() { /*vertices.rebuild();*/ }
}
public void rebuild() { /*vertices.rebuild();*/ }
@@
-147,15
+148,20
@@
public class Mesh implements Iterable<Mesh.T> {
if (!immutableVertices && quadric_count == 0)
nerror *= 2;
if (!immutableVertices && quadric_count == 0)
nerror *= 2;
-
+ //System.out.println(nerror);
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
- double ang = Math.abs(e.dihedralAngle());
+ double ang = e.dihedralAngle();
if (ang > Math.PI) throw new Error();
if (ang > Math.PI) throw new Error();
- float minangle = (float)(Math.PI * 0.8);
- if (ang > minangle) nerror += (ang - minangle);
+ if (ang < -Math.PI) throw new Error();
+ //float minangle = (float)(Math.PI * 0.8);
+ nerror += ((ang / Math.PI)*(ang/Math.PI)) * e.length() * 0.01;
+ //System.out.println(((ang / Math.PI)*(ang/Math.PI)) * 0.000001);
+ //if (ang > minangle) nerror += (ang - minangle);
+ /*
if (e.t.aspect() < 0.2) {
nerror += (0.2-e.t.aspect()) * 10;
}
if (e.t.aspect() < 0.2) {
nerror += (0.2-e.t.aspect()) * 10;
}
+ */
}
setError(nerror);
}
setError(nerror);
@@
-169,6
+175,7
@@
public class Mesh implements Iterable<Mesh.T> {
// t2' = t2.getMatrix(t1) * M * t1
// t1 = t1.getMatrix(t2) * t2
// M * t1 = M * t1.getMatrix(t2) * t2
// t2' = t2.getMatrix(t1) * M * t1
// t1 = t1.getMatrix(t2) * t2
// M * t1 = M * t1.getMatrix(t2) * t2
+
if (bindingGroup!=null && this != bindingGroup.getMaster()) {
Matrix v = getBindingMatrix(bindingGroup.getMaster());
return ((Vertex)bindingGroup.getMaster()).move(v.inverse().times(m).times(v), ignoreProblems);
if (bindingGroup!=null && this != bindingGroup.getMaster()) {
Matrix v = getBindingMatrix(bindingGroup.getMaster());
return ((Vertex)bindingGroup.getMaster()).move(v.inverse().times(m).times(v), ignoreProblems);
@@
-195,7
+202,7
@@
public class Mesh implements Iterable<Mesh.T> {
good &= v.transform(pt2, ignoreProblems, v.getBindingMatrix(this));
}
good &= v.transform(pt2, ignoreProblems, v.getBindingMatrix(this));
}
- if (!good) {
+ if (!good && !ignoreProblems) {
for(Vertex v : (Iterable<Vertex>)getBoundPeers())
v.transform(v.oldp, true, null);
}
for(Vertex v : (Iterable<Vertex>)getBoundPeers())
v.transform(v.oldp, true, null);
}
@@
-216,16
+223,16
@@
public class Mesh implements Iterable<Mesh.T> {
illegal = false;
illegal = false;
- if (this.p.minus(newp).mag() > 0.1 && !ignoreProblems) {
/*
/*
+ if (this.p.minus(newp).mag() > 0.1 && !ignoreProblems) {
try {
throw new Exception(""+this.p.minus(newp).mag()+" "+ignoreProblems+" "+yes);
} catch(Exception e) {
e.printStackTrace();
}
try {
throw new Exception(""+this.p.minus(newp).mag()+" "+ignoreProblems+" "+yes);
} catch(Exception e) {
e.printStackTrace();
}
- */
illegal = true;
}
illegal = true;
}
+ */
this.p = newp;
reinsert();
this.p = newp;
reinsert();
@@
-240,11
+247,13
@@
public class Mesh implements Iterable<Mesh.T> {
}
public void checkLegality() {
}
public void checkLegality() {
+
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
if (Math.abs(e.dihedralAngle()) > (Math.PI * 0.9) ||
Math.abs(e.next.dihedralAngle()) > (Math.PI * 0.9)) illegal = true;
if (e.t.aspect() < 0.2) illegal = true;
}
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
if (Math.abs(e.dihedralAngle()) > (Math.PI * 0.9) ||
Math.abs(e.next.dihedralAngle()) > (Math.PI * 0.9)) illegal = true;
if (e.t.aspect() < 0.2) illegal = true;
}
+
if (!illegal) triangles.range(oldp, this.p, (Visitor<T>)this);
}
if (!illegal) triangles.range(oldp, this.p, (Visitor<T>)this);
}
@@
-337,6
+346,7
@@
public class Mesh implements Iterable<Mesh.T> {
for(E eother : nbg) {
if (next==null || prev==null) continue;
if (eother.next==null || eother.prev==null) continue;
for(E eother : nbg) {
if (next==null || prev==null) continue;
if (eother.next==null || eother.prev==null) continue;
+
if (next.isBoundTo(eother.pair.prev.pair) && !prev.isBoundTo(eother.pair.next.pair))
prev.bindTo(next.getBindingMatrix(eother.pair.prev.pair), eother.pair.next.pair);
if (!next.isBoundTo(eother.pair.prev.pair) && prev.isBoundTo(eother.pair.next.pair))
if (next.isBoundTo(eother.pair.prev.pair) && !prev.isBoundTo(eother.pair.next.pair))
prev.bindTo(next.getBindingMatrix(eother.pair.prev.pair), eother.pair.next.pair);
if (!next.isBoundTo(eother.pair.prev.pair) && prev.isBoundTo(eother.pair.next.pair))
@@
-399,6
+409,8
@@
public class Mesh implements Iterable<Mesh.T> {
if (e==this) continue;
p1.bindTo(getBindingMatrix(e), e.p1);
p2.bindTo(getBindingMatrix(e), e.p2);
if (e==this) continue;
p1.bindTo(getBindingMatrix(e), e.p1);
p2.bindTo(getBindingMatrix(e), e.p2);
+ e.p1.setConstraint(getConstraint());
+ e.p2.setConstraint(getConstraint());
}
}
}
}
@@
-439,11
+451,11
@@
public class Mesh implements Iterable<Mesh.T> {
e.p1.getE(mid).pair. bindTo(e.getBindingMatrix(firste), first.pair);
e.p2.getE(mid).pair. bindTo(e.getBindingMatrix(firste), firstq);
e.p2.getE(mid).pair.pair.bindTo(e.getBindingMatrix(firste), firstq.pair);
e.p1.getE(mid).pair. bindTo(e.getBindingMatrix(firste), first.pair);
e.p2.getE(mid).pair. bindTo(e.getBindingMatrix(firste), firstq);
e.p2.getE(mid).pair.pair.bindTo(e.getBindingMatrix(firste), firstq.pair);
- first.bindingGroup.setKrank(e.bindingGroup.krank);
- firstq.bindingGroup.setKrank(e.bindingGroup.krank);
- first.pair.bindingGroup.setKrank(e.bindingGroup.krank);
- firstq.pair.bindingGroup.setKrank(e.bindingGroup.krank);
}
}
+ if (firste.bindingGroup != null)
+ firste.bindingGroup.setKrank(bindingGroup.krank);
+ if (firstq.bindingGroup != null)
+ firstq.bindingGroup.setKrank(bindingGroup.krank);
return null;
}
return null;
}
@@
-493,7
+505,12
@@
public class Mesh implements Iterable<Mesh.T> {
public double dihedralAngle() {
Vec v1 = t.norm().times(-1);
Vec v2 = pair.t.norm().times(-1);
public double dihedralAngle() {
Vec v1 = t.norm().times(-1);
Vec v2 = pair.t.norm().times(-1);
- return Math.acos(v1.norm().dot(v2.norm()));
+ double prod = v1.norm().dot(v2.norm());
+ prod = Math.min(1,prod);
+ prod = Math.max(-1,prod);
+ double ret = Math.acos(prod);
+ if (Double.isNaN(ret)) throw new Error("nan! " + prod);
+ return ret;
}
/** angle between this half-edge and the next */
}
/** angle between this half-edge and the next */