1

JavaShapeインターフェイス コントラクトとライブラリ ルーチンを使用すると、複数の形状をShapeインターフェイスを拡張する 1 つのオブジェクトに結合できますか?

たとえば、Flower花びらとコアのいくつかの楕円で構成されるクラスを定義できますか?

それとも、Shape連続したアウトラインが 1 つだけだと思いますか? もしそうなら、複数の形状を保持するための Java のクラスはありますか?ベクトル化されたグラフィックスのためのクラスでしょうか?

4

2 に答える 2

1

あなたが説明しているように Java で形状を操作するにAreaは、これらの操作を持つクラスを使用する必要があります。ShapeaをAreawithに変換するだけnew Area(Shape)です。

于 2012-06-04T12:30:49.340 に答える
1

これが私の試みです-花の形の中心に固定された回転変換を使用しています。

ここに画像の説明を入力

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class DaisyDisplay {

    DaisyDisplay() {
        BufferedImage daisy = new BufferedImage(
                200,200,BufferedImage.TYPE_INT_RGB);
        Graphics2D g = daisy.createGraphics();
        g.setColor(Color.GREEN.darker());
        g.fillRect(0, 0, 200, 200);
        Daisy daisyPainter = new Daisy();
        daisyPainter.paint(g);
        g.dispose();

        JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(daisy)));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DaisyDisplay();
            }
        });
    }
}

class Daisy {

    public void paint(Graphics2D g) {
        Area daisyArea = getDaisyShape();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                RenderingHints.VALUE_ANTIALIAS_ON);

        paintDaisyPart(g,daisyArea);
        g.setTransform(AffineTransform.getRotateInstance(
                Math.PI*1/8,
                100,100));
        paintDaisyPart(g,daisyArea);
        g.setTransform(AffineTransform.getRotateInstance(
                Math.PI*3/8,
                100,100);
        paintDaisyPart(g,daisyArea);
        g.setTransform(AffineTransform.getRotateInstance(
                Math.PI*2/8,
                100,100));
        paintDaisyPart(g,daisyArea);
    }

    public void paintDaisyPart(Graphics2D g, Area daisyArea) {
        g.setClip(daisyArea);

        g.setColor(Color.YELLOW);
        g.fillRect(0, 0, 200, 200);

        g.setColor(Color.YELLOW.darker());
        g.setClip(null);
        g.setStroke(new BasicStroke(3));
        g.draw(daisyArea);
    }

    public Area getDaisyShape() {
        Ellipse2D.Double core = new Ellipse2D.Double(70,70,60,60);

        Area area = new Area(core);
        int size = 200;
        int pad = 10;
        int petalWidth = 50;
        int petalLength = 75;

        // left petal
        area.add(new Area(new Ellipse2D.Double(
                pad,(size-petalWidth)/2,petalLength,petalWidth)));
        // right petal
        area.add(new Area(new Ellipse2D.Double(
                (size-petalLength-pad),(size-petalWidth)/2,petalLength,petalWidth)));
        // top petal
        area.add(new Area(new Ellipse2D.Double(
                (size-petalWidth)/2,pad,petalWidth,petalLength)));
        // bottom petal
        area.add(new Area(new Ellipse2D.Double(
                (size-petalWidth)/2,(size-petalLength-pad),petalWidth,petalLength)));

        return area;
    }
}
于 2012-06-05T02:24:04.480 に答える