我正在繪制一個圖形,每個點的兩個點都有一條帶權重的線。
例如圖形:點“15”到點“16”線,權重為 1.872,點“16”到點“15”,權重為 1.567。
現在看看我的圖表:

我想繪制一個始終與線平行(相鄰)的字串。
我計算了直線的斜率,我計算的天使是這個斜率的反正切:
我曾使用此函式來旋轉字串:
public static void drawRotate(Graphics2D g2d, double x, double y, double angle, String text) {
g2d.translate((float)x,(float)y);
g2d.rotate(Math.toRadians(angle));
g2d.drawString(text,0,0);
g2d.rotate(-Math.toRadians(angle));
g2d.translate(-(float)x,-(float)y);
}
隨著 arctan((y2-y1)/(x2-x1)= 線的斜率 ) 的角度,它不能很好地作業。
如何旋轉此字串以始終與我繪制的線平行?
我的目標:像這個例子一樣繪制字串

uj5u.com熱心網友回復:
這是一個快速演示,可用作有關如何完成的指南。我省略了一些像箭頭這樣的東西,因為那只是忙碌的作業。我猜測標簽位置。我建議您閱讀有關Graphics.rotate()andRenderingHints和 and的三個引數版本anti-aliasing以平滑線條。
您可能希望撰寫通用方法以方便根據字體大小定位文本和標簽。
但是我相信您的主要問題是在計算斜率時進行 int 除法。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GraphicsExample extends JPanel {
JFrame f = new JFrame("Draw Vector");
final static int WIDTH = 500;
final static int HEIGHT = 500;
String A = "1.567 [B->A]";
String B = "1.862 [A->B]";
public static void main(String[] args) {
SwingUtilities.invokeLater(()-> new GraphicsExample().start());
}
public void start() {
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public Dimension getPreferredSize() {
return new Dimension(WIDTH, HEIGHT);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
int x1= 50;int y1 = 400;
int x2 = 400; int y2 = 200;
// copy the graphics context.
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int diameter = 20;
drawLine(g2d,x1 diameter/2, y1 diameter/2, x2 diameter/2, y2 diameter/2);
g2d.setFont(new Font("Arial", Font.PLAIN, 18));
drawEndPoint(g2d,x1,y1, diameter, "A");
drawEndPoint(g2d,x2,y2, diameter, "B");
double angle = Math.atan((double)(y1-y2)/(x1-x2));
g2d.rotate(angle,x1,y1);
// based on font, this computes the placement of the Strings
FontMetrics fm = g2d.getFontMetrics();
int width = SwingUtilities.computeStringWidth(fm, A); // use for both
g2d.setColor(Color.black);
g2d.drawString(A, x1 ((x2-x1) - width)/2, y1);
g2d.drawString(B, x1 ((x2-x1) - width)/2, y1 30);
// discard the context.
g2d.dispose();
}
public void drawEndPoint(Graphics2D g2d, int x, int y, int diameter, String label) {
g2d.setColor(Color.BLUE);
g2d.drawString(label, x, y);
g2d.fillOval(x,y,diameter, diameter);
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(2f));
g2d.drawOval(x,y,diameter, diameter);
}
public void drawLine(Graphics2D g2d, int x1, int y1, int x2, int y2) {
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(3f));
g2d.drawLine(x1,y1,x2,y2);
}
}
演出

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/374386.html
上一篇:如何在java中不使用thread.sleep進行影像幻燈片放映
下一篇:當我嘗試在JPanel的背景上添加影像時出現<<errorjavax.imageio.IIOException:Can'treadinputfile!>>
