/** * @param renderer GL renderer * @param polygon polygon * @param pt polygon triangulation * @param vertices vertices of the polygon * @param verticesLength vertices length (may <> vertices.length due to cache) */ public static final void drawPolygon( Renderer renderer, GeoPolygon polygon, PolygonTriangulation pt, Coords[] vertices, int verticesLength) { Coords n = polygon.getMainDirection(); pt.clear(); try { // simplify the polygon and check if there are at least 3 points // left if (pt.updatePoints() > 2) { // check if the polygon is convex Convexity convexity = pt.checkIsConvex(); if (convexity != Convexity.NOT) { boolean reverse = polygon.getReverseNormalForDrawing() ^ (convexity == Convexity.CLOCKWISE); renderer.getGeometryManager().drawPolygonConvex(n, vertices, verticesLength, reverse); } else { // set intersections (if needed) and divide the polygon into // non self-intersecting polygons pt.setIntersections(); // convert the set of polygons to triangle fans pt.triangulate(); // compute 3D coords for intersections Coords[] verticesWithIntersections = pt.getCompleteVertices(vertices, polygon.getCoordSys(), verticesLength); // draw the triangle fans renderer .getGeometryManager() .drawTriangleFans( n, verticesWithIntersections, pt.getMaxPointIndex(), pt.getTriangleFans()); } } } catch (Exception e) { App.debug(e.getMessage()); e.printStackTrace(); } }
/** * Constructor for previewable * * @param a_view3D * @param selectedPoints */ @SuppressWarnings("unchecked") public DrawPolygon3D(EuclidianView3D a_view3D, ArrayList<GeoPointND> selectedPoints) { super(a_view3D); Kernel3D kernel = getView3D().getKernel(); setGeoElement(new GeoPolygon3D(kernel.getConstruction(), null)); getGeoElement().setIsPickable(false); pt.setPolygon((GeoPolygon) getGeoElement()); this.selectedPoints = selectedPoints; segments = new ArrayList<DrawSegment3D>(); segmentsPoints = new ArrayList<ArrayList>(); setPickingType(PickingType.SURFACE); isPreview = true; updatePreview(); }