2012-02-28 7 views
1

小さな角の弧と長方形で一連の角をシミュレートしようとしています。円弧と長方形を組み合わせたときに小さな空白が表示される

それはアンチエイリアシングをオンにして、私は以下のような画像を得るレンダリング:

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

私はオフアンチエイリアシングオンにすると、私は次のような画像を得る:

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

私の計算が1ピクセルまたは2ピクセルずれているかのように見えますが、すべてのレンダリングに2倍を使用しているので、そうではないと思います。

クラスのコードはここにある:

http://pastebin.com/1SHu7rH0

これは、行がほとんど気晴らしや計算の重大なエラーではないとして、それを持つ巨大な問題ではないのですが、それは私が望むものです可能であれば、修正することができます。

おかげ

+2

、私たちから1つを得ることで、あなたの最善の策は、問題が、それとは関係のない任意のコードが含まれていない小規模なコンパイルと実行可能なプログラムを作成することであると思います問題を示しています。このコードは「モデル」や「制御」コードやその依存関係を持たないため、外部のデータや画像は必要ありませんが、ハードコードされたデータを使ってカーブを描いたレーンを描画しようとします。このプロセスは[sscce](http://sscce.org)の作成と呼ばれ、かなりの労力を要しますが、何も答えが出てこない場合は、その努力が価値があります。 –

+1

質問は何ですか?単にアンチエイリアスを有効にしないのはなぜですか? – kleopatra

+0

@kleopatra私は最後にやった。私は最後にこれに対する解決策を見つけ出すことができませんでした。私はちょうど湾曲した部分の間の小さな線で行う必要があります。 –

答えて

2

EDIT:実際に問題が(形状)を埋める使用している場合があります:それは唯一の内部を塗りつぶします。描画(シェイプ)を呼び出すと、シェイプが一直線にならない場合があります。

曲げを単一の図形としてペイントしていないのはなぜですか?あなたはすぐにまともなソリューションを取得しない場合

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); 
      } 
     }); 
    } 
} 
関連する問題