Search in sources :

Example 1 with HalfFace

use of org.twak.utils.geom.HalfMesh2.HalfFace in project chordatlas by twak.

the class SuperMeshPainter method paint.

@Override
public void paint(Object oa, Graphics2D g2, PanMouseAdaptor ma) {
    HalfMesh2 o = (HalfMesh2) oa;
    double scatterRadius = 0.0;
    if (o.faces.isEmpty())
        return;
    double maxHeight = o.faces.stream().mapToDouble(x -> ((SuperFace) x).height).max().getAsDouble();
    // (int) ( Math.random() * 100 );
    int fc = 0;
    for (HalfFace f : o.faces) {
        fc++;
        Polygon pwt = new Polygon();
        try {
            for (HalfEdge e : f.edges()) {
                pwt.addPoint(ma.toX(e.start.x + Math.random() * scatterRadius), ma.toY(e.start.y + Math.random() * scatterRadius));
            // PaintThing.paint(e.start, g2, ma);
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }
        SuperFace sf = (SuperFace) f;
        Color c;
        if (false) {
            int h = (int) Mathz.clamp(((SuperFace) f).height * 5, 0, 255);
            if (((SuperFace) f).height == -Double.MAX_VALUE)
                c = Color.green;
            else if (((SuperFace) f).height < 0)
                c = Color.red;
            else
                c = new Color(h, h, h);
        } else if (sf.height == -Double.MAX_VALUE) {
            c = Color.yellow;
        } else if (sf.classification == -1 || sf.height < 0) {
            c = Color.red;
        } else {
            // c = Color.white;
            c = Rainbow.getColour(sf.classification + 1);
        // c = Rainbow.getColour( fc++ + 1 );
        }
        // c = Color.white;
        // new Color( c.getRed(), c.getGreen(), c.getBlue(), 50 ) );
        g2.setColor(c);
        g2.fill(pwt);
    // Loop<Point2d> pts = new Loop<>();
    // for ( HalfEdge e : f.edges() )
    // pts.append(e.end);
    // 
    // if ( ( Loopz.area( pts ) ) < 0.1 ) {
    // g2.setColor(Color.red);
    // g2.setStroke( new BasicStroke( 4f ) );
    // g2.draw( pwt );
    // }
    }
    for (HalfFace f : o.faces) {
        g2.setColor(Color.black);
        try {
            for (HalfEdge e : f) {
                SuperEdge se = (SuperEdge) e;
                g2.setColor(Color.black);
                if (se.proceduralFacade != null) {
                    g2.setStroke(new BasicStroke(3f));
                } else {
                    g2.setStroke(new BasicStroke(1f));
                }
            // if ( se.profLine != null || ( se.over != null && ((SuperEdge)se.over).profLine != null ) ) {
            // g2.setStroke( new BasicStroke( 2f ) );
            // g2.setColor( new Color (255, 0, 0 ) );
            // }
            // else
            // {
            // g2.setStroke( new BasicStroke( 1f ) );
            // g2.setColor( Color.black );
            // }
            // g2.setColor( ((SuperEdge)e).profLine == null? Color.green : Color.magenta);
            // PaintThing.paint ( e.line(), g2, ma );
            // }
            }
        } catch (Throwable th) {
            th.printStackTrace();
        }
        g2.setStroke(new BasicStroke(3));
        if (false)
            for (HalfEdge e : f.edges()) {
                SuperEdge se = (SuperEdge) e;
                if (se.profLine != null) {
                    // g2.setColor( Color.BLACK );
                    // new Line (new Point2d (e.start), new Point2d (e.end));
                    Line l = se.line();
                    // PaintThing.drawArrow( g2, ma, l, 5 );
                    g2.drawLine(ma.toX(l.start.x), ma.toY(l.start.y), ma.toX(l.end.x), ma.toY(l.end.y));
                }
            // if (e.over != null)
            // {
            // l.moveLeft( ma.fromZoom( 2 ) );
            // 
            // double delta = Math.abs (  ((SuperEdge)e).localHeight - ((SuperEdge)e.over).localHeight );
            // 
            // int h =  (int) Math.min(255, delta * 10 ) ;
            // g2.setColor ( new Color (0,h,h) );
            // g2.setStroke (new BasicStroke( 3f ));
            // 
            // }
            // if ( ( (SuperEdge) e ).debug ) {
            // if ( e.over == null || ((SuperFace)e.over.face).classification != ((SuperFace)f).classification ) {
            // g2.setColor( Color.black );
            // g2.setStroke( new BasicStroke( 2 ) );
            // PaintThing.paint( e.line(), g2, ma );
            // }
            }
    }
    fc = 0;
    if (false)
        for (HalfFace f : o.faces) {
            for (HalfEdge e : f.edges()) {
                // Point2d pt = new Point2d(e.start);
                // pt.add( off );
                // Point2d pt2 = new Point2d(e.end);
                // pt2.add( off );
                // 
                // PaintThing.paint( new Line (pt, pt2) , g2, ma );
                g2.setColor(new Color(255, 0, 0, 20));
                if (e.line().absAngle(e.next.line()) > Math.PI - 0.001) {
                    g2.setColor(new Color(0, 255, 0, 255));
                }
                PaintThing.paint(new Line(e.start, e.end), g2, ma);
                PaintThing.paint(new Line(e.next.start, e.next.end), g2, ma);
            }
        // for ( HalfEdge e : f.edges() ) {
        // PaintThing.drawArrow( g2, ma, e.line(), 5 );
        // }
        }
    if (false)
        for (HalfFace f : o.faces) for (HalfEdge e : f.edges()) {
            if (e.face != f || (e.over != null && (e.over.over != e || !o.faces.contains(e.over.face))) || e.face == null || e.start == null || e.end == null || e.next == null) {
                g2.setColor(Color.red);
                g2.setStroke(new BasicStroke(4));
                PaintThing.paint(e.line(), g2, ma);
            }
        }
}
Also used : BasicStroke(java.awt.BasicStroke) Line(org.twak.utils.Line) Color(java.awt.Color) HalfEdge(org.twak.utils.geom.HalfMesh2.HalfEdge) HalfFace(org.twak.utils.geom.HalfMesh2.HalfFace) Polygon(java.awt.Polygon) SuperFace(org.twak.tweed.gen.SuperFace) SuperEdge(org.twak.tweed.gen.SuperEdge) HalfMesh2(org.twak.utils.geom.HalfMesh2)

Example 2 with HalfFace

use of org.twak.utils.geom.HalfMesh2.HalfFace in project chordatlas by twak.

the class GurobiSkelSolver method buildColouringProblem.

private void buildColouringProblem() throws GRBException {
    Random randy = new Random();
    for (int f = 0; f < mesh.faces.size(); f++) {
        // create face colors
        SuperFace sf = (SuperFace) mesh.faces.get(f);
        // f2i.put( sf, f );
        // int startCol = 0;
        // 
        // for (HalfFace n : sf.getNeighbours()) {
        // Integer ni;
        // if ( (ni = f2i.get( (SuperFace) n ) ) != null ) {
        // 
        // int nc = -1;
        // for ( int c = 0; c < colors; c++ )
        // if ( setVars.get(  xfc[ni][c] ) == 1)
        // nc = c;
        // 
        // if (nc == startCol)
        // startCol++;
        // 
        // }
        // }
        // if (startCol == colors)
        int startCol = randy.nextInt(colors);
        FaceVars fv;
        faceInfo.put(sf, fv = new FaceVars());
        fv.color = new GRBVar[colors];
        for (int c = 0; c < colors; c++) {
            fv.color[c] = model.addVar(0.0, 1.0, 0.0, GRB.BINARY, FACE_COLOR);
            set(fv.color[c], c == startCol ? 1 : 0);
        }
    }
    for (HalfFace f : mesh) {
        FaceVars fv = faceInfo.get(f);
        GRBLinExpr expr = new GRBLinExpr();
        for (int c = 0; c < colors; c++) expr.addTerm(1, fv.color[c]);
        model.addConstr(expr, GRB.EQUAL, 1, "overlap_" + f);
    }
}
Also used : GRBLinExpr(gurobi.GRBLinExpr) Random(java.util.Random) HalfFace(org.twak.utils.geom.HalfMesh2.HalfFace) MFPoint(org.twak.tweed.gen.FeatureCache.MFPoint)

Example 3 with HalfFace

use of org.twak.utils.geom.HalfMesh2.HalfFace in project chordatlas by twak.

the class GurobiSkelSolver method findNear.

public static List<HalfEdge> findNear(Line l, Point2d start, HalfMesh2 mesh2) {
    double tol = 4;
    l = new Line(l);
    l.moveLeft(tol);
    List<HalfEdge> out = new ArrayList<>();
    for (HalfFace f : mesh2) try {
        for (HalfEdge e : f) {
            if (e.end.distanceSquared(start) < tol * tol && l.isOnLeft(e.start) && l.isOnLeft(e.end) && Mathz.inRangeTol(e.line().absAngle(e.next.line()), Mathz.PI2, 1)) {
                double angle = l.absAngle(e.line());
                if (// regular T-jn on edge or left corner
                (e.next.over == null && Mathz.inRangeTol(angle, Mathz.PI2, 1)) || // right corner
                (e.over == null && e.next.over == null && angle < 1))
                    out.add(e);
            }
        }
    } catch (Throwable th) {
        th.printStackTrace();
    }
    return out;
}
Also used : Line(org.twak.utils.Line) ArrayList(java.util.ArrayList) HalfEdge(org.twak.utils.geom.HalfMesh2.HalfEdge) HalfFace(org.twak.utils.geom.HalfMesh2.HalfFace)

Example 4 with HalfFace

use of org.twak.utils.geom.HalfMesh2.HalfFace in project chordatlas by twak.

the class HouseTool method clickedOn.

@Override
public void clickedOn(Spatial target, Vector3f loc, Vector2f cursorPosition) {
    // (Line) new XStream().fromXML( new File( "/home/twak/data/regent/March_30/congo/1/line.xml" ) ));
    MegaFeatures mf = new MegaFeatures(new Line(0, 0, 10, 0));
    // FeatureCache.readFeatures( new File( "/home/twak/data/regent/March_30/congo/1/0" ), mf );
    ImageFeatures imf = new ImageFeatures();
    imf.mega = mf;
    double[] minMax = new double[] { 0, 15, 0, 25 };
    HalfMesh2.Builder builder = new HalfMesh2.Builder(SuperEdge.class, SuperFace.class);
    builder.newPoint(new Point2d(minMax[0] + loc.x, minMax[3] + loc.z));
    builder.newPoint(new Point2d(minMax[1] + loc.x, minMax[3] + loc.z));
    builder.newPoint(new Point2d(minMax[1] + loc.x, minMax[2] + loc.z));
    builder.newPoint(new Point2d(minMax[0] + loc.x, minMax[2] + loc.z));
    builder.newFace();
    HalfMesh2 mesh = builder.done();
    Prof p = new Prof();
    p.add(new Point2d(0, 0));
    p.add(new Point2d(0, 20));
    p.add(new Point2d(-5, 25));
    boolean first = true;
    for (HalfFace f : mesh) {
        for (HalfEdge e : f) {
            SuperEdge se = (SuperEdge) e;
            se.prof = p;
            MiniFacade mini = newMini(imf, se.length());
            if (true) {
                se.addMini(mini);
                se.proceduralFacade = mf;
                se.toEdit = mini;
                if (first)
                    se.addMini(mini);
            }
            first = false;
        }
        SuperFace sf = (SuperFace) f;
        sf.maxProfHeights = new ArrayList();
        sf.maxProfHeights.add(Double.valueOf(100));
        sf.height = 100;
    }
    SkelGen sg = new SkelGen(mesh, tweed, null);
    tweed.frame.addGen(sg, true);
}
Also used : MiniFacade(org.twak.viewTrace.facades.MiniFacade) ImageFeatures(org.twak.tweed.gen.FeatureCache.ImageFeatures) MegaFeatures(org.twak.tweed.gen.FeatureCache.MegaFeatures) ArrayList(java.util.ArrayList) HalfEdge(org.twak.utils.geom.HalfMesh2.HalfEdge) HalfFace(org.twak.utils.geom.HalfMesh2.HalfFace) SuperEdge(org.twak.tweed.gen.SuperEdge) SuperFace(org.twak.tweed.gen.SuperFace) SkelGen(org.twak.tweed.gen.skel.SkelGen) Line(org.twak.utils.Line) Point2d(javax.vecmath.Point2d) HalfMesh2(org.twak.utils.geom.HalfMesh2) Prof(org.twak.tweed.gen.Prof)

Example 5 with HalfFace

use of org.twak.utils.geom.HalfMesh2.HalfFace in project chordatlas by twak.

the class SkelGen method calculate.

@Override
public void calculate() {
    for (Spatial s : gNode.getChildren()) s.removeFromParent();
    Node pNode = new Node();
    if (toRender != null)
        for (int i = 0; i < toRender.faces.size(); i++) try {
            HalfFace f = toRender.faces.get(i);
            SuperFace sf = (SuperFace) f;
            PlanSkeleton skel = calc(sf);
            if (skel != null)
                setSkel(skel, skel.output, sf);
        } catch (Throwable th) {
            th.printStackTrace();
        }
    if (!pNode.getChildren().isEmpty())
        tweed.frame.addGen(new JmeGen("sProfs", tweed, pNode), false);
    gNode.updateModelBound();
    gNode.updateGeometricState();
    super.calculate();
}
Also used : PlanSkeleton(org.twak.siteplan.campskeleton.PlanSkeleton) Spatial(com.jme3.scene.Spatial) Node(com.jme3.scene.Node) HalfFace(org.twak.utils.geom.HalfMesh2.HalfFace) JmeGen(org.twak.tweed.gen.JmeGen) SuperFace(org.twak.tweed.gen.SuperFace)

Aggregations

HalfFace (org.twak.utils.geom.HalfMesh2.HalfFace)28 HalfEdge (org.twak.utils.geom.HalfMesh2.HalfEdge)24 MFPoint (org.twak.tweed.gen.FeatureCache.MFPoint)12 Line (org.twak.utils.Line)12 Point2d (javax.vecmath.Point2d)10 SuperLine (org.twak.viewTrace.SuperLine)10 ArrayList (java.util.ArrayList)8 MegaFeatures (org.twak.tweed.gen.FeatureCache.MegaFeatures)8 HashMap (java.util.HashMap)7 HashSet (java.util.HashSet)7 LinkedHashSet (java.util.LinkedHashSet)7 Vector2d (javax.vecmath.Vector2d)6 HalfMesh2 (org.twak.utils.geom.HalfMesh2)6 Node (com.jme3.scene.Node)5 Color (java.awt.Color)5 LinkedHashMap (java.util.LinkedHashMap)5 Map (java.util.Map)5 MegaFacade (org.twak.tweed.gen.ProfileGen.MegaFacade)5 MultiMap (org.twak.utils.collections.MultiMap)5 Material (com.jme3.material.Material)4