7

Javaで作業していて、私が作業している描画機能(ポリゴンクリエーター)を簡素化したいと思っていました。通常、ポリゴンを作成するときは、次のようにします。

Polygon mypoly = new Polygon();
mypoly.addPoint(x1, y1);
mypoly.addPoint(x2, y2);
mypoly.addPoint(x3, y3);
Draw.fillPolygon(g, mypoly, Color.blue);

画像マッパーを使用して座標を自動的に取得したいので、それらをコピーして自分の関数に貼り付けることができます。

myCommand(x1, y1, x2, y2, x3, y3);

これらはそれぞれ、上部のポリゴン コマンドに入ります。私が直面している問題は、 mypoly が作成されたときに、追加するポイントの数とそれらをどこに配置するかをどのように知るのでしょうか?

myCommand引数を追加するときにポイントを自動的に追加し、各ポイントを元のポリゴン作成方法の x、y に対応させようとしています。

4

4 に答える 4

7

ビルダーパターンを利用する必要があるようです。擬似コード:

PolygonBuilder pb = new PolygonBuilder();
pb.addPoint(1,1);
pb.addPoint(1,2);
// etc...

Polygon p = pb.newPolygon();

そのため、ビルダーに一連のポイントを提供すると、適切なポリゴンが生成されます。多くの場合、ビルダーは流暢なインターフェースで設計されています。ビルダーはファクトリのように動作し、必要に応じてPolygon(正方形、三角形、五角形など) の適切なサブクラスを返すことができることに注意してください。

代わりに、 Java varargs メカニズムを使用して、可変数の引数を取るメソッドを提供できることに注意してください。例えば

public void addPoints(Integer... args) {
   // and iterate here
}

Pointx/y 座標を一緒に定義するオブジェクトを作成したい場合があります。それ以外の場合、上記は偶数の引数をチェックする必要があり、それらの引数は結び付けられません。

于 2012-12-21T14:47:25.570 に答える
5

xs と ys の配列を取得するコンストラクターを使用して、 varargsを使用して多角形を動的に作成できます。

(コードはテストされていません)

public Polygon createPolygon(int... points) {
    if (0 != points.length % 2) {
        throw new IllegalArgumentException("Must have even number of points");
    }

    int numOfPoints = points.length / 2;
    int xs = new int[numOfPoints];
    int ys = new int[numOfPoints];
    for (int i=0; i < numOfPoints;i++) {
       xs[i] = points[i*2];
       yx[i] = points[i*2 + 1];
    }

    return new Polygon(xs, ys, numOfPOints);
}

次に、任意の数のポイントでメソッドを呼び出すことができます

Polygon p = createPolygon(x1,y1,x2,y2,x3,y3);

于 2012-12-21T14:52:01.750 に答える
2

To extend Brian Agnew's answer, it might also be worth adding a Point class which the addPoints method could take in. It could make it slightly easier to add/remove points from your polygon.

public final class Point<X,Y>{
    private final X x;
    private final Y y;

    public Point(X x, Y y){
        this.x=x;
        this.y=y;
    }

    public X getX(){return x;}

    public Y getY(){return y;}
}

Then you could have a:

public void addPoints(Point<Integer,Integer>... points){
    for(Point<Integer,Integer> point:points)
        //your logic
}
于 2012-12-21T15:04:08.013 に答える
1

...varargs( )を受け取ったメソッドを使用できると思います

各ポイントのラッパーが必要です。

class Point {
    int x;
    int y;
    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

メソッドは次のようになります。

myCommand(Point ... points)

電話で

myCommand(new Point(0,0), new Point(1,1), new Point(0,1));

そして抽選のために:

Polygon mypoly = new Polygon();
for(Point p : points)
    mypoly.addPoint(p.x,p.y);
Draw.fillPolygon(g,mypoly,Color.blue);
于 2012-12-21T14:56:12.283 に答える