use of org.twak.viewTrace.facades.Tube.CrossGen in project chordatlas by twak.
the class GreebleEdge method roofGreeble.
public static boolean roofGreeble(Face f, MeshBuilder roof) {
boolean isWall = isWall(f);
for (Loop<SharedEdge> sl : f.edges) {
for (Loopable<SharedEdge> sel : sl.loopableIterator()) {
SharedEdge se = sel.get();
boolean otherIsWall = isWall(se.getOther(f));
if (!isWall && !otherIsWall) {
Face oF = se.getOther(f);
if (oF == null || order(f, oF) || f.edge.getPlaneNormal().angle(oF.edge.getPlaneNormal()) < 0.4)
continue;
List<LinearForm3D> start = new ArrayList(), end = new ArrayList<>();
{
SharedEdge fPrev = se.getAdjEdge(f, false), fNext = se.getAdjEdge(f, true), ofPrev = se.getAdjEdge(oF, false), ofNext = se.getAdjEdge(oF, true);
if (fNext == null || fPrev == null || ofNext == null || ofPrev == null)
continue;
double overHang = -0.03;
if (isWall(fNext.getOther(f)))
end.add(toLF(fNext.getOther(f), overHang));
else
end.add(roofTween(fNext, se, f));
if (isWall(ofPrev.getOther(oF)))
end.add(toLF(ofPrev.getOther(oF), overHang));
else
end.add(roofTween(se, ofPrev, oF));
if (isWall(fPrev.getOther(f)))
start.add(toLF(fPrev.getOther(f), overHang));
else
start.add(roofTween(se, fPrev, f));
if (isWall(ofNext.getOther(oF)))
start.add(toLF(ofNext.getOther(oF), overHang));
else
start.add(roofTween(ofNext, se, oF));
}
Point3d s = se.getStart(f), e = se.getEnd(f);
if (end.contains(null) || start.contains(null))
continue;
Tube.tube(roof, end, start, new Line3d(new Point3d(s.x, s.z, s.y), new Point3d(e.x, e.z, e.y)), toLF(f, 0), toLF(oF, 0), new CrossGen() {
@Override
public List<Point2d> gen(Vector2d left, Vector2d right) {
Vector2d l = new Vector2d(left);
l.normalize();
Vector2d lP = new Vector2d(l.y, -l.x);
Vector2d r = new Vector2d(right);
r.normalize();
Vector2d rP = new Vector2d(-r.y, r.x);
List<Point2d> out = new ArrayList();
double width = 0.15, height = 0.03;
Vector2d rn = new Vector2d(r);
rn.negate();
// height / Math.sin ( ( Math.PI - l.angle( rn ) ) /2 );
double cenOffset = 0.02;
Vector2d cen = new Vector2d(lP);
cen.add(rP);
cen.normalize();
for (double[] coords : new double[][] { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, -width }, { 0, 0, 0, height, -width }, { 0, 0, cenOffset, 0, 0 }, { -width, height, 0, 0, 0 }, { -width, 0, 0, 0, 0 } }) {
Point2d tmp = new Point2d(l), tmp2;
tmp.scale(coords[0]);
tmp2 = new Point2d(lP);
tmp2.scale(coords[1]);
tmp.add(tmp2);
tmp2 = new Point2d(cen);
tmp2.scale(coords[2]);
tmp.add(tmp2);
tmp2 = new Point2d(rP);
tmp2.scale(coords[3]);
tmp.add(tmp2);
tmp2 = new Point2d(r);
tmp2.scale(coords[4]);
tmp.add(tmp2);
out.add(tmp);
}
return out;
}
});
}
}
}
return true;
}
use of org.twak.viewTrace.facades.Tube.CrossGen in project chordatlas by twak.
the class GreebleGrid method moulding.
protected void moulding(Matrix4d to3d, DRectangle rect, MeshBuilder mb) {
double hh = rect.height / 2;
Point3d start = new Point3d(rect.x, 0, rect.y + hh), end = new Point3d(rect.getMaxX(), 0, rect.y + hh);
to3d.transform(start);
to3d.transform(end);
Line3d line = new Line3d(start, end);
Vector3d dir = line.dir();
dir.normalize();
Vector3d nDir = new Vector3d(dir);
nDir.scale(-1);
LinearForm3D left = new LinearForm3D(nDir, start), right = new LinearForm3D(dir, end);
LinearForm3D wall = new LinearForm3D(to3d.m01, to3d.m11, to3d.m21);
wall.findD(start);
Tube.tube(mb, Collections.singleton(left), Collections.singleton(right), line, wall, wall, new CrossGen() {
@Override
public List<Point2d> gen(Vector2d down, Vector2d up) {
Vector2d d = new Vector2d(down);
d.normalize();
Vector2d dP = new Vector2d(d.y, -d.x);
List<Point2d> out = new ArrayList();
for (double[] coords : new double[][] { { 1.00, 0.00 }, { 1.00, 0.05 }, { 0.66, 0.05 }, { 0.66, 0.10 }, { 0.33, 0.10 }, { 0.33, 0.17 }, { 0.00, 0.17 }, { 0.00, 0.00 } }) {
Point2d tmp = new Point2d(d);
tmp.scale(coords[0] * rect.height - hh);
Point2d tmp2 = new Point2d(dP);
tmp2.scale(coords[1]);
tmp.add(tmp2);
out.add(tmp);
}
return out;
}
});
}
Aggregations