首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高精度Java Graphics drawArc

高精度Java Graphics drawArc
EN

Stack Overflow用户
提问于 2013-02-03 04:12:09
回答 2查看 4.7K关注 0票数 5

我正在尝试使用AWT/Swing在Java中绘制高精度的圆弧。Graphics类提供了"drawArc“方法来实现这一点,在大多数情况下这是可以接受的。但是,当圆弧半径较大时(即“宽度”和“高度”参数较大),则无法精确绘制圆弧。这是因为"startAngle“和"arcAngle”参数是以整数度数给出的。我被迫将一个角度(以弧度表示)转换为度,然后对其进行舍入。精度的损失会导致圆弧低于其实际终点(如果向下舍入)或超出其应有的距离(如果向上舍入)。

我正在寻找另一种绘制弧线的方法。最好是以同样的方式工作,但接受浮点角度作为参数。

如果这样的函数不存在(我还找不到),我想自己写,但我不知道该怎么做,因为Graphics类已经提供了我能找到的最低级别的绘制方法。我唯一的想法是用一系列直线来近似圆弧,但是为了得到一个平滑的圆弧,你需要很多的线,这看起来效率非常低。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-03 04:18:25

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

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

例如,

代码语言:javascript
复制
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();
         }
      });
   }
}
票数 6
EN

Stack Overflow用户

发布于 2017-12-08 03:03:11

使用Graphics2D,您可以使用rotate(theta,x,y)函数精确绘制弧线的一端:

代码语言:javascript
复制
g2.rotate(-1*thetaStartRadians,xc,yc);
g2.drawArc(x1,y1,width,height,0, thetaLengthDegrees-1);
g2.rotate(thetaStartRadians,xc,yc);

然后你只需要精确地画出另一边的最后一点:

代码语言:javascript
复制
g2.rotate(-1*thetaLengthRadians,xc,yc);
g2.drawArc(x1,y1,width,height,0,-2));
g2.rotate(thetaLengthRadians,xc,yc);

你会画出一条弧线来精确地计算θ值。从机器的角度来看,这可能不是最有效的方法,因为有一点重绘重叠;但这是我能想到的最简单的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14666018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档