# 绘制几何图元

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

Java 2D API 提供了几个定义常见几何对象的类，如点，线，曲线和矩形。这些几何类是 [`java.awt.geom`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/package-frame.html) 包的一部分。
[`PathIterator`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/PathIterator.html) 接口定义了从路径中检索元素的方法。
[`Shape`](https://docs.oracle.com/javase/8/docs/api/java/awt/Shape.html) 接口提供了一组用于描述和检查几何路径对象的方法。该接口由 [`GeneralPath`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/GeneralPath.html) 类和其他几何类实现。

本节中表示的所有示例都使用`java.awt.geom`包创建几何，然后使用 [`Graphics2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/Graphics2D.html) 类进行渲染。首先获取`Graphics2D`对象，例如通过转换`paint()`方法的`Graphics`参数。

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

```

## 点

[`Point`](https://docs.oracle.com/javase/8/docs/api/java/awt/Point.html) 类创建表示（x，y）[坐标空间](../overview/coordinate.html)中的位置的点。子类`Point2D.Float`和`Point2D.Double`相应地提供浮点和双精度，用于存储点的坐标。

```
//Create Point2D.Double
Point2D.Double point = new Point2D.Double(x, y);

```

要创建坐标为 0,0 的点，请使用默认构造函数`Point2D.Double()`。
您可以使用`setLocation`方法设置点的位置，如下所示：

*   `setLocation(double x, double y)` - 将点定义坐标的位置设置为双精度值。
*   `setLocation(Point2D p)` - 使用另一个点的坐标设置点的位置。

此外，`Point2D`类具有计算当前点与具有给定坐标的点之间的距离或两点之间的距离的方法。

## 线

[`Line2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/Line2D.html) 类表示（x，y）坐标空间中的线段。 `Line2D. Float`和`Line2D.Double`子类以 float 和 double 精度指定行。例如：

```
// draw Line2D.Double
g2.draw(new Line2D.Double(x1, y1, x2, y2));

```

![Line](img/1f60b6d533dfc9223a734c4f4352c33b.jpg)

该类包括几个`setLine()`方法来定义该行的端点。
或者，可以使用`Line2D.Float`类的构造函数指定行的端点，如下所示：

*   `Line2D.Float(float X1, float Y1, float X2, float Y2)`
*   `Line2D.Float(Point2D p1, Point2D p2)`

使用`Graphics2D`类中的 [Stroke](strokeandfill.html) 对象定义线路径的笔划。

## 曲线

`java.awt.geom`包使您可以创建二次或三次曲线段。

### 二次曲线段

[`QuadCurve2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/QuadCurve2D.html) 类实现`Shape`接口。此类表示（x，y）坐标空间中的二次参数曲线段。 `QuadCurve2D.Float`和`QuadCurve2D.Double`子类以 float 和 double 精度指定二次曲线。

几种`setCurve`方法用于指定两个端点和曲线的控制点，其坐标可以通过其他点的坐标和使用给定的数组直接定义。
一种非常有用的方法`setCurve(QuadCurve2D)`，将二次曲线设置为相同的端点，控制点设置为提供的曲线。例如：

```
// create new QuadCurve2D.Float
QuadCurve2D q = new QuadCurve2D.Float();
// draw QuadCurve2D.Float with set coordinates
q.setCurve(x1, y1, ctrlx, ctrly, x2, y2);
g2.draw(q);

```

![Quadratic parametric curve segment](img/55e2a7b696f6c9ee1438de7990a6e646.jpg)

### 立方曲线段

[`CubicCurve2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/CubicCurve2D.html) 类也实现 [`Shape`](https://docs.oracle.com/javase/8/docs/api/java/awt/Shape.html) 接口。此类表示（x，y）坐标空间中的三次参数曲线段。 `CubicCurve2D.Float`和`CubicCurve2D.Double`子类以 float 和 double 精度指定三次曲线。

`CubicCurve2D`类具有类似的方法，用于将曲线设置为`QuadraticCurve2D`类，除了第二个控制点。例如：

```
// create new CubicCurve2D.Double
CubicCurve2D c = new CubicCurve2D.Double();
// draw CubicCurve2D.Double with set coordinates
c.setCurve(x1, y1, ctrlx1,
           ctrly1, ctrlx2, ctrly2, x2, y2);
g2.draw(c);

```

![Cubic Curve Segment](img/9ca28611a01364693ba33ae31ff70d0e.jpg)

## 长方形

指定以下示例中表示的基元的类扩展了`RectangularShape`类，该类实现`Shape`接口并添加了一些自己的方法。

通过这些方法，您可以获取有关形状位置和大小的信息，检查矩形的中心点以及设置形状的边界。

[`Rectangle2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/Rectangle2D.html) 类表示由位置（x，y）和尺寸（w×h）定义的矩形。 `Rectangle2D.Float`和`Rectangle2D.Double`子类以 float 和 double 精度指定矩形。例如：

```
// draw Rectangle2D.Double
g2.draw(new Rectangle2D.Double(x, y,
                               rectwidth,
                               rectheight));

```

![Rectangle](img/ffaf1fa113f080b669f969839ba83ad5.jpg)

[`RoundRectangle2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/RoundRectangle2D.html) 类表示具有由位置（x，y），尺寸（w x h）以及角弧的宽度和高度定义的圆角的矩形。 `RoundRectangle2D.Float`和`RoundRectangle2D.Double`子类以 float 和 double 精度指定圆角矩形。

圆角矩形使用以下参数指定：

*   地点
*   宽度
*   高度
*   角弧的宽度
*   角弧的高度

要设置`RoundRectangle2D`对象的位置，大小和弧，请使用方法`setRoundRect(double a, double y, double w, double h, double arcWidth, double arcHeight)`。例如：

```
// draw RoundRectangle2D.Double
g2.draw(new RoundRectangle2D.Double(x, y,
                                   rectwidth,
                                   rectheight,
                                   10, 10));

```

![Rounded Rectangle](img/4ad6995d4cd9a952f1607f9eead72907.jpg)

## 椭圆

[`Ellipse2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/Ellipse2D.html) 类表示由边界矩形定义的椭圆。 `Ellipse2D.Float`和`Ellipse2D.Double`子类以 float 和 double 精度指定椭圆。

椭圆完全由位置，宽度和高度定义。例如：

```
// draw Ellipse2D.Double
g2.draw(new Ellipse2D.Double(x, y,
                             rectwidth,
                             rectheight));

```

![Ellipse](img/fac4f5cba4ec9f5bb16fdc470b870567.jpg)

## 弧

要绘制一个椭圆，请使用 [`Arc2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/Arc2D.html) 类。此类表示由边界矩形，起始角度，角度范围和闭合类型定义的弧。 `Arc2D.Float`和`Arc2D.Double`子类以 float 和 double 精度指定椭圆。

`Arc2D`类定义了以下三种类型的弧，由该类中的相应常量表示：OPEN，PIE 和 CHORD。

<center>![Arc](img/2def387f9d2e4027360b3e57db505ea7.jpg)</center>

有几种方法可以设置弧的大小和参数：

*   直接，通过坐标
*   提供`Point2D`和`Dimension2D`
*   通过复制现有的`Arc2D`

此外，您可以使用`setArcByCenter`方法从中心点指定圆弧，由其坐标和半径指定。

```
// draw Arc2D.Double
g2.draw(new Arc2D.Double(x, y,
                         rectwidth,
                         rectheight,
                         90, 135,
                         Arc2D.OPEN));

```

![Arc](img/2def387f9d2e4027360b3e57db505ea7.jpg)

[`ShapesDemo2D.java`](examples/ShapesDemo2D.java) 代码示例包含所有描述的几何图元的实现。有关本节中介绍的类和方法的更多信息，请参阅 [`java.awt.geom`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/package-summary.html) 规范。