# 绘制任意形状

> 原文： [https://docs.oracle.com/javase/tutorial/2d/geometry/arbitrary.html](https://docs.oracle.com/javase/tutorial/2d/geometry/arbitrary.html)

您已经学会了如何绘制`java.awt.geom`包中表示的大多数形状。要创建更复杂的几何体，例如多边形，折线或星形，请使用此包中的另一个类`GeneralPath`。

该类实现 [`Shape`](https://docs.oracle.com/javase/8/docs/api/java/awt/Shape.html) 接口，表示由线，二次曲线和三次曲线构成的几何路径。此类中的三个构造函数可以使用默认的缠绕规则（`WIND_NON_ZERO`），给定的缠绕规则（`WIND_NON_ZERO`或`WIND_EVEN_ODD`）或指定的初始坐标容量创建 [`GeneralPath`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/GeneralPath.html) 对象。缠绕规则指定如何确定路径的内部。

```
public void paint (Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    ...
}

```

要创建空`GeneralPath`实例调用`new GeneralPath()`，然后使用以下方法将段添加到形状：

*   `moveTo(float x, float y)` - 将路径的当前点移动到给定点
*   `lineTo(float x, float y)` - 将线段添加到当前路径
*   `quadTo(float ctrlx, float ctrly, float x2, floaty2)` - 将二次曲线段添加到当前路径
*   `curveTo(float ctrlx1, float ctrly1, float ctrlx2, float ctrly2, float x3, floaty3)` - 将三次曲线段添加到当前路径
*   `closePath()` - 关闭当前路径

以下示例说明如何使用`GeneralPath`绘制折线：

| 

```
// draw GeneralPath (polyline)
int x2Points[] = {0, 100, 0, 100};
int y2Points[] = {0, 50, 50, 0};
GeneralPath polyline = 
        new GeneralPath(GeneralPath.WIND_EVEN_ODD, x2Points.length);

polyline.moveTo (x2Points[0], y2Points[0]);

for (int index = 1; index &lt; x2Points.length; index++) {
         polyline.lineTo(x2Points[index], y2Points[index]);
};

g2.draw(polyline);

```

 | ![This image represents a polyline](img/0c885c3c17fd91f856c2e044c666b3a6.jpg) |

此示例说明如何使用`GeneralPath`绘制多边形：

| 

```
// draw GeneralPath (polygon)
int x1Points[] = {0, 100, 0, 100};
int y1Points[] = {0, 50, 50, 0};
GeneralPath polygon = 
        new GeneralPath(GeneralPath.WIND_EVEN_ODD,
                        x1Points.length);
polygon.moveTo(x1Points[0], y1Points[0]);

for (int index = 1; index &lt; x1Points.length; index++) {
        polygon.lineTo(x1Points[index], y1Points[index]);
};

polygon.closePath();
g2.draw(polygon);

```

 | ![This image represents a polygon](img/e60b731b638c46fdb3d0106b28b0749a.jpg) |

请注意，最后两个代码示例之间的唯一区别是`closePath()`方法。此方法通过将直线绘制回最后一个`moveTo`的坐标，从折线生成多边形。

要在`GeneralPath`对象的末尾添加特定路径，请使用`append()`方法之一。 [``ShapesDemo2D.java`` ](examples/ShapesDemo2D.java)代码示例包含任意形状的其他实现。