public static LinePoints2d[] polygonalChaniToLineArray(Point2d... lines) { LinePoints2d[] linesArray = new LinePoints2d[lines.length - 1]; for (int i = 0; i < lines.length - 1; i++) { Point2d p1 = lines[i]; Point2d p2 = lines[i + 1]; linesArray[i] = new LinePoints2d(p1, p2); } return linesArray; }
private boolean isSegmentInFrontOfLine(Point2d begin, Point2d end, LinePoints2d line) { double beginDet = LineUtil.matrixDet(line.getP1(), line.getP2(), begin); double endDet = LineUtil.matrixDet(line.getP1(), line.getP2(), end); if (equalZero(beginDet, EPSILON)) { beginDet = 0; } if (equalZero(endDet, EPSILON)) { endDet = 0; } if (beginDet > 0 && (endDet >= 0)) { return true; } if (endDet > 0 && (beginDet >= 0)) { return true; } return false; }
/** * Calc height of point in border. * * @param point * @param lines * @param planes * @return */ private double calcHeight(Point2d point, LinePoints2d[] lines, Plane3d[] planes) { double x = point.x; double z = -point.y; for (int i = 0; i < lines.length; i++) { LinePoints2d line_mi = lines[i]; LinePoints2d line = lines[(i + 1) % lines.length]; if (line_mi.inFront(point) && !line.inFront(point)) { return planes[i].calcYOfPlane(x, z); } } log.warn("this should not happen"); return 0; // planes[planes.length-1].calcYOfPlane(x, z); }
final LinePoints2d middleLine = new LinePoints2d(new Point2d(0, l1), new Point2d(recWidth, l1)); normalBottom.normalize(); Point3d planePoint = new Point3d(middleLine.getP1().x, h1, -middleLine.getP1().y); Point2d rightBottom = new Point2d(recWidth, leftBottomY); final LinePoints2d leftBottomLine = new LinePoints2d(leftBottom, leftCenter); final LinePoints2d leftTopLine = new LinePoints2d(leftCenter, leftTop); final LinePoints2d rightBottomLine = new LinePoints2d(rightBottom, rightCenter); final LinePoints2d rightTopLine = new LinePoints2d(rightCenter, rightTop);
private LinePoints2d[] createLines(List<Point2d> polygon, Point2d middlePoint) { int size = polygon.size(); LinePoints2d[] ret = new LinePoints2d[size]; for (int i = 0; i < size; i++) { Point2d p1 = polygon.get(i); LinePoints2d l = new LinePoints2d(middlePoint, p1); ret[i] = l; } return ret; }
boolean isSegmentInFrontOfLine(Point2d begin, Point2d end, LinePoints2d line) { double beginDet = LineUtil.matrixDet(line.getP1(), line.getP2(), begin); double endDet = LineUtil.matrixDet(line.getP1(), line.getP2(), end); if (equalZero(beginDet, EPSILON)) { beginDet = 0; } if (equalZero(endDet, EPSILON)) { endDet = 0; } if (beginDet > 0 && (endDet >= 0)) { return true; } if (endDet > 0 && (beginDet >= 0)) { return true; } return false; }
double z = -point.y; if (lt.inFront(point)) { if (rt.inFront(point)) { return planeTop.calcYOfPlane(x, z); if (lb.inFront(point)) { return planeLeft.calcYOfPlane(x, z); if (rb.inFront(point)) { if (!rt.inFront(point)) { return planeRight.calcYOfPlane(x, z); if (!lb.inFront(point)) { return planeButtom.calcYOfPlane(x, z);
/** * @param crossSection * @return */ public static LinePoints2d[] createLines(List<CrossSectionElement> crossSection) { LinePoints2d[] lines = new LinePoints2d[crossSection.size()]; for (int i = 0; i < crossSection.size(); i++) { Point2d p = crossSection.get(i).p; LinePoints2d l = new LinePoints2d(new Point2d(0, p.x), new Point2d(1, p.x)); lines[i] = l; } return lines; }
double z = -point.y; if (lbLine.inFront(point) && ltLine.inFront(point)) { if (lLine.inFront(point)) { return planeLeft.calcYOfPlane(x, z); } else if (rtLine.inFront(point) && rbLine.inFront(point)) { if (rLine.inFront(point)) { return planeRight.calcYOfPlane(x, z); } else if (mLine.inFront(point)) { if (tLine.inFront(point)) { return planeTop.calcYOfPlane(x, z); if (bLine.inFront(point)) { return planeMiddleBottom.calcYOfPlane(x, z);
private static MultiPolygonList2d applyWindowsBegin(MultiPolygonList2d mPoly, BuildingNodeElement be, Point2d segmentStart, Vector2d segmentDirection, double nodeDisplacement, CatchFaceFactory pCatchFaceFactory, BuildingElementsTextureManager pTextureMenager, boolean counterClockwise) { if (be instanceof SquareHoleElement) { SquareHoleElement she = (SquareHoleElement) be; Point2d mbp = new Point2d(0, she.getMinHeight()); Point2d rbp = new Point2d(she.getWidth() / 2.0, she.getMinHeight()); Point2d rtp = new Point2d(she.getWidth() / 2.0, she.getMaxHeight()); Point2d mtp = new Point2d(0, she.getMaxHeight()); mPoly = PolygonSplitHelper.unionOfLeftSideOfMultipleCuts(mPoly, new LinePoints2d(rtp, rbp), new LinePoints2d(mtp, rtp), new LinePoints2d(rbp, mbp)); TextureData td = findWindowTextureData(be, pTextureMenager); MeshFactory mesh = pCatchFaceFactory.createOrGetMeshFactory(td.getTex0()); FaceFactory face = mesh.addFace(FaceType.QUADS); Vector3d n = new Vector3d(-segmentDirection.y, 0, -segmentDirection.x); // if (counterClockwise) { n.negate(); // } int iN = mesh.addNormal(n); int imbTc = mesh.addTextCoord(new TextCoord(0.5, 0)); int imtTc = mesh.addTextCoord(new TextCoord(0.5, 1)); int irbTc = mesh.addTextCoord(new TextCoord(1, 0)); int irtTc = mesh.addTextCoord(new TextCoord(1, 1)); face.addVert(segmentPointToVertex3dIndex(mbp, segmentStart, segmentDirection, mesh), imbTc, iN); face.addVert(segmentPointToVertex3dIndex(rbp, segmentStart, segmentDirection, mesh), irbTc, iN); face.addVert(segmentPointToVertex3dIndex(rtp, segmentStart, segmentDirection, mesh), irtTc, iN); face.addVert(segmentPointToVertex3dIndex(mtp, segmentStart, segmentDirection, mesh), imtTc, iN); } return mPoly; }
/** * Calculates height of wall point under roof. * * @param point * the point * @param rLine * the right split line * @param lLine * the left split line * @param planeLeft * the left plane * @param planeRight * the right plane * @param planeButtom * the bottom plane * @return height of point */ private static double calcHeight(Point2d point, LinePoints2d rLine, LinePoints2d lLine, Plane3d planeLeft, Plane3d planeRight, Plane3d planeButtom) { double x = point.x; double z = -point.y; if (rLine.inFront(point)) { return planeRight.calcYOfPlane(x, z); } else if (lLine.inFront(point)) { return planeLeft.calcYOfPlane(x, z); } else { return planeButtom.calcYOfPlane(x, z); } }
Point2d leftBottom = new Point2d(0, 0); final LinePoints2d tLine = new LinePoints2d(leftMiddleTopPoint, rightMiddleTopPoint); final LinePoints2d mLine = new LinePoints2d(leftCenterPoint, rightCenterPoint); final LinePoints2d bLine = new LinePoints2d(leftMiddleBottomPoint, rightMiddleBottomPoint); final LinePoints2d lLine = new LinePoints2d(leftMiddleBottomPoint, leftMiddleTopPoint); final LinePoints2d rLine = new LinePoints2d(rightMiddleTopPoint, rightMiddleBottomPoint); final LinePoints2d lbLine = new LinePoints2d(leftBottom, leftCenterPoint); final LinePoints2d ltLine = new LinePoints2d(leftCenterPoint, leftTop); final LinePoints2d rtLine = new LinePoints2d(rightTop, rightCenterPoint); final LinePoints2d rbLine = new LinePoints2d(rightCenterPoint, rightBottom);
private static MultiPolygonList2d applyWindowsEnd(MultiPolygonList2d mPoly, BuildingNodeElement be, Point2d segmentStart, Vector2d segmentDirection, double nodeDisplacement, CatchFaceFactory catchFaceFactory, BuildingElementsTextureManager textureMenager, boolean counterClockwise) { if (be instanceof SquareHoleElement) { SquareHoleElement she = (SquareHoleElement) be; Point2d lbp = new Point2d(nodeDisplacement - she.getWidth() / 2.0, she.getMinHeight()); Point2d mbp = new Point2d(nodeDisplacement, she.getMinHeight()); Point2d mtp = new Point2d(nodeDisplacement, she.getMaxHeight()); Point2d ltp = new Point2d(nodeDisplacement - she.getWidth() / 2.0, she.getMaxHeight()); mPoly = PolygonSplitHelper.unionOfLeftSideOfMultipleCuts(mPoly, new LinePoints2d(lbp, ltp), new LinePoints2d(ltp, mtp), new LinePoints2d(mbp, lbp)); TextureData td = findWindowTextureData(be, textureMenager); MeshFactory mesh = catchFaceFactory.createOrGetMeshFactory(td.getTex0()); FaceFactory face = mesh.addFace(FaceType.QUADS); Vector3d n = new Vector3d(-segmentDirection.y, 0, -segmentDirection.x); n.negate(); int iN = mesh.addNormal(n); int imbTc = mesh.addTextCoord(new TextCoord(0.5, 0)); int imtTc = mesh.addTextCoord(new TextCoord(0.5, 1)); int ilbTc = mesh.addTextCoord(new TextCoord(0, 0)); int iltTc = mesh.addTextCoord(new TextCoord(0, 1)); face.addVert(segmentPointToVertex3dIndex(lbp, segmentStart, segmentDirection, mesh), ilbTc, iN); face.addVert(segmentPointToVertex3dIndex(mbp, segmentStart, segmentDirection, mesh), imbTc, iN); face.addVert(segmentPointToVertex3dIndex(mtp, segmentStart, segmentDirection, mesh), imtTc, iN); face.addVert(segmentPointToVertex3dIndex(ltp, segmentStart, segmentDirection, mesh), iltTc, iN); } return mPoly; }
double z = -point.y; if (middleLine.inFront(point)) { if (leftTopLine.inFront(point)) { return planeLeft.calcYOfPlane(x, z); } else if (!rightTopLine.inFront(point)) { return planeRight.calcYOfPlane(x, z); } else { if (leftBottomLine.inFront(point)) { return planeLeft.calcYOfPlane(x, z); } else if (!rightBottomLine.inFront(point)) { return planeRight.calcYOfPlane(x, z); } else {
Point2d prt = new Point2d(recWidth, recHeight); final LinePoints2d ltLine = new LinePoints2d(plt, middlePoint); final LinePoints2d lbLine = new LinePoints2d(plb, middlePoint); final LinePoints2d rtLine = new LinePoints2d(middlePoint, prt); final LinePoints2d rbLine = new LinePoints2d(middlePoint, prb);
/** * Calculate height of point in wall. * * @param point * the point * @param mLine * the middle line * @param planeTop * the top plane * @param planeBottom * the bottom plane * @return */ private static double calcHeight(Point2d point, LinePoints2d mLine, Plane3d planeTop, Plane3d planeBottom) { double x = point.x; double z = -point.y; if (mLine.inFront(point)) { return planeTop.calcYOfPlane(x, z); } else { return planeBottom.calcYOfPlane(x, z); } } }
LinePoints2d bLine = new LinePoints2d(new Point2d(0, l1), new Point2d(pRecWidth, l1)); LinePoints2d rLine = new LinePoints2d(new Point2d(pRecWidth - l2, 0), new Point2d(pRecWidth - l2, pRecHeight)); LinePoints2d tLine = new LinePoints2d(new Point2d(pRecWidth, pRecHeight - l3), new Point2d(0, pRecHeight - l3)); LinePoints2d tLine = new LinePoints2d(new Point2d(l4, pRecHeight), new Point2d(l4, 0));
/** * Calculates height of point in wall. * * @param point * @param rLine * @param lLine * @param planeLeft * @param planeRight * @param planeButtom * @param planeTop * @return */ private static double calcHeight(Point2d point, LinePoints2d lLine, Plane3d planeButtom, Plane3d planeTop) { double x = point.x; double z = -point.y; if (lLine.inFront(point)) { return planeButtom.calcYOfPlane(x, z); } else { return planeTop.calcYOfPlane(x, z); } }
final LinePoints2d mLine = new LinePoints2d(leftMiddlePoint, rightMiddlePoint);