use of javax.vecmath.Point2d in project chordatlas by twak.
the class Prof method clean.
private Prof clean(double areaTol) {
for (int i = 2; i < size(); i++) {
Point2d a = get(i - 2), b = get(i - 1), c = get(i);
if (Math.abs(Mathz.area(a, b, c)) < areaTol) {
remove(i - 1);
i--;
}
}
return this;
}
use of javax.vecmath.Point2d in project chordatlas by twak.
the class Prof method at3DHeight.
public Point3d at3DHeight(double h3) {
double h = to2d(new Point3d(0, h3, 0)).y;
int i = 0;
while (get(i).y <= h && i < size() - 1) i++;
if (i == 0)
return null;
else if (get(i).y <= h)
return null;
else
return to3d(new Point2d(new Line(get(i - 1), get(i)).xAtY(h), h));
}
use of javax.vecmath.Point2d in project chordatlas by twak.
the class Prof method parameterize.
public Prof parameterize() {
// find and subtract vertical lines
Set<Line> lines = new HashSet<>();
for (int i = 1; i < size(); i++) lines.add(new Line(get(i - 1), get(i)));
double avgMinY = get(0).y;
SliceParameters P = new SliceParameters(5);
P.FL_REGRESS = false;
P.FL_BINS = 20;
// simple = 0.4
double A = 0.4;
// simple = 1;
double B = 1;
lines = new FindLines(lines, P) {
protected double nextAngle(Set<Line> remaining, int iteration) {
double delta = Math.PI / P.FL_BINS;
// angle bin
Bin<Line> aBin = new Bin(-Math.PI - delta, Math.PI + delta, P.FL_BINS * 2, true);
for (Line l : remaining) {
double len = l.length();
double angle = l.aTan2();
aBin.add(angle, len, l);
}
// return MUtils.PI2;
if (iteration < 1 && aBin.getWeight(Mathz.PI2) >= 5)
return Mathz.PI2;
int aBinI = aBin.maxI();
return aBin.val(aBinI);
}
protected double getTolNearLine(Point2d p) {
return P.FL_NEAR_LINE * (p.y < avgMinY + 5 ? 5 : B);
}
protected double getTolNearLine2(Point2d p) {
return P.FL_NEAR_LINE_2 * (p.y < avgMinY + 5 ? 10 : B);
}
}.result.all;
clean = new Prof(this);
clean.clear();
if (lines.isEmpty()) {
clean.add(new Point2d(0, 0));
clean.add(new Point2d(0, 1));
return clean;
}
List<Line> llines = new ArrayList(lines);
llines.stream().filter(l -> l.start.y > l.end.y).forEach(l -> l.reverseLocal());
Collections.sort(llines, new Comparator<Line>() {
public int compare(Line o1, Line o2) {
return Double.compare(o1.start.y + o1.end.y, o2.start.y + o2.end.y);
}
});
for (int i = 0; i < llines.size(); i++) {
Line l = llines.get(i);
double angle = l.aTan2();
if (angle < Mathz.PI2 + 0.1 && angle > Mathz.PI2 - 0.4)
llines.set(i, FindLines.rotateToAngle(l, l.fromPPram(0.5), Mathz.PI2));
}
Line bottomLine = llines.get(0);
llines.add(0, new Line(new Point2d(bottomLine.start.x, get(0).y), new Point2d(bottomLine.start.x, get(0).y)));
double lastY = -Double.MAX_VALUE, lastX = Double.MAX_VALUE;
for (Line l : llines) {
boolean startAbove = l.start.y >= lastY && l.start.x <= lastX, endAbove = l.end.y >= lastY && l.end.x <= lastX;
if (startAbove && endAbove) {
clean.add(l.start);
clean.add(l.end);
} else if (!startAbove && endAbove) {
if (l.start.y < lastY) {
Point2d sec = new LinearForm(new Vector2d(1, 0)).findC(new Point2d(0, lastY)).intersect(new LinearForm(l));
if (sec != null)
l.start = sec;
}
if (l.start.x > lastX) {
Point2d sec = new LinearForm(new Vector2d(0, 1)).findC(new Point2d(lastX, 0)).intersect(new LinearForm(l));
if (sec != null)
l.start = sec;
}
if (l.end.distanceSquared(l.start) < 100)
clean.add(l.start);
clean.add(l.end);
} else {
Vector2d dir = l.dir();
if (Math.abs(dir.x) > Math.abs(dir.y)) {
LinearForm x = new LinearForm(new Vector2d(1, 0)).findC(new Point2d(0, lastY));
l.start = x.project(l.start);
l.end = x.project(l.end);
l.start.x = Math.min(l.start.x, lastX);
l.end.x = Math.min(l.end.x, lastX);
} else {
LinearForm y = new LinearForm(new Vector2d(0, 1)).findC(new Point2d(lastX, 0));
l.start = y.project(l.start);
l.end = y.project(l.end);
l.start.y = Math.max(l.start.y, lastY);
l.end.y = Math.max(l.end.y, lastY);
}
clean.add(l.start);
clean.add(l.end);
}
lastY = l.end.y;
lastX = l.end.x;
}
clean.clean(0.2);
return clean;
}
use of javax.vecmath.Point2d in project chordatlas by twak.
the class SkelFootprint method insert.
public static void insert(HalfMesh2 mesh, Line line, double softDist, boolean backwardsToo, boolean setLine) {
Vector2d dir = line.dir(), nDir = new Vector2d(dir);
nDir.negate();
double remaining = line.length();
for (HalfFace f : mesh.faces) {
if (f.contains(line.start)) {
HalfEdge n = f.fracture(line.start, nDir), p = f.fracture(line.start, dir);
if (n == null || p == null) {
System.err.println("geometry failure");
return;
}
HalfEdge next = p.next.over, prev = n.next.over;
HalfEdge dividing = f.split(mesh, n, p);
dividing.split(line.start);
((SuperEdge) dividing.next).profLine = setLine ? (SuperLine) line : null;
double l = dividing.next.length();
if (remaining < l) {
Point2d softStart = new Point2d(dir);
softStart.scale(remaining / dir.length());
softStart.add(line.start);
dividing.next.split(softStart);
((SuperEdge) dividing.next.next).profLine = null;
((SuperEdge) dividing.next.next.over).profLine = null;
double remSoftDist = softDist - dividing.next.next.line().length();
if (remSoftDist > 0)
fracture(mesh, next, dir, 0, remSoftDist, null, setLine);
} else if (next != null)
fracture(mesh, next, dir, remaining - l, softDist, line, setLine);
double softDistN = softDist - dividing.start.distance(line.start);
if (backwardsToo && softDistN > 0 && prev != null) {
fracture(mesh, prev, nDir, 0, softDistN, null, setLine);
}
return;
}
}
}
use of javax.vecmath.Point2d in project chordatlas by twak.
the class SkelFootprint method defaultProf.
private static Prof defaultProf(Prof example) {
Prof vertical = example == null ? new Prof() : new Prof(example);
vertical.clear();
vertical.add(new Point2d());
vertical.add(new Point2d(0, 20));
return vertical;
}
Aggregations