这个职位是一个套件来回答我要提问时作:Transforming a shape仿射变换的图形,没有文字和标签
这里是像我想:
这里是生成一个简单的程序,就像你看到文本被旋转一样。我想水平文本:
画布进行缩放,平移,旋转,做拉伸,因此不horizontaly显示文本和字体大小必须极度降低(1.4)。该程序是用Java编写的(awt和JavaFX),但问题不在于语言或技术相关,因此任何建议都是值得欢迎的。
这里是简单的程序:
import javafx.application.Application;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;
public class TransRotScale extends Application {
private static void drawGraph(GraphicsContext g) {
//---
g.scale(10.0, 10.0);
g.rotate(Math.toDegrees(Math.atan2(-15.0, 40.0)));
g.translate(-8, -10);
//---
g.setStroke(Color.DARKRED);
g.setLineWidth(LINE_WIDTH);
g.strokeLine(10, 20, 10, 30);
g.strokeLine(10, 30, 50, 30);
g.strokeLine(50, 30, 50, 35);
//---
g.setFill(Color.BLACK);
g.fillOval(50-ENDPOINT_RADIUS, 35-ENDPOINT_RADIUS,
ENDPOINT_DIAMETER, ENDPOINT_DIAMETER);
g.fillOval(10-ENDPOINT_RADIUS, 20-ENDPOINT_RADIUS,
ENDPOINT_DIAMETER, ENDPOINT_DIAMETER);
//---
g.setFill(Color.LIGHTSALMON);
g.fillOval(10-ENDPOINT_RADIUS, 30-ENDPOINT_RADIUS,
ENDPOINT_DIAMETER, ENDPOINT_DIAMETER);
g.fillOval(50-ENDPOINT_RADIUS, 30-ENDPOINT_RADIUS,
ENDPOINT_DIAMETER, ENDPOINT_DIAMETER);
//---
g.setStroke(Color.DARKGRAY);
g.setFont(Font.font(Font.getDefault().getFamily(), 1.4));
g.setLineWidth(0.1);
g.setTextAlign(TextAlignment.CENTER);
g.setTextBaseline(VPos.BOTTOM);
g.strokeText("[10, 20]", 10, 20-ENDPOINT_RADIUS);
g.setTextBaseline(VPos.TOP);
g.strokeText("[10, 30]", 10, 30+ENDPOINT_RADIUS);
g.setTextBaseline(VPos.BOTTOM);
g.strokeText("[50, 30]", 50, 30-ENDPOINT_RADIUS);
g.setTextBaseline(VPos.TOP);
g.strokeText("[50, 35]", 50, 35+ENDPOINT_RADIUS);
}
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane bp = new BorderPane();
Canvas canvas = new Canvas(540, 240);
bp.setCenter(canvas);
drawGraph(canvas.getGraphicsContext2D());
primaryStage.setScene(new Scene(bp));
primaryStage.centerOnScreen();
primaryStage.show();
}
public static final double ENDPOINT_RADIUS = 2.0;
public static final double ENDPOINT_DIAMETER = 2.0*ENDPOINT_RADIUS;
public static final double LINE_WIDTH = 1.0;
public static void main(String[] args) {
launch();
}
}
在用于显示第一图像(目标)中的程序,我使用两个画布,第一画布缩放,平移,旋转,以进行绘制而没有任何文本,第二个画布仅用于水平绘制标签,使用java.awt.geom.AffineTransform
来计算坐标以匹配显示在第一个画布中的项目。两幅油画都叠加显示,透明。
上午,你看OBJECTPROPERTY rotationAxisProperty(),它定义该节点的旋转轴。 JavaFX的Node类的?这是一个属性,你可以设置为一个线,通过圆的中心,并将文本节点的旋转属性绑定到一些值... –
@AlexanderKirov:我已经为你发布了一个答案,请检查它。 – Aubin