2013-08-02 2 views
0

Как нарисовать строку в java параллельно линии, когда я знаю координаты линии? Ниже мой код до сих пор, x1, y1 и x2, y2 представляет координаты линии. (текст должен быть параллельно и в центре линии)Java drawString, параллельный строке

g.drawLine(x1, y1, x2, y2); 

AffineTransform at = new AffineTransform(); 
at.rotate(<WHAT TO PUT HERE>); 
g.setTransform(at); 
g.drawString("My Text", <WHAT TO PUT HERE> , <WHAT TO PUT HERE>); 
+0

Это не отвечает на ваш вопрос, но вы не следует использовать 'setTransform' для перезаписывания существующего преобразования новым. Метод просто предназначен для восстановления более раннего состояния объекта Graphics2D. – resueman

+0

Спасибо! Вы абсолютно правы. Что я думал ...: D – sanjan

ответ

0

После еще некоторых исследований,

Это то, что я придумал

 //draw the line 
     g.drawLine(x1, y1, x2, y2); 

     //get center of the line 
     int centerX =x1 + ((x2-x1)/2); 
     int centerY =y1 + ((y2-y1)/2); 

     //get the angle in degrees 
     double deg = Math.toDegrees(Math.atan2(centerY - y2, centerX - x2)+ Math.PI); 

     //need this in order to flip the text to be more readable within angles 90<deg<270 
     if ((deg>90)&&(deg<270)){ 
      deg += 180; 
     } 

     double angle = Math.toRadians(deg); 

     String text = "My text"; 
     Font f = new Font("default", Font.BOLD, 12); 
     FontMetrics fm = g.getFontMetrics(f); 
     //get the length of the text on screen 
     int sw = fm.stringWidth(text); 

     g.setFont(f); 
     //rotate the text 
     g.rotate(angle, centerX, centerY); 
     //draw the text to the center of the line 
     g.drawString(text, centerX - (sw/2), centerY - 10); 
     //reverse the rotation 
     g.rotate(-angle, centerX, centerY); 

Благодаря @rocketboy и @resueman за помощь

0

тангенс (тета) = Наклон = (у2-y1)/(х2-x1)

тета = Atan (наклон)

, что означает, use

at.rotate(Math.toRadians(theta)) 

что касается

g.drawString(String str, int x, int y) 

x, y - координата leftmost character вашей строки.

+0

Итак, я делаю свой код как: if (Math.abs (x2-x1)> 0) { double slope = (y2-y1) /Math.abs (x2-x1) ; double tan = Math.atan (наклон); at.rotate (Math.toRadians (tan));} Правильно ли я? – sanjan

+0

Да, хотя вы можете сделать все это в одном заявлении :) – rocketboy

Смежные вопросы