Search in sources :

Example 31 with Line

use of org.twak.utils.Line in project chordatlas by twak.

the class SkelFootprint method findProfiles.

private void findProfiles(List<Line> footprint, List<Prof> globalProfs) {
    MultiMap<SuperLine, List<Prof>> profSets = new MultiMap<>();
    System.out.println("clustering " + globalProfs.size() + " profiles over sweep edges...");
    for (Line l : footprint) profileRuns((SuperLine) l, profSets);
    Prof example = null;
    System.out.println("cleaning " + profSets.values().stream().flatMap(c -> c.stream()).count() + " profiles...");
    for (SuperLine sl : profSets.keySet()) for (List<Prof> lp : profSets.get(sl)) {
        if (example == null)
            example = lp.get(0);
        Prof p = Prof.parameterize(lp);
        if (p != null && p.size() > 1)
            globalProfs.add(SkelGen.moveToX0(p));
    }
    Iterator<Prof> git = globalProfs.iterator();
    int c = 0;
    // remove trivial
    while (git.hasNext()) {
        Prof p = git.next();
        if (p.size() < 2)
            git.remove();
        else if (p.size() == 2) {
            if (p.get(0).x == p.get(1).x) {
                git.remove();
                c++;
            }
        } else if (p.size() == 3) {
            if (p.get(0).x == p.get(1).x && p.get(2).y == p.get(1).y)
                git.remove();
        }
    }
    System.out.println("found " + globalProfs.size() + " interesting profiles" + " from " + profSets.size() + " runs");
    removeSimilarB(globalProfs, TweedSettings.settings.profilePrune);
    System.out.println("after remove similar " + globalProfs.size());
    // insert single vertical profile
    {
        Prof vertical = defaultProf(example);
        globalProfs.add(0, vertical);
    }
}
Also used : Line(org.twak.utils.Line) SuperLine(org.twak.viewTrace.SuperLine) MultiMap(org.twak.utils.collections.MultiMap) SuperLine(org.twak.viewTrace.SuperLine) List(java.util.List) ArrayList(java.util.ArrayList) MFPoint(org.twak.tweed.gen.FeatureCache.MFPoint)

Example 32 with Line

use of org.twak.utils.Line 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);
}
Also used : Color(java.awt.Color) XStream(com.thoughtworks.xstream.XStream) Arrays(java.util.Arrays) FloatBuffer(java.nio.FloatBuffer) HalfFace(org.twak.utils.geom.HalfMesh2.HalfFace) Type(com.jme3.scene.VertexBuffer.Type) Arrayz(org.twak.utils.collections.Arrayz) Loop(org.twak.utils.collections.Loop) Node(com.jme3.scene.Node) SkelGen(org.twak.tweed.gen.skel.SkelGen) MutableDouble(org.twak.utils.MutableDouble) ColorRGBAPainter(org.twak.viewTrace.ColorRGBAPainter) Map(java.util.Map) Cache(org.twak.utils.Cache) Material(com.jme3.material.Material) ChangeListener(javax.swing.event.ChangeListener) Streamz(org.twak.utils.collections.Streamz) Point3d(javax.vecmath.Point3d) ChangeEvent(javax.swing.event.ChangeEvent) VertexBuffer(com.jme3.scene.VertexBuffer) LoopL(org.twak.utils.collections.LoopL) Predicate(java.util.function.Predicate) Line(org.twak.utils.Line) HalfEdge(org.twak.utils.geom.HalfMesh2.HalfEdge) Set(java.util.Set) HalfMesh2(org.twak.utils.geom.HalfMesh2) CollisionResult(com.jme3.collision.CollisionResult) Vector2d(javax.vecmath.Vector2d) Collectors(java.util.stream.Collectors) FileNotFoundException(java.io.FileNotFoundException) MFPoint(org.twak.tweed.gen.FeatureCache.MFPoint) List(java.util.List) JSlider(javax.swing.JSlider) Optional(java.util.Optional) Rainbow(org.twak.utils.ui.Rainbow) CollisionResults(com.jme3.collision.CollisionResults) Mesh(com.jme3.scene.Mesh) Geometry(com.jme3.scene.Geometry) IntStream(java.util.stream.IntStream) ActionListener(java.awt.event.ActionListener) DBSCANClusterer(org.apache.commons.math3.ml.clustering.DBSCANClusterer) Vector2f(com.jme3.math.Vector2f) HashMap(java.util.HashMap) MiniFacade(org.twak.viewTrace.facades.MiniFacade) Cach(org.twak.utils.Cach) Plot(org.twak.utils.ui.Plot) SwingConstants(javax.swing.SwingConstants) TreeSet(java.util.TreeSet) Clusterable(org.apache.commons.math3.ml.clustering.Clusterable) Tweed(org.twak.tweed.Tweed) IndexBuffer(com.jme3.scene.mesh.IndexBuffer) ArrayList(java.util.ArrayList) TweedSettings(org.twak.tweed.TweedSettings) HashSet(java.util.HashSet) LinkedHashMap(java.util.LinkedHashMap) Mathz(org.twak.utils.Mathz) PaintThing(org.twak.utils.PaintThing) NoSuchElementException(java.util.NoSuchElementException) ProgressMonitor(javax.swing.ProgressMonitor) LinkedHashSet(java.util.LinkedHashSet) MatParam(com.jme3.material.MatParam) JButton(javax.swing.JButton) Texture2D(com.jme3.texture.Texture2D) Iterator(java.util.Iterator) MultiMap(org.twak.utils.collections.MultiMap) BufferUtils(com.jme3.util.BufferUtils) Vector3f(com.jme3.math.Vector3f) MeshBuilder(org.twak.siteplan.jme.MeshBuilder) MegaFacade(org.twak.tweed.gen.ProfileGen.MegaFacade) ModeCollector(org.twak.viewTrace.ModeCollector) JOptionPane(javax.swing.JOptionPane) MegaFeatures(org.twak.tweed.gen.FeatureCache.MegaFeatures) ActionEvent(java.awt.event.ActionEvent) File(java.io.File) Loopz(org.twak.utils.collections.Loopz) Point2d(javax.vecmath.Point2d) Jme3z(org.twak.siteplan.jme.Jme3z) Ray(com.jme3.math.Ray) SuperLine(org.twak.viewTrace.SuperLine) LineHeight(org.twak.viewTrace.facades.LineHeight) Format(com.jme3.scene.VertexBuffer.Format) Cluster(org.apache.commons.math3.ml.clustering.Cluster) ColorRGBA(com.jme3.math.ColorRGBA) FileReader(java.io.FileReader) ImageRaster(com.jme3.texture.image.ImageRaster) Comparator(java.util.Comparator) Collections(java.util.Collections) MutableDouble(org.twak.utils.MutableDouble) MegaFacade(org.twak.tweed.gen.ProfileGen.MegaFacade) HalfEdge(org.twak.utils.geom.HalfMesh2.HalfEdge) HalfFace(org.twak.utils.geom.HalfMesh2.HalfFace) MFPoint(org.twak.tweed.gen.FeatureCache.MFPoint) Line(org.twak.utils.Line) SuperLine(org.twak.viewTrace.SuperLine) TreeSet(java.util.TreeSet) SuperLine(org.twak.viewTrace.SuperLine) Cach(org.twak.utils.Cach) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) MultiMap(org.twak.utils.collections.MultiMap)

Example 33 with Line

use of org.twak.utils.Line in project chordatlas by twak.

the class SuperEdge method findRange.

public double[] findRange() {
    if (mini == null || mini.isEmpty() || mini.get(0).imageFeatures == null)
        return null;
    // todo: bad place for this method.
    Line mf = mini.get(0).imageFeatures.mega.megafacade;
    double mfL = mf.length();
    return new double[] { mf.findPPram(start) * mfL, mf.findPPram(end) * mfL };
}
Also used : SuperLine(org.twak.viewTrace.SuperLine) Line(org.twak.utils.Line)

Example 34 with Line

use of org.twak.utils.Line 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;
}
Also used : MegaFacade(org.twak.tweed.gen.ProfileGen.MegaFacade) HalfEdge(org.twak.utils.geom.HalfMesh2.HalfEdge) Line(org.twak.utils.Line) SuperLine(org.twak.viewTrace.SuperLine) Matrix4d(javax.vecmath.Matrix4d) Point2d(javax.vecmath.Point2d) Vector3d(javax.vecmath.Vector3d) Point3d(javax.vecmath.Point3d) SuperLine(org.twak.viewTrace.SuperLine) Cach(org.twak.utils.Cach)

Example 35 with Line

use of org.twak.utils.Line in project chordatlas by twak.

the class MiniFacade method getDistance.

@Override
public double getDistance(Point2d pt) {
    pt = flip(pt);
    if (contains(pt))
        return 0;
    double dist = Double.MAX_VALUE;
    for (Bounds b : new Bounds[] { XMIN, YMIN, XMAX, YMAX }) {
        Line l = getAsRect().getEdge(b);
        dist = Math.min(dist, l.distance(pt));
    }
    return dist;
}
Also used : Line(org.twak.utils.Line) Bounds(org.twak.utils.geom.DRectangle.Bounds)

Aggregations

Line (org.twak.utils.Line)59 Point2d (javax.vecmath.Point2d)38 ArrayList (java.util.ArrayList)25 SuperLine (org.twak.viewTrace.SuperLine)22 List (java.util.List)16 Point3d (javax.vecmath.Point3d)14 HashSet (java.util.HashSet)13 LinearForm (org.twak.utils.geom.LinearForm)13 HashMap (java.util.HashMap)12 Map (java.util.Map)11 Set (java.util.Set)11 HalfEdge (org.twak.utils.geom.HalfMesh2.HalfEdge)11 HalfFace (org.twak.utils.geom.HalfMesh2.HalfFace)11 Collectors (java.util.stream.Collectors)10 Vector2d (javax.vecmath.Vector2d)10 Iterator (java.util.Iterator)9 Vector3d (javax.vecmath.Vector3d)9 Tweed (org.twak.tweed.Tweed)8 TweedSettings (org.twak.tweed.TweedSettings)8 MFPoint (org.twak.tweed.gen.FeatureCache.MFPoint)8