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
}

您可能希望创建一个Point对象来一起定义 x/y 坐标。否则上面将不得不检查偶数个参数,并且这些参数不会被捆绑在一起。

于 2012-12-21T14:47:25.570 回答
5

您可以使用可变参数并通过使用获取 xs 和 ys 数组的构造函数来动态创建多边形

(代码未测试)

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

为了扩展 Brian Agnew 的答案,可能还值得添加一个 Point 类, addPoints 方法可以使用它。它可以使从多边形中添加/删除点变得稍微容易一些。

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;}
}

然后你可以有一个:

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

我认为您可以使用接收可变参数(...)的方法

每个点都需要一个包装器:

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 回答