【问题标题】:Regular Polygon intersection with a circle正多边形与圆相交
【发布时间】:2018-10-16 16:03:41
【问题描述】:

我想画一个正多边形 inscrit ,我写了一些代码,通常公式为 angle = 2*Math.Pi/numside ecc 等。

通过鼠标移动动态绘制的多边形:

public void Set_beahvior(Pane DrawPane, BottomPane bottompane )
{
     this.selectedProperty().addListener(new ChangeListener<Boolean>() 

      {

        private final EventHandler<MouseEvent> pressedHandler = (event)    -> {

                cerchio = new MyCircle(event.getX(), event.getY(), 0.0, DrawPane ,bottompane1);
                cerchio.setCenterX(event.getX());
                cerchio.setCenterY(event.getY());
                cerchio.setStrokeType(StrokeType.OUTSIDE);
                cerchio.setStroke(Color.RED);
                cerchio.setFill(Color.TRANSPARENT);
                cerchio.setStrokeWidth(1);
                currentPolygon= new MyPolygon2(DrawPane,bottompane);

                DrawPane.getChildren().addAll(cerchio);
                DrawPane.getChildren().addAll(currentPolygon);              
        };

        private final EventHandler<MouseEvent> draggedHandler = (event) -> {
            cerchio.setRadius((event.getX()-cerchio.getCenterX()));
            currentPolygon.setPolygon(cerchio.getCenterX(), cerchio.getCenterY(), cerchio.getRadius(),cerchio);

        };

        private final EventHandler<MouseEvent> releasedHandler = (event) -> {
            cerchio.setRadius((event.getX()-cerchio.getCenterX()));
            cerchio.setStroke(Color.TRANSPARENT);

        };

        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            // add/remove event handlers based on toggle state of the button
            if (newValue) {
                DrawPane.addEventHandler(MouseEvent.MOUSE_PRESSED, pressedHandler);
                DrawPane.addEventHandler(MouseEvent.MOUSE_DRAGGED, draggedHandler);
                DrawPane.addEventHandler(MouseEvent.MOUSE_RELEASED, releasedHandler);
            } else {
                DrawPane.removeEventHandler(MouseEvent.MOUSE_PRESSED, pressedHandler);
                DrawPane.removeEventHandler(MouseEvent.MOUSE_DRAGGED, draggedHandler);
                DrawPane.removeEventHandler(MouseEvent.MOUSE_RELEASED, releasedHandler);
            }
        }
  });

还有一段代码:

     public void setPolygon(Double x, Double y, Double radius, MyCircle circle){

          DoubleProperty raggio = new SimpleDoubleProperty(circle.getRadius());

          double section = 2.0 * Math.PI/Numside;

          this.getPoints().addAll((x + raggio.doubleValue() *  Math.cos(0)), (y + raggio.doubleValue() * Math.sin(0)));
          for(int i=1; i<Numside; i++){ 
               this.getPoints().addAll((x + raggio.doubleValue() * Math.cos(section * i)), (y + raggio.doubleValue() * Math.sin(section * i)));
              }
         } 

问题:我从 3 边开始,然后我将编写一些边通用的代码,但是如果我动态增加圆的半径(增加半径 -> 三角形增加),一切都会好起来的。

但是如果我减小圆的半径,多边形不遵循圆的行为,我不明白为什么,请给点建议?

PS:请忽略 Doubleproperty 和一些仅为测试编写的代码,我知道如果我传递了 circle 对象,我不需要其他参数。目前我正在研究多边形不跟随圆周的原因。

【问题讨论】:

    标签: java javafx polygon


    【解决方案1】:

    您永远不会清除Polygon 中的任何点。您需要确保points 列表中的坐标保持为边数的两倍。此外,setPolygon 的参数定义不正确:您通过前 3 个和最后一个参数传递相同的信息;你也没有明显的理由使用引用类型Double。以下代码对代码进行了一些改进:

    private final int numside;
    private final double[] points;
    
    public MyPolygon2(int numside) {
        this.numside = numside;
        this.points = new double[numside * 2];
        double step = 2 * Math.PI / numside;
    
        for (int i = 0; i < numside; i++) {
            int index = 2 * i;
            double angle = i * step;
            points[index] = Math.cos(angle);
            points[index + 1] = Math.sin(angle);
        }
    }
    
    public void setPolygon(double x, double y, double radius) {
        getPoints().clear();
        for (int i = 0; i < points.length;) {
            getPoints().addAll(x + radius * points[i++], y + radius * points[i++]);
        }
    }
    

    【讨论】:

    • 谢谢 fabian 的回答,你的代码写得比我的好,但我仍然有同样的问题:当我拖动鼠标在扩展中创建圆圈时,一切正常(多边形 inscrit 跟随圆的尺寸),如果我不释放鼠标按钮并且在 cricle 减小尺寸之前以相反的方向减小圆,但多边形保持在最后一个状态并且它不会调整它的尺寸
    猜你喜欢
    • 2015-08-17
    • 2020-02-23
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多