use of javax.vecmath.Vector2d in project chordatlas by twak.
the class SolverState method miniPainter.
public ICanPaint miniPainter() {
return new ICanPaint() {
@Override
public void paint(Graphics2D g, PanMouseAdaptor ma) {
// for ( MegaFeatures f : SS.minis.keySet() ) {
//
// for ( MFPoint mfp : SS.minis.get( f ) ) {
// Line l = mfp.image.mega.megafacade;
//
// spreadImages( g, ma, l, mfp, Listz.from( mfp.left, mfp.right ) );
//
// }
// }
// if (SS.minis == null)
int brake = 100;
for (HalfFace f : mesh) {
for (HalfEdge e : f) {
if (e.over != null)
continue;
if (brake-- < 0)
break;
SuperEdge se = (SuperEdge) e;
if (se.mini == null)
continue;
List<MiniFacade> mfs = new ArrayList(se.mini);
// while (mfs .size() < 2)
// mfs.add(null);
spreadImages(g, ma, se.line(), se.line().fromPPram(0.5), mfs);
}
}
int i = 0;
if (minis != null)
for (MegaFeatures f : minis.keySet()) {
// PaintThing.paint (f.megafacade, g, ma);
DumbCluster1D<MFPoint> res = GurobiSkelSolver.clusterMinis(f, minis);
Vector2d dir = f.megafacade.dir();
Vector2d out = new Vector2d(dir);
out.set(-out.y, out.x);
out.scale(ma.toZoom(2) / out.length());
for (Cluster<MFPoint> c : res) {
g.setColor(Rainbow.getColour(i++));
for (MFPoint mfp : c.things) {
Point2d pt = new Point2d(mfp);
pt.add(out);
g.setStroke(new BasicStroke(0.2f));
PaintThing.paint(pt, g, ma);
g.setStroke(new BasicStroke(0.2f));
for (HalfEdge e : GurobiSkelSolver.findNear(f.megafacade, mfp, mesh)) g.drawLine(ma.toX(pt.x), ma.toY(pt.y), ma.toX(e.end.x), ma.toY(e.end.y));
if (mfp.selectedEdge != null) {
g.setStroke(new BasicStroke(2f));
g.drawLine(ma.toX(pt.x), ma.toY(pt.y), ma.toX(mfp.selectedEdge.end.x), ma.toY(mfp.selectedEdge.end.y));
}
}
}
}
g.setStroke(new BasicStroke(1));
}
private void spreadImages(Graphics2D g, PanMouseAdaptor ma, Line sel, Point2d cen, List<MiniFacade> mfs) {
Vector2d perp = sel.dir();
perp.set(-perp.y, perp.x);
perp.normalize();
for (int i = 0; i < mfs.size(); i++) {
MiniFacade mf = mfs.get(i);
Vector2d p2 = new Vector2d(perp);
p2.scale((i + 1) * 10);
p2.add(cen);
if (mf == null) {
g.setColor(Color.black);
g.fillRect(ma.toX(p2.x - 1), ma.toY(p2.y - 3), ma.toZoom(2), ma.toZoom(6));
continue;
}
double w = mf.width * 0.1;
double h = mf.height * 0.1;
mf.paintImage(g, ma, p2.x - w, p2.y - h, p2.x + w, p2.y + h);
}
}
};
}
use of javax.vecmath.Vector2d in project chordatlas by twak.
the class Prof method parameterize.
public static // all profs from a single profile-edge are in the same 2D space, with strange x-origin
Prof parameterize(// all profs from a single profile-edge are in the same 2D space, with strange x-origin
List<Prof> in) {
// double toProfileEdge;
// {
// Prof eg = in.iterator().next();
// Point3d p = Pointz.to3( profileEdge.start );
// toProfileEdge = eg.to2d( p ).x;
// }
double avgMinY = in.stream().filter(p -> p != null).mapToDouble(p -> p.get(0).y).average().getAsDouble();
Set<Line> lines = new HashSet<>();
for (Prof p : in) for (int i = 1; i < p.size(); i++) lines.add(new Line(p.get(i - 1), p.get(i)));
SliceParameters P = new SliceParameters(5);
P.FL_REGRESS = true;
P.FL_BINS = 20;
// double A = 0.4; // simple = 0.4
// double B = 0.1; // simple = 1;
// simple = 0.4
double A = 0.2;
// simple = 0.1;
double B = 0.3;
// simple = 0.1; rotate threshold, radians
double C = 0.1;
double firstFloorHeight = 2;
P.MIN_LINES = Math.max(1, in.size() * A);
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) >= 10)
return Mathz.PI2;
int aBinI = aBin.maxI();
return aBin.val(aBinI);
}
protected double getTolNearLine(Point2d p) {
return P.FL_NEAR_LINE * (p.y < avgMinY + firstFloorHeight ? 5 : B);
}
protected double getTolNearLine2(Point2d p) {
return P.FL_NEAR_LINE_2 * (p.y < avgMinY + firstFloorHeight ? 10 : B);
}
protected double getTolRemoveAngle(Line l) {
return l.start.y < avgMinY + firstFloorHeight ? Math.PI * 0.5 : Math.PI * 0.2;
}
}.result.all;
List<Line> llines = // is rubbish
lines.stream().filter(l -> l.lengthSquared() > 0.001).filter(// is floor polygon
l -> l.end.y > avgMinY + 1 || Math.abs(l.start.y - l.end.y) > 0.1).collect(Collectors.toList());
Prof clean = new Prof(in.get(in.size() / 2));
clean.clear();
if (llines.isEmpty()) {
clean.add(new Point2d(0, 0));
clean.add(new Point2d(0, 1));
return clean;
}
for (int i = 0; i < llines.size(); i++) {
Line l = llines.get(i);
double angle = l.aTan2();
if (angle < Mathz.PI2 + C && angle > Mathz.PI2 - C)
llines.set(i, FindLines.rotateToAngle(l, l.fromPPram(0.5), Mathz.PI2));
}
// 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.fromPPram(0.2).y, o2.fromPPram(0.2).y);
}
});
// for (Line l : llines)
// PaintThing.debug( new Color(170,0,255), 2f, new Line( l.start.x+5, -l.start.y, l.end.x+5, -l.end.y ) );
Line lastL = null;
Point2d lastP = new Point2d(0, -Double.MAX_VALUE);
for (Line l : llines) {
// if (c >= 6)
// continue;
// if ( c== 5)
// System.out.println("here");
// c++;
Point2d mid = l.fromPPram(0.5);
if (!(lastL != null && !lastL.isOnLeft(mid) || (lastP.y == -Double.MAX_VALUE || (mid.y >= lastP.y - 0.5 && mid.x <= lastP.x + 0.5))))
continue;
boolean startAbove = l.start.y >= lastP.y && l.start.x <= lastP.x, endAbove = l.end.y >= lastP.y && l.end.x <= lastP.x;
if (l.end.y < l.start.y)
l.end.y = l.start.y;
if (startAbove && endAbove) {
// okay
} else {
if (lastL != null && l.start.distanceSquared(lastP) < 9) {
Point2d sec = lastL.intersects(l, false);
if (sec != null && sec.distanceSquared(lastP) < 9 && sec.x <= lastL.start.x && sec.y >= lastL.start.y) {
clean.remove(clean.size() - 1);
clean.add(sec);
lastP = sec;
l.start = sec;
} else if (l.start.x < lastP.x) {
sec = new LinearForm(new Vector2d(1, 0)).findC(l.start).intersect(new LinearForm(lastL));
if (sec != null && sec.distanceSquared(lastP) < 9) {
clean.remove(clean.size() - 1);
clean.add(sec);
lastP = sec;
}
}
}
if (l.start.x > lastP.x + 0.01 || l.end.x > lastP.x + 0.01) {
Point2d sec = new LinearForm(new Vector2d(0, 1)).findC(new Point2d(lastP.x, 0)).intersect(new LinearForm(l));
if (sec != null && sec.distanceSquared(lastP) < 9 && sec.distanceSquared(l.start) < 9) {
if (l.start.x > lastP.x)
l.start = sec;
else
l.end = sec;
}
}
}
if (lastL != null && l.start.distanceSquared(lastP) < 4) {
Point2d sec = lastL.intersects(l, false);
if (sec != null && (sec.distanceSquared(lastP) < 4 || Math.abs(sec.y - lastP.y) < 1) && sec.x <= lastL.start.x && sec.y >= lastL.start.y) {
clean.remove(clean.size() - 1);
clean.add(sec);
lastP = sec;
l.start = sec;
} else if (l.start.x < lastP.x) {
sec = new LinearForm(new Vector2d(1, 0)).findC(l.start).intersect(new LinearForm(lastL));
if (sec != null && (sec.distanceSquared(lastP) < 4 || Math.abs(sec.y - lastP.y) < 1)) {
clean.remove(clean.size() - 1);
clean.add(sec);
lastP = sec;
// l.start = sec;
}
}
}
if (lastP.y - l.end.y < 3 && l.end.x - lastP.x < 3) {
for (Point2d pt : l.points()) {
pt.x = Math.min(pt.x, lastP.x);
pt.y = Math.max(pt.y, lastP.y);
}
if (!l.start.equals(l.end))
for (Point2d pt : l.points()) {
// if (c == 2)
// PaintThing.debug.put(1, new Point2d ( pt.x, -pt.y ) );
pt = new Point2d(pt);
pt.x = Math.min(pt.x, lastP.x);
pt.y = Mathz.max(0, pt.y, lastP.y);
if (clean.isEmpty() && pt.y > 0.2) {
clean.add(new Point2d(pt.x, 0));
}
if (lastP != null && pt.distanceSquared(lastP) > 0.02) {
clean.add(pt);
}
lastP = clean.get(clean.size() - 1);
if (clean.size() >= 3) {
Point2d a = clean.get(clean.size() - 1), b = clean.get(clean.size() - 2), c = clean.get(clean.size() - 3);
if (Math.abs(Mathz.area(c, b, a)) < 0.1 || Mathz.absAngleBetween(a, b, c) < 0.1)
clean.remove(clean.size() - 2);
}
}
}
if (clean.size() >= 2)
lastL = new Line(clean.get(clean.size() - 2), clean.get(clean.size() - 1));
}
return clean;
}
use of javax.vecmath.Vector2d in project chordatlas by twak.
the class SkelFootprint method cleanFootprints.
private static void cleanFootprints(HalfMesh2 mesh) {
for (HalfFace hf : mesh.faces) for (HalfEdge e : hf.edges()) if (e.over != null && e.over.face != e.face)
e.over = null;
Map<HalfEdge, Double> mergePoint = new HashMap();
Predicate<HalfEdge> badEdges = new Predicate<HalfMesh2.HalfEdge>() {
@Override
public boolean test(HalfEdge t) {
if (// is edge within a single face
t.over != null)
// preserve as hole-marker
return false;
double len = t.length();
if (t.length() < 0.2) {
mergePoint.put(t, 0.5);
return true;
}
double angleNext = t.line().absAngle(t.next.line());
final double tol = 0.1;
if (t.next.over == null && len < t.next.length() && angleNext > Math.PI - tol) {
mergePoint.put(t, 0.);
return true;
}
if (t.next.over == null && angleNext < tol) {
mergePoint.put(t, 0.);
return true;
}
HalfEdge prev = t.findBefore();
double anglePrev = t.line().absAngle(prev.line());
if (prev.over == null && len <= prev.length() && anglePrev > Math.PI - tol) {
mergePoint.put(t, 1.);
return true;
}
if (prev.over == null && anglePrev < tol) {
mergePoint.put(t, 1.);
return true;
}
return false;
}
};
f: for (HalfFace f : new ArrayList<>(mesh.faces)) {
Set<HalfEdge> togo = Streamz.stream(f.edges()).filter(badEdges).collect(Collectors.toSet());
while (!togo.isEmpty()) {
HalfEdge g = togo.iterator().next(), p = g.findBefore(), n = g.next;
togo.remove(g);
togo.remove(p);
togo.remove(n);
if (g.replaceByPoint(mesh, g.line().fromPPram(mergePoint.get(g))))
continue f;
HalfEdge pp = p.findBefore();
Streamz.stream(pp, p, n, n.next).forEach(o -> togo.remove(o));
Streamz.stream(pp, p, n, n.next).filter(badEdges).forEach(e -> togo.add(e));
}
}
for (HalfFace f : mesh.faces) {
Set<Point2d> seen = new HashSet<>();
for (HalfEdge e : f) {
if (seen.contains(e.end) && e.over == null && e.next.over == null) {
HalfEdge n = e.next;
Point2d edited;
Vector2d b4 = e.line().dir(), af = n.line().dir();
b4.normalize();
af.normalize();
b4.set(b4.y, -b4.x);
af.set(af.y, -af.x);
b4.add(af);
b4.scale(1 / b4.length());
edited = new Point2d(b4);
edited.add(e.end);
n.start = edited;
e.end = new Point2d(edited);
}
seen.add(e.end);
}
}
}
use of javax.vecmath.Vector2d in project ct.js by ChatTriggers.
the class Shape method draw.
/**
* Draws the shape onto the client's overlay.
*
* @return The shape to allow for method chaining
*/
public Shape draw() {
float a = (float) (this.color >> 24 & 255) / 255.0F;
float r = (float) (this.color >> 16 & 255) / 255.0F;
float g = (float) (this.color >> 8 & 255) / 255.0F;
float b = (float) (this.color & 255) / 255.0F;
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
GlStateManager.enableBlend();
GlStateManager.disableTexture2D();
GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
GlStateManager.color(r, g, b, a);
worldrenderer.begin(this.drawMode, DefaultVertexFormats.POSITION);
for (Vector2d vertex : this.vertexes) worldrenderer.pos(vertex.getX(), vertex.getY(), 0.0D).endVertex();
tessellator.draw();
GlStateManager.color(1, 1, 1, 1);
GlStateManager.enableTexture2D();
GlStateManager.disableBlend();
GlStateManager.popMatrix();
GlStateManager.pushMatrix();
return this;
}
use of javax.vecmath.Vector2d in project ct.js by ChatTriggers.
the class Shape method setLine.
/**
* Sets the shape as a line pointing from x1 y1 to x2 y2
*
* @param x1 The x starting position
* @param y1 The y starting position
* @param x2 The x ending position
* @param y2 The y ending position
* @param thickness The thickness
* @return The shape to allow for method chaining
*/
public Shape setLine(float x1, float y1, float x2, float y2, float thickness) {
this.vertexes.clear();
double theta = -Math.atan2(y2 - y1, x2 - x1);
double i = Math.sin(theta) * (thickness / 2);
double j = Math.cos(theta) * (thickness / 2);
double ax = x1 + i;
double ay = y1 + j;
double dx = x1 - i;
double dy = y1 - j;
double bx = x2 + i;
double by = y2 + j;
double cx = x2 - i;
double cy = y2 - j;
this.vertexes.add(new Vector2d(ax, ay));
this.vertexes.add(new Vector2d(bx, by));
this.vertexes.add(new Vector2d(cx, cy));
this.vertexes.add(new Vector2d(dx, dy));
this.drawMode = 9;
return this;
}
Aggregations