使用Java 2D绘制黑白太极图案

简介: 使用Java 2D绘制黑白太极图案

一:基本原理

利用Java 2D的Area对象对绘制形状几何操作的支持,完成太极图案的绘制,使用Paint来


完成对不同颜色的填充。Java 2D图形API Area对Shape支持四种几何操作:


-         Add (加)- 保留两个几何形状及其重叠部分


-         Subtract (减) – 从第一个几何形状上减去和第二个重叠的部分,保留减去之后的第一个几


      何形状


-         Intersect (与) – 只保留两个几何形状重叠的部分。


-         ExclusiveOr(或) – 保留他们相互不重叠的部分。


参看下图:

0_1324963757zIy9.png


二:程序运行效果

0_1324963803HYYv.png


程序基于JDK6 API完成。


背景图片我是在网上找来的,可以自己替换的。

程序源代码如下:

package com.gloomyfish.swing;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
 
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
 
public class YingYangGraphics extends JComponent {
  
  /**
   * 
   */
  private static final long serialVersionUID = 8812325148970066491L;
  private BufferedImage image = null;
  public YingYangGraphics() {
    super();
    this.setOpaque(false);
  }
  protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.drawImage(getImage(), 0, 0, image.getWidth(), image.getHeight(), null);
    Shape lefthalfCirle = new Ellipse2D.Double(10,10, 300,300); // R = 150
    Shape righthalfCircle = new Ellipse2D.Double(10,10, 300,300); // R = 150
    Shape innerCircle1 = new Ellipse2D.Double(85,10, 150,150); // R/2 = 75
    Shape innerCircle2 = new Ellipse2D.Double(85,160, 150,150); // R = 150
  
    Shape rectangel1 = new Rectangle2D.Double(160, 10, 150, 300);
    Shape rectangel2 = new Rectangle2D.Double(10, 10, 150, 300);
    
    Area left = new Area(lefthalfCirle);
    Area right = new Area(righthalfCircle);
    
    Area area11 = new Area(rectangel1);
    Area area22 = new Area(rectangel2);
    
    left.subtract(area11);
    right.subtract(area22);
    
    Area inner1 = new Area(innerCircle1);
    Area inner2 = new Area(innerCircle2);
    
    left.add(inner1);
    //left.subtract(inner2);
    right.add(inner2);
    right.subtract(inner1); // trick is here !!!
    
    
    // create minor circle here!!!
    Shape minorWhiteCircle = new Ellipse2D.Double(150,70, 20,20); // ++ 60
    Shape innerBlackCircle = new Ellipse2D.Double(150,230, 20,20); // R = 150
    
    // draw two big frame shape here...
    g2.setPaint(Color.WHITE);
    g2.fill(left);
    g2.setPaint(Color.BLACK);
    g2.fill(right);
    
    // draw minor circle here!!!
    g2.fill(minorWhiteCircle);
    g2.setPaint(Color.WHITE);
    g2.fill(innerBlackCircle);
  }
  
  private BufferedImage getImage() {
    if(image != null) {
      return image;
    }
    try {
      File file = new File("D:\\android\\blue_flower.jpg");
      image = ImageIO.read(file);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return image;
  }
  
  public static void main(String[] args) {
    JFrame frame = new JFrame("Test Panel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new BorderLayout());
    
    // Display the window.
    frame.getContentPane().add(new YingYangGraphics(), BorderLayout.CENTER);
    frame.setPreferredSize(new Dimension(330,350));
    frame.pack();
    frame.setVisible(true);
  }
}
相关文章
|
6月前
|
Java 计算机视觉
图像处理之图像纹理添加效果(利用JAVA 2D纹理画笔)
图像处理之图像纹理添加效果(利用JAVA 2D纹理画笔)
56 8
|
6月前
|
缓存 Java
Java Swing 2D系统属性参数详解
Java Swing 2D系统属性参数详解
48 0
|
Java C语言
C语言或Java-x型图案
C语言或Java-x型图案
72 0
|
Java
Java经典编程习题100例:第12例:在屏幕上打印出n行的金字塔图案
Java经典编程习题100例:第12例:在屏幕上打印出n行的金字塔图案
160 0
Java经典编程习题100例:第12例:在屏幕上打印出n行的金字塔图案