Как увеличить изображение и нарисовать полигон в JavaFX с помощью

#java #javafx #java-8 #javafx-2 #javafx-8

#java #javafx #java-8 #javafx-2 #javafx-8

Вопрос:

Я пытаюсь создать программу для рисования полигона на изображении, и мы можем увеличить изображение и полигон после нажатия кнопки масштабирования. После нажатия на кнопку масштабирования изображение обрезается. Чтобы избежать этой проблемы, я использую stackpane.

Я попытался установить масштаб X и Y для AnchorPane, это отлично позволяет увеличивать как изображение, так и полигон, но полигон не идеально расположен на панели. Верхняя и правая сторона изображения выходит за пределы панели.

Я попытался установить масштаб по X и Y с помощью Canvas, но масштабируется только изображение, но не полигон для рисования.

 getView().getCanvas().setScaleX(getView().getCanvas().getScaleX() * zoomFactor);
getView().getCanvas().setScaleY(getView().getCanvas().getScaleY() * zoomFactor);
  

Чтобы увеличить изображение и нарисованный полигон, мне нужно предложение API.

     private void setImageAndCanvas() { 
                scrollPane = new ScrollPane(); 
                anchorPane = new AnchorPane(); 
                canvas = new Canvas(screenWidth/2, screenHeight-120); 
                gridLines = new ArrayList<Line>(); 
                imageSections = new ArrayList<Polygon>(); 
                scrollPane.setContent(anchorPane); 
                anchorPane.getChildren().add(canvas); 
                scrollPane.setPrefSize(screenWidth/2, screenHeight-120); 
        }

`public void setCanvas(Canvas canvas, Image img){
        graphicsContext.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
    }`

    private void zoom(double zoomFactor) {
        zoomWidth.set(zoomWidth.get() * zoomFactor);
        zoomHeight.set(zoomHeight.get() * zoomFactor);
        getView().getAnchorPane().setScaleX(getView().getAnchorPane().getScaleX() * zoomFactor);
        getView().getAnchorPane().setScaleY(getView().getAnchorPane().getScaleY() * zoomFactor);
        zoomCounter = zoomFactor>1 ?   zoomCounter: --zoomCounter;
        if (zoomCounter > 0 amp;amp; zoomCounter < 3) {
            getView().getZoomIn().setDisable(false);
            getView().getZoomOut().setDisable(false);
        }
    }

    public void zoomOutAction(ActionEvent event) {
        zoom(1/zoomFactor);
        event.consume();
    }

    private void drawAllImageSections(){
        if(getView().getImageNameTablePane().getSelectedItem()!=null){
            String imageName = getView().getImageNameTablePane().getSelectedItem().getImageName();
            List<QiImageSectionPoint> polygonPoints = getModel().showAllImageSection(imageName);
            if(!polygonPoints.isEmpty()){
                List<Double> allPointsList = new ArrayList<Double>();
                double resizeWidthPercent = ((getView().getScreenWidth()/2)-500)/5;
                double resizeHeightPercent = ((getView().getScreenHeight()-120)-500)/5;
                polygon = new Polygon();
                for(int i = 0; i<polygonPoints.size(); i  ){
                    int imageSectionId = polygonPoints.get(i).getImageSectionId();
                    if((i 1)<polygonPoints.size() amp;amp; imageSectionId == polygonPoints.get(i 1).getImageSectionId()){
                        allPointsList.add((double) polygonPoints.get(i).getPointX() ((polygonPoints.get(i).getPointX()*resizeWidthPercent)/100));
                        allPointsList.add((double) polygonPoints.get(i).getPointY() ((polygonPoints.get(i).getPointY()*resizeHeightPercent)/100));
                    }else{
                        allPointsList.add((double) polygonPoints.get(i).getPointX() ((polygonPoints.get(i).getPointX()*resizeWidthPercent)/100));
                        allPointsList.add((double) polygonPoints.get(i).getPointY() ((polygonPoints.get(i).getPointY()*resizeHeightPercent)/100));
                        polygon.getPoints().setAll(allPointsList);
                        polygon.setFill(null);
                        polygon.setStroke(lineColor);
                        polygon.setStrokeWidth(lineWidth);
                        getView().getImageSections().add(polygon);
                        allPointsList = new ArrayList<Double>();
                        polygon = new Polygon();
                    }
                }
            }
        }
        if(getView().getImageSections()!=null)
        getView().getAnchorPane().getChildren().addAll(getView().getImageSections());
    }