// int x1, x2, y; private void drawLine(int currentY, int index) { // добавление рассматриваемых плоскостей for (; index < setBorders.size() && setBorders.get(index) >= currentY; index++) { changeDrawnSurfacesList(currentY, true); } // поиск всех точек, пересекающих эту плоскость, и составление из них отрезков // поиск точек пересечения между этими отрезками findAllIntersections(currentY); // сортировка pointsList = (ArrayList<Point>) pointsList .stream() .sorted((a, b) -> Double.compare(a.getX(), b.getX())) .collect(Collectors.toList()); // отрисовка Point last = new Point(0, currentY, 0); for (Point p : pointsList) { ArrayList<PointEvent> events = listPointsEvent.getEvent((int) p.getX()); for (PointEvent event : events) { if (event.event == PointEventsList.START) { drawnSegments.add(event.point.getParent()); } } if (drawnSegments.size() > 0) { double maxZ = -Double.MAX_VALUE; Segment chosen = null; for (Segment seg : drawnSegments) { double z = seg.getZOnX(p.getX()); if (z > maxZ) { maxZ = z; chosen = seg; } } if (chosen != null && maxZ > -Double.MAX_VALUE) { context.setStroke(chosen.getSurfaceColor()); double x1 = canvas.getWidth() / 4 + last.getX() * 2, x2 = canvas.getWidth() / 4 + p.getX() * 2, y = canvas.getHeight() / 2 + currentY; context.strokeLine(x1, y, x2, y); } } // актуализация отрезков for (PointEvent event : events) { if (event.event == PointEventsList.FINISH) { drawnSegments.remove(event.point.getParent()); } } last = p; } }