我遇到了旋转方法的问题。我想围绕它的中心旋转一个绘图,但我不想旋转Canvas对象,只是它内部的绘图。 artHorizon是canvas Object(400,400) 或者将坐标系移动到convas对象的中心可能会更好吗?
这是一种绘图方法:
public void drawHorizon(GraphicsContext gc, double degrees, double translate) {
gc.translate(0, translate);
gc.rotate(degrees);
gc.setFill(Color.rgb(0, 61, 144));
gc.fillRect(0, 0, artHorizon.getWidth() * 2, 150);
gc.setFill(Color.rgb(59, 41, 39));
gc.fillRect(0, 150, 400, 150);
}
并初始化:
@Override
public void initialize(URL location, ResourceBundle resources) {
GraphicsContext gc = artHorizon.getGraphicsContext2D();
gc.rotate(20);//here I want to rotate gc around center
drawHorizon(gc, 0, 0);
}
答案 0 :(得分:0)
如果您想绕点旋转
用新的变换替换现有变换,然后旋转。 setTransform最后两个值是新原点的画布像素坐标,其中x = 0且y = 0。
gc.setTransform(1.0, 0.0, 0.0, 1.0, artHorizon.getWidth() / 2.0, 150.0);
gc.rotate(degrees);
原点现在位于artHorizon.getWidth() / 2
,150.0
,因此您必须从该点开始绘制。您将需要对角线宽度,以便填充整个画布。
double len = Math.sqrt(
artHorizon.getWidth() * artHorizon.getWidth() +
artHorizon.getHeight() * artHorizon.getHeight()) / 2.0;
然后从原点
渲染地平线偏移gc.fillRect(-len, -150, len * 2, 150); // top half
// change colour
gc.fillRect(-len, 0, len * 2, 400); // bottom half
您可以使用
将画布恢复为默认值gc.setTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
答案 1 :(得分:0)
您可以将Rotate
与指定的Affine
构造函数一起传递给transform
。结果可以传递给GraphicsContext
的{{1}}方法。此外,为确保将Canvas
提交到其边缘,请添加一些偏移量。 Canvas
的最大尺寸肯定就足够了:
gc.transform(new Affine(new Rotate(20, artHorizon.getWidth()/2, artHorizon.getHeight()/2)));
// gc.rotate(20);
public void drawHorizon(GraphicsContext gc, double degrees, double translate) {
gc.translate(0, translate);
gc.rotate(degrees);
double maxDimension = Math.max(artHorizon.getWidth(), artHorizon.getHeight());
gc.setFill(Color.rgb(0, 61, 144));
gc.fillRect(-maxDimension, 0, maxDimension * 3, 150);
gc.setFill(Color.rgb(59, 41, 39));
gc.fillRect(-maxDimension, 150, maxDimension * 3, 150);
}