java drawarc参数_Java Graphics drawArc具有高精度

我正在尝试使用AWT / Swing在Java中绘制高精度弧. Graphics类提供了“drawArc”方法来执行此操作,在大多数情况下这很好.但是,当弧具有较大的半径(即“宽度”和“高度”参数较大)时,弧将不会精确绘制.这是因为“startAngle”和“arcAngle”参数以整数度给出.我被迫将角度(以弧度给出)转换为度数然后将其舍入.精度的损失会导致电弧达不到其实际终点(如果你向下舍入)或超出应有的程度(如果你向上舍入).

我正在寻找另一种绘制弧线的方法.优选地,这应该以相同的方式工作,但接受浮点角度作为参数.

如果这样的函数不存在(我找不到)我想自己编写,但是我不知道如何解决这个问题,因为Graphics类已经提供了我能找到的最低级别的绘图方法.我唯一的想法就是用一系列直线近似弧线,但为了获得平滑的弧线,你需要很多线条,这看起来非常低效.

解决方法:

如果您希望使用双倍值作为角度参数,为什么不使用Arc2D这样的Arc2D对象?您提到的所有参数都是双重类型.

另外,您是否正确设置了Graphics2D对象的RenderingHints以允许消除锯齿?

例如.,

import java.awt.*;

import java.awt.event.ComponentAdapter;

import java.awt.event.ComponentEvent;

import java.awt.geom.Arc2D;

import javax.swing.*;

@SuppressWarnings("serial")

public class TestArc2D extends JPanel {

private static final int PREF_W = 1000;

private static final int PREF_H = 400;

private static final Stroke STROKE = new BasicStroke(5f);

private static final Color ARC_COLOR = Color.red;

private Arc2D arc;

public TestArc2D() {

addComponentListener(new ComponentAdapter() {

@Override

public void componentResized(ComponentEvent e) {

double x = 10;

double y = x;

double w = getWidth() - 2 * x;

double h = 2 * getHeight() - 2 * y - 50;

double start = 0;

double extent = 180.0;

arc = new Arc2D.Double(x, y, w, h, start , extent, Arc2D.OPEN);

}

});

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g.create();

g2.setStroke(STROKE);

g2.setColor(ARC_COLOR);

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

if (arc != null) {

g2.draw(arc);

}

g2.dispose();

}

@Override

public Dimension getPreferredSize() {

return new Dimension(PREF_W, PREF_H);

}

private static void createAndShowGui() {

TestArc2D mainPanel = new TestArc2D();

JFrame frame = new JFrame("TestArc2D");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(mainPanel);

frame.pack();

frame.setLocationByPlatform(true);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGui();

}

});

}

}

标签:java,graphics,awt,java-2d

来源: https://codeday.me/bug/20190529/1179746.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值