2017-01-20 5 views
-1

こんにちは、私は自分のアプリケーションのためにハート形状を作成しようとしていると 私は、中空のいずれかを行うことができ、それが良い働いて、今私は塗りつぶされた方法でそれを描画する必要があるが、それは2 Arc2D.Doubleと2で作成していますこの2つの線を2つの異なる '領域'に追加しようとしましたが、これらの2つの領域を1つに追加するだけでなく、機能しませんでした。2つのLine2D.Doubleの間をどのように埋めるか?

これを実行する方法は2つありますか?ありがとうございます。

マイコード:クラスハート

`public class HeartShape { 

    private ArrayList<Shape> shapes; 
    public HeartShape() { 

    } 

    public ArrayList<Shape> Heart(double x, double y, double HEART_RADIUS) { 
     shapes = new ArrayList<>(); 
     double r = HEART_RADIUS; 
     double root2 = Math.sqrt(2); 
     double cx = x; 
     double cy = y; 
     double dx = r/root2; 
     double heights = 3 * dx + r; 
     double top = cy - heights/2; 
     double bottom = cy + heights/2; 
     Shape s = new Arc2D.Double(cx - dx - r, top, 2 * r, 2 * r, 45, 180, Arc2D.OPEN); 
     shapes.add(s); 
     s = new Arc2D.Double(cx + dx - r, top, 2 * r, 2 * r, -45, 180, Arc2D.OPEN); 
     shapes.add(s); 
     s = new Line2D.Double(cx, bottom, cx - 2 * dx, bottom - 2 * dx); 
     shapes.add(s); 
     s = new Line2D.Double(cx, bottom, cx + 2 * dx, bottom - 2 * dx); 
     shapes.add(s); 
     if (shapes != null) { 
      return shapes; 
     } else { 
      return null; 
     } 
    } 

    public void drawHeart(Graphics2D g2d, boolean isFilled) { 

     if (isFilled == true) { 
        shapes.forEach((ss) -> { 
         g2d.fill(ss); 
        }); 
     } else { 
        shapes.forEach((ss) -> { 
         g2d.draw(ss); 
        }); 
     } 

    }` 

そしてDrawinTest

EmptyFilled:これまでのところ、そのはこのように見ている

public class DrawinTest extends JPanel{ 
private int HEART_RADIUS; 
private Point startpoint; 
private int x, y, width, height; 
private HeartShape heartShape = new HeartShape(); 
/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    new DrawinTest(); 
} 

public DrawinTest() { 
    JFrame f = new JFrame("Test Area"); 
    f.setPreferredSize(new Dimension(600, 500)); 
    f.setLocationRelativeTo(null); 
    f.setLayout(new BorderLayout(0, 1)); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.addMouseListener(new MyMouseListener()); 
    this.addMouseMotionListener(new MyMouseListener()); 
    this.setBackground(Color.WHITE); 
    f.setContentPane(this); 
    f.setVisible(true); 
    f.pack(); 
} 

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

    Graphics2D g2d = (Graphics2D)g; 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.setStroke(new BasicStroke(3)); 
    g2d.setColor(Color.RED); 

    if(heartShape != null) { 
     heartShape.Heart(x, y, HEART_RADIUS); 
     heartShape.drawHeart(g2d, false); 

    } 
    g2d.dispose(); 
} 

class MyMouseListener implements MouseListener,MouseMotionListener { 

    @Override 
    public void mouseClicked(MouseEvent e) {} 

    @Override 
    public void mousePressed(MouseEvent e) { 
     startpoint = new Point(e.getPoint()); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) {} 

    @Override 
    public void mouseEntered(MouseEvent e) {} 

    @Override 
    public void mouseExited(MouseEvent e) {} 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     x = Math.min(startpoint.x, e.getX()); 
     y = Math.min(startpoint.y, e.getY()); 
     width = Math.abs(startpoint.x - e.getX()); 
     height = Math.abs(startpoint.y - e.getY()); 
     HEART_RADIUS = Math.min(width, height); 
     repaint(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) {} 

    } 
} 
+0

'Shape' APIを使用して「閉じた」形状を生成します - [概念的な例として](http://stackoverflow.com/question/30041397/how-to-paint-a-group-of-quadcurves-using-java-graphics2d/30042600#30042600) – MadProgrammer

+0

@MadProgrammer早く再生していただきありがとうございます。私の脳はそれに対処するのに疲れているからです。 –

+0

ええ、私は前のコメントへのリンクの例を追加しました;) – MadProgrammer

答えて

2

ShapeのAPIが本当に面白いのAPIの数を持って、私のお気に入りの一つは、それがこのような状況では、それは非常に有用なもの、あなたが他のShape秒追加され行うことができますどのような、基本的にPath2D

です。

public class HeartShape { 

    private Shape shape; 

    public HeartShape() { 

    } 

    public Shape Heart(double x, double y, double HEART_RADIUS) { 
     double r = HEART_RADIUS; 
     double root2 = Math.sqrt(2); 
     double cx = x; 
     double cy = y; 
     double dx = r/root2; 
     double heights = 3 * dx + r; 
     double top = cy - heights/2; 
     double bottom = cy + heights/2; 

     Path2D base = new Path2D.Double(); 
     Shape s = new Arc2D.Double(cx - dx - r, top, 2 * r, 2 * r, 45, 180, Arc2D.OPEN); 
     base.append(s, false); 
     s = new Line2D.Double(cx, bottom, cx - 2 * dx, bottom - 2 * dx); 
     base.append(s, true); 
     s = new Line2D.Double(cx, bottom, cx + 2 * dx, bottom - 2 * dx); 
     base.append(s, true); 
     s = new Arc2D.Double(cx + dx - r, top, 2 * r, 2 * r, -45, 180, Arc2D.OPEN); 
     base.append(s, true); 

     base.closePath(); 

     shape = base; 

     return base; 
    } 

    public void drawHeart(Graphics2D g2d, boolean isFilled) { 
     System.out.println("..."); 
     if (isFilled) { 
      g2d.fill(shape); 
     } else { 
      g2d.draw(shape); 
     } 
    } 
} 

this exampleに示すように、あなたは、単に「デフォルト」サイズでのインスタンスを作成することができ、あなたはそれのサイズを変更したい形状を再作成する必要があるとのAffineTransformを使用していませんそれよりも簡単にサイズを変更する;)

+0

あなたには完璧な答えと+1があります。本当にありがとうございます。 –

+0

@CoderACJHP喜んで助けることができます;) – MadProgrammer

+1

いくつかは私にこの答えがdownvoteを引き付ける理由を説明してもらえますか?私はどのような方法で質問に答えませんか?どのように改善されるでしょうか?質問が新しいダウンボントを受け取っていないのを見て、他の回答が下書きされていないか、新しい回答が追加されていないので、あなたはその質問で問題を見つけられないと思います。残念です – MadProgrammer

1

私は、図形のarrayListを使う代わりに、GenericPathを使用して、個々の図形にGenericPath.append()を追加するべきだと思います。あなたが完了した人は、心臓の部分を追加して、それを埋めることができるように閉じるためにGenericPath.closePath()を使います。次に、新しいGenericPathオブジェクトを描画するパスとして使用できるはずですg2d.draw

関連する問題