实例028 图形的交运算
实例说明
本实例演示在Java中如何实现图形的交运算,即保留两个图形的交集。运行程序,将在窗体上显示进行交运算后的图形,效果如图1.28所示。
关键技术
本实例主要是通过在JPanel类的子类中,重写JComponent类的paint()方法,并在该方法中使用Graphics2D类的draw()方法和Area类来实现的,其中Area类用于封装图形对象,并通过intersect()方法对封装的图形对象进行交运算。
使用Area类的intersect()方法对封装的图形对象进行交运算,该方法的定义如下:
public void intersect(Area rhs)
参数说明
rhs:与当前Area对象进行交运算的Area对象。
设计过程
(1)新建一个项目。
(2)在项目中创建一个继承JFrame类的IntersectOperationFrame窗体类。
(3)在IntersectOperationFrame窗体类中,创建内部面板类IntersectOperationPanel,并重写JComponent类的paint()方法,在该方法中实现图形的交运算。
(4)将内部面板类IntersectOperationPanel的实例,添加到窗体类IntersectOperationFrame的内容面板上,用于在窗体上显示图形进行交运算后的效果,代码如下:
class IntersectOperationPanel extends JPanel { // 创建内部面板类
public void paint(Graphics g) { // 重写paint()方法
Graphics2D g2 = (Graphics2D)g; // 获得Graphics2D对象
Rectangle2D.Float rect = new Rectangle2D.Float(30, 30, 160, 120); // 创建矩形对象
Ellipse2D.Float ellipse = new Ellipse2D.Float(20, 30, 180, 180); // 创建圆对象
Area area1 = new Area(rect); // 创建区域矩形
Area area2 = new Area(ellipse); // 创建区域圆
area1.intersect(area2); // 两个区域图形进行交运算
g2.draw(area1); // 绘制交运算后的区域图形
Ellipse2D.Float ellipse1 = new Ellipse2D.Float(190, 20, 100, 140); // 创建椭圆对象
Ellipse2D.Float ellipse2 = new Ellipse2D.Float(240, 20, 100, 140); // 创建椭圆对象
Area area3 = new Area(ellipse1); // 创建区域椭圆
Area area4 = new Area(ellipse2); // 创建区域椭圆
area3.intersect(area4); // 两个区域椭圆进行交运算
g2.fill(area3); // 绘制交运算后的区域椭圆
}
}
秘笈心法
心法领悟028:交运算的原理。
交运算是根据数学运算中的集合交运算原理实现的。对于集合的交运算,是取两个集合的公共元素;而对于图形的交运算,是取两个图形重叠的部分。