我蚕食了一个现有的例子来说明这个问题。
基本上正在绘制一条线。
绘制线的X,Y
值用于计算斜率。
然后将该值与文本值一起使用。
最终目标是让文本"ABC"
与行的斜率相匹配。
每当行的X,Y
值(pt1x, pt1y, pt2x, pt2y
)发生变化时,应计算线的斜率,以使文本更改以匹配斜率。
此示例显示文本旋转太多。使用一般斜率计算:((pt2y - pt1y) / (pt2x - pt1x))
。
我想知道从斜坡到旋转的转换是否不一样。
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.AffineTransformOp;
import javax.swing.*;
public class BevelArrows
{
public static void main ( String...args )
{
SwingUtilities.invokeLater ( new Runnable () {
BevelArrows arrows = new BevelArrows();
@Override
public void run () {
JFrame frame = new JFrame ( "Test" );
frame.add ( new JPanel() {
public void paintComponent ( Graphics g ) {
arrows.draw ( ( Graphics2D ) g, getWidth(), getHeight() );
}
}
, BorderLayout.CENTER );
frame.setSize ( 800, 400 );
frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
frame.setVisible ( true );
}
} );
}
void draw ( Graphics2D g, int width, int height )
{
g.setRenderingHint ( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
g.setColor ( Color.WHITE );
g.fillRect ( 0, 0, width, height );
g.setColor ( Color.BLUE );
int pt1x = 150;
int pt1y = 10;
int pt2x = 200;
int pt2y = 200;
g.drawLine (pt1x, pt1y, pt2x, pt2y);
g.setStroke ( new BasicStroke ( 20.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL ) );
Font font = new Font(null, Font.PLAIN, 10);
AffineTransform affineTransform = new AffineTransform();
affineTransform.rotate((float)((pt2y - pt1y) / (pt2x - pt1x)), 0, 0);
Font rotatedFont = font.deriveFont(affineTransform);
g.setFont(rotatedFont);
g.drawString("abc", 250, 25);
g.dispose();
}
}
答案 0 :(得分:1)
经过进一步的研究,它确实不是我需要的线的斜率。
而不是使用:
affineTransform.rotate((float)((pt2y - pt1y) / (pt2x - pt1x)), 0, 0);
我应该使用Math.atan2:
affineTransform.rotate( Math.atan2((pt2y - pt1y), (pt2x - pt1x)), 0, 0);
这产生了我需要的结果。