gpt4 book ai didi

java - 旋转文本以匹配线条的斜率

转载 作者:行者123 更新时间:2023-11-30 07:03:26 24 4
gpt4 key购买 nike

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

最佳答案

经过进一步研究,这并不是我真正需要的直线斜率。

而不是使用:

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

我应该使用Math.atan2:

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

这正在产生我需要的结果。

关于java - 旋转文本以匹配线条的斜率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40509893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com