use of org.twak.viewTrace.SuperLine in project chordatlas by twak.
the class SkelFootprint method mergeOnProfiles.
private void mergeOnProfiles(HalfMesh2 mesh, List<Line> footprint) {
System.out.println("merging over profiles...");
TreeSet<HalfFace> togo = new TreeSet<>((HalfFace o1, HalfFace o2) -> Double.compare(o1.area(), o2.area()));
togo.addAll(mesh.faces);
int count = 0;
while (!togo.isEmpty()) {
HalfFace f = togo.pollFirst();
Cache<HalfEdge, MutableDouble> crossedBy = new Cach<>(e -> new MutableDouble(0));
for (HalfEdge e : f) {
SuperEdge se = (SuperEdge) e;
if (se.profLine != null) {
MegaFacade mf = ((SuperLine) se.profLine).mega;
if (mf != null)
for (Prof p : mf.getTween(se.start, se.end, 0)) {
Line proj = new Line(Pointz.to2(p.to3d(p.get(0))), Pointz.to2(p.to3d(p.get(p.size() - 1))));
for (HalfEdge e2 : f) {
SuperEdge se2 = (SuperEdge) e2;
if (se2.profLine == null && (se2.over == null || ((SuperEdge) se2.over).profLine == null) && e2.over != null && e2.line().intersects(proj) != null && Mathz.inRange(e2.line().absAngle(proj), 0.25 * Math.PI, 0.75 * Math.PI)) {
crossedBy.get(e2).d += TweedSettings.settings.profileHSampleDist;
}
}
}
}
}
count += crossedBy.cache.size();
Optional<Map.Entry<HalfEdge, MutableDouble>> longestO = crossedBy.cache.entrySet().stream().filter(//
e1 -> ((SuperEdge) e1.getKey()).profLine == null && e1.getValue().d > 0).max((e1, e2) -> Double.compare(e1.getValue().d, e2.getValue().d));
if (longestO.isPresent()) {
Map.Entry<HalfEdge, MutableDouble> longest = longestO.get();
if (longest.getValue().d > 0.6 * longest.getKey().length()) {
HalfFace tgf = longest.getKey().over.face;
togo.remove(tgf);
longest.getKey().face.merge(mesh, tgf);
((SuperFace) longest.getKey().face).mergeFrom((SuperFace) tgf);
togo.add(f);
}
}
}
System.out.println("found crossings " + count);
killDoubleEdges(mesh);
}
use of org.twak.viewTrace.SuperLine in project chordatlas by twak.
the class VizSkelGen method toHalf.
private SuperFace toHalf(Loop<Point3d> loop) {
Cache<Point3d, Point2d> look = new Cach<>(x -> Pointz.to2(x));
HalfEdge last = null, first = null;
SuperFace out = new SuperFace();
for (Loopable<Point3d> edge : loop.loopableIterator()) {
SuperEdge e = new SuperEdge(look.get(edge.get()), look.get(edge.getNext().get()), null);
if (first == null)
first = e;
if (last != null)
last.next = e;
e.face = out;
// !
e.prof = null;
e.mini = Collections.EMPTY_LIST;
if (mode == Mode.Profiles)
for (Line l : footprint) {
if (l.absAngle(e.line()) < 0.1 && l.distance(e.start, true) < 1.5 && l.distance(e.end, true) < 1.5) {
SuperLine sl = (SuperLine) l;
MegaFacade mf = sl.getMega();
e.prof = findProf(e.start, e.end, sl, mf);
}
}
last = e;
}
last.next = first;
out.e = first;
SkelFootprint.meanModeHeightColor(Loopz.toXZLoop(loop), out, blockGen);
if (mode == Mode.CE) {
for (HalfEdge ee : out) {
SuperEdge e = (SuperEdge) ee;
Matrix4d m = new Matrix4d();
m.setIdentity();
e.prof = new Prof(m, new Vector3d());
e.prof.add(new Point2d(0, 0));
e.prof.add(new Point2d(0, out.height));
e.prof.add(new Point2d(-1, out.height + 1));
}
}
return out;
}
use of org.twak.viewTrace.SuperLine 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 org.twak.viewTrace.SuperLine in project chordatlas by twak.
the class SkelFootprint method profileRuns.
private static void profileRuns(SuperLine sl, MultiMap<SuperLine, List<Prof>> profSets) {
MegaFacade mf = sl.getMega();
Cache<Integer, Double> distance2Next = new Cache<Integer, Double>() {
@Override
public Double create(Integer i) {
Prof pc = mf.profiles.get(i), pn = mf.profiles.get(i + 1);
if (pc == null || pn == null)
return 1e6;
return pc.distance(pn, true, false, false);
}
};
// i -> mf.profiles.get( i ).distance( mf.profiles.get(i+1), true ));
int start = mf.hExtentMin;
for (int i = mf.hExtentMin; i < mf.hExtentMax; i++) {
if (distance2Next.get(i) > 4 || i == mf.hExtentMax - 1) {
// if ( (Math.random() > 0.95 || i == mf.hExtentMax - 1) ){//0.5 / ProfileGen.HORIZ_SAMPLE_DIST) {
if (i - start > 0.5 / TweedSettings.settings.profileHSampleDist) {
List<Prof> lp = IntStream.range(start, i + 1).mapToObj(p -> mf.profiles.get(p)).filter(p -> p != null).collect(Collectors.toList());
if (lp != null && !lp.isEmpty())
profSets.put(sl, lp);
}
start = i + 1;
// i++;
// }
}
}
// System.out.println( (mf.hExtentMax - mf.hExtentMin)+ " mm " + min+ " / " + max +" found " + profSets.size() );
}
use of org.twak.viewTrace.SuperLine in project chordatlas by twak.
the class SkelFootprint method dbgCountProfileEdges.
private void dbgCountProfileEdges(SolverState SS) {
Set<SuperLine> used = new HashSet<>();
for (HalfFace f : SS.mesh) for (HalfEdge e : f) {
used.add(((SuperEdge) e).profLine);
}
used.remove(null);
System.out.println("Input sweep edges: " + used.size());
}
Aggregations