旋转文本以匹配线的斜率

时间:2016-11-09 14:55:31

标签: java graphics rotation

我蚕食了一个现有的例子来说明这个问题。
基本上正在绘制一条线。
绘制线的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();
    }
}

1 个答案:

答案 0 :(得分:1)

经过进一步的研究,它确实不是我需要的线的斜率。

而不是使用:

 affineTransform.rotate((float)((pt2y - pt1y) / (pt2x - pt1x)),  0, 0);

我应该使用Math.atan2:

 affineTransform.rotate( Math.atan2((pt2y - pt1y), (pt2x - pt1x)),  0, 0);

这产生了我需要的结果。