2012-02-28 47 views
1

我试图通过一系列小角度圆弧和矩形来模拟拐角。组合圆弧和矩形时出现小间隙

当抗锯齿开启渲染,我得到一个画面如下图所示:

http://i.imgur.com/xgzme.png

当我打开抗锯齿的时候,我得到了下面的图片:

http://i.imgur.com/mB6Id.png

它几乎看起来好像我的计算关闭了一个或两个像素,但我使用所有渲染的双打,所以我甚至不认为是这样。

该类的代码是在这里:

http://pastebin.com/1SHu7rH0

这不是它一个巨大的问题,因为线是很难分心或计算的严重错误,但它是什么,我想如果可能的话,能够修复。

感谢

+2

如果不尽快得到一个体面的解决办法,我认为,在获得一个离我们最好的办法是建立一个小的编译和执行的程序不包含无关的问题,但任何代码演示了这个问题。这段代码没有“模型”或“控制”代码或依赖关系,它不需要外部数据或图像,但只会尝试使用硬编码数据绘制一些带曲线的通道。这个过程被称为创建一个[sscce](http://sscce.org),并且需要您付出相当大的努力,但是如果没有答案即将到来,这个努力是值得的。 – 2012-02-28 23:34:27

+1

有什么问题?为什么不简单地打开反锯齿呢? – kleopatra 2012-02-29 13:10:02

+0

@kleopatra我在最后做了。我最终无法找出解决方案。我只需要在曲线段之间的小线上做些事情。 – 2012-03-05 19:58:59

回答

2

编辑:其实这个问题可能只使用填充(形状):它只是填充内部。调用draw(Shape)以及可能会修正Shapes不排队。

你为什么不把这些弯曲画成单个形状?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.geom.Arc2D; 
import java.awt.geom.Area; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Path2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestDonut extends JPanel { 
    public TestDonut() { 
     setPreferredSize(new Dimension(100, 100)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Ellipse2D.Double gap = new Ellipse2D.Double(25, 25, 50, 50); 
     Ellipse2D.Double circle = new Ellipse2D.Double(0, 0, 100, 100); 
     Shape quarter = new Rectangle(50, 50, 50, 50); 
     Area donut = new Area(circle); 
     donut.subtract(new Area(gap)); 
     Area quarterDonut = new Area(quarter); 
     quarterDonut.subtract(donut); 

     Area bend = new Area(quarter); 
     bend.subtract(quarterDonut); 
     g.setColor(Color.RED); 
     ((Graphics2D) g).fill(bend); 

     Path2D.Double bend2 = new Path2D.Double(); 
     bend2.moveTo(0, 50); 
     bend2.quadTo(0, 0, 50, 0); 
     bend2.lineTo(50, 25); 
     bend2.quadTo(25, 25, 25, 50); 
     bend2.closePath(); 
     g.setColor(Color.GREEN); 
     ((Graphics2D) g).fill(bend2); 

     Arc2D.Double outerArc = new Arc2D.Double(0, 0, 100, 100, 0, 90, Arc2D.PIE); 
     Arc2D.Double innerArc = new Arc2D.Double(25, 25, 50, 50, 0, 90, Arc2D.PIE); 
     Area bend3 = new Area(outerArc); 
     bend3.subtract(new Area(innerArc)); 
     g.setColor(Color.BLUE); 
     ((Graphics2D) g).fill(bend3); 

    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(new TestDonut()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
}