【发布时间】: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 对象,我不需要其他参数。目前我正在研究多边形不跟随圆周的原因。
【问题讨论】: