이 게시물이 내가 질문에 만든 대답 모음입니다 레이블 : 내가 원하는 이미지 여기 Transforming a shape아핀하지 텍스트, 그래프 변환 및
된다
여기
가있다 간단한 프로그램이 생성하는 이미지. 텍스트가 회전 된 것을 볼 수 있습니다. 나는 수평 텍스트를 원하는 :
캔버스 도면을 회전, 변환, 스케일링, 그래서 텍스트가 수평입니다 표시되지 않고 글꼴 크기가 매우 감소 될 (1.4)가 필요합니다. 이 프로그램은 Java (awt 및 JavaFX)로 작성되었지만 문제는 언어 또는 기술과 관련이 없으므로 어떠한 제안도 환영합니다. 여기
단순 프로그램 : 제 화상 (목표)를 표시하는 데 사용되는 프로그램, I는 두 캔버스를 사용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
을 사용하여 레이블을 가로로 그릴 때만 두 번째 캔버스가 사용됩니다. 두 캔버스가 겹쳐서 표시되며 투명합니다.
암 : 여기
이 결과, 디스크 주변 텍스트의 approximative 위치를 확인합니다. JavaFX의 노드 클래스의? 이것은 원형의 중심을 통해 선으로 설정할 수있는 속성이며 텍스트 노드의 속성을 일부 값으로 바인딩합니다. –@AlexanderKirov : 답변을 게시했습니다. 검토해주십시오. – Aubin