2016-11-09 31 views
0

我用一個現有的例子來解釋這個問題。
基本上是畫一條線。
用於繪製直線的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

經過進一步的研究,它不是真正的我需要的斜線。

而不是使用:

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

我應該使用Math.atan2:

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

這是生產我需要的結果。