从几何图元构造复杂形状

原文: https://docs.oracle.com/javase/tutorial/2d/advanced/complexshapes.html

构造区域几何(CAG)是通过对现有几何形状执行布尔运算来创建新几何形状的过程。在 Java 2D API 中, Area 类实现 Shape 接口并支持以下布尔操作。

| Venn diagram showing Union | 联盟 | Venn diagram showing Subtraction | 减法 | | Venn diagram showing Intersection | 路口 | Venn diagram showing Exclusive-or operation | 独家或(XOR) |

示例:区域

在此示例中,Area对象从几个椭圆构造一个梨形。

<applet alt=”applet constructs pear shape” archive=”examples/lib/PearApplet.jar” code=”Pear” height=”200” width=”150”><param name=”permissions” value=”sandbox”></applet>


Note: If you don’t see the applet running, you need to install at least the Java SE Development Kit (JDK) 7 release.


Pear.java 包含此 applet 的完整代码。

通过在两个重叠的圆上执行交集来创建叶子。

  1. leaf = new Ellipse2D.Double();
  2. ...
  3. leaf1 = new Area(leaf);
  4. leaf2 = new Area(leaf);
  5. ...
  6. leaf.setFrame(ew-16, eh-29, 15.0, 15.0);
  7. leaf1 = new Area(leaf);
  8. leaf.setFrame(ew-14, eh-47, 30.0, 30.0);
  9. leaf2 = new Area(leaf);
  10. leaf1.intersect(leaf2);
  11. g2.fill(leaf1);
  12. ...
  13. leaf.setFrame(ew+1, eh-29, 15.0, 15.0);
  14. leaf1 = new Area(leaf);
  15. leaf2.intersect(leaf1);
  16. g2.fill(leaf2);

重叠圆也用于通过减法操作构造茎。

  1. stem = new Ellipse2D.Double();
  2. ...
  3. stem.setFrame(ew, eh-42, 40.0, 40.0);
  4. st1 = new Area(stem);
  5. stem.setFrame(ew+3, eh-47, 50.0, 50.0);
  6. st2 = new Area(stem);
  7. st1.subtract(st2);
  8. g2.fill(st1);

通过在圆形和椭圆形上进行联合操作来构造梨的主体。

  1. circle = new Ellipse2D.Double();
  2. oval = new Ellipse2D.Double();
  3. circ = new Area(circle);
  4. ov = new Area(oval);
  5. ...
  6. circle.setFrame(ew-25, eh, 50.0, 50.0);
  7. oval.setFrame(ew-19, eh-20, 40.0, 70.0);
  8. circ = new Area(circle);
  9. ov = new Area(oval);
  10. circ.add(ov);
  11. g2.fill(circ);