Java 2D 图形类总结与分类

一、基本形状类

这些类用于绘制简单的标准几何形状。

1. 圆形 / 椭圆类
  • Ellipse2D :椭圆基类,支持浮点精度。
    • 子类
      • Ellipse2D.Double:双精度浮点坐标。
      • Ellipse2D.Float:单精度浮点坐标。
    • 参数x, y, width, height(矩形边界框)。
    • 特点:当宽高相等时为圆形,否则为椭圆。
2. 矩形类
  • Rectangle2D :矩形基类,支持浮点精度。
    • 子类
      • Rectangle2D.Double:双精度浮点坐标。
      • Rectangle2D.Float:单精度浮点坐标。
    • 参数x, y, width, height(左上角坐标和尺寸)。
3. 圆角矩形类
  • RoundRectangle2D :圆角矩形基类。
    • 子类
      • RoundRectangle2D.Double:双精度浮点坐标。
      • RoundRectangle2D.Float:单精度浮点坐标。
    • 参数x, y, width, height, arcWidth, arcHeightarcWidtharcHeight 控制圆角大小)。
4. 弧形类
  • Arc2D :弧形基类。
    • 子类
      • Arc2D.Double:双精度浮点坐标。
      • Arc2D.Float:单精度浮点坐标。
    • 参数x, y, width, height, startAngle, extent, type
      • type 可选:OPEN(开放式)、CHORD(弦形)、PIE(扇形)。
5. 多边形类
  • Polygon :整数精度的多边形,通过顶点数组定义。
    • 参数xpoints[](X 坐标数组)、ypoints[](Y 坐标数组)、npoints(顶点数量)。
    • 特点:自动连接首尾顶点形成封闭图形。

二、路径形状类

这些类用于绘制复杂的自定义形状。

1. 线段类
  • Line2D :线段基类。
    • 子类
      • Line2D.Double:双精度浮点坐标。
      • Line2D.Float:单精度浮点坐标。
    • 参数 :起点 (x1, y1) 和终点 (x2, y2)
2. 二次贝塞尔曲线
  • QuadCurve2D :二次贝塞尔曲线基类。
    • 子类
      • QuadCurve2D.Double:双精度浮点坐标。
      • QuadCurve2D.Float:单精度浮点坐标。
    • 参数 :起点 (x1, y1)、控制点 (ctrlx, ctrly)、终点 (x2, y2)
3. 三次贝塞尔曲线
  • CubicCurve2D :三次贝塞尔曲线基类。
    • 子类
      • CubicCurve2D.Double:双精度浮点坐标。
      • CubicCurve2D.Float:单精度浮点坐标。
    • 参数 :起点 (x1, y1)、控制点 1 (ctrlx1, ctrly1)、控制点 2 (ctrlx2, ctrly2)、终点 (x2, y2)
4. 通用路径类
  • GeneralPath :可组合多个线段和曲线,形成复杂形状。
    • 特点 :通过 moveTo()lineTo()curveTo() 等方法动态构建路径。
5. 2D 路径类
  • Path2D :增强版的 GeneralPath,支持浮点精度。
    • 子类
      • Path2D.Double:双精度浮点坐标。
      • Path2D.Float:单精度浮点坐标。

三、其他类

  • Area:用于图形的布尔运算(并集、交集、差集)。
  • RectangularShape :抽象基类,包含 Ellipse2DRoundRectangle2D
  • Caret 相关类
    • BasicTextUI.BasicCaretDefaultCaret:文本编辑器中的光标,与绘图无关。

四、参数共同点与区别

1. 共同点
  • 坐标精度 :所有类都有 DoubleFloat 两个子类,分别表示双精度和单精度浮点坐标。
  • 矩形边界框 :多数基本形状(如椭圆、矩形、圆角矩形)使用 (x, y, width, height) 定义边界框。
2. 区别
  • 特殊参数
    • 弧形 :额外需要 startAngle(起始角度)、extent(角度范围)、type(类型)。
    • 圆角矩形 :额外需要 arcWidtharcHeight(圆角大小)。
    • 贝塞尔曲线:需要控制点坐标,次数越高控制点越多。
  • 构建方式
    • 基本形状:通过构造函数直接定义。
    • 路径形状:通过方法动态添加线段和曲线。

五、如何选择合适的类?

  • 画圆 / 椭圆 :用 Ellipse2D.Double,宽高设为相等。

  • 画矩形 :用 Rectangle2D.Double

  • 画圆角矩形 :用 RoundRectangle2D.Double

  • 画弧形 / 扇形 :用 Arc2D.Double,设置 typePIE

  • 画直线 :用 Line2D.Double

  • 画曲线

    • 简单曲线:QuadCurve2D.Double(一个控制点)。
    • 复杂曲线:CubicCurve2D.Double(两个控制点)。
  • 画多边形 :用 Polygon,定义顶点数组。

  • 组合图形 :用 GeneralPathPath2D.Double,通过方法拼接线段和曲线。

    java 复制代码
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.*;
    import javax.swing.*;
    
    public class ShapeDemo extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            
            // 1. 圆形
            Ellipse2D circle = new Ellipse2D.Double(50, 50, 100, 100);
            g2.setColor(Color.RED);
            g2.fill(circle);
            
            // 2. 矩形
            Rectangle2D rect = new Rectangle2D.Double(200, 50, 100, 80);
            g2.setColor(Color.BLUE);
            g2.fill(rect);
            
            // 3. 圆角矩形
            RoundRectangle2D roundRect = new RoundRectangle2D.Double(350, 50, 100, 80, 20, 20);
            g2.setColor(Color.GREEN);
            g2.fill(roundRect);
            
            // 4. 弧形(扇形)
            Arc2D arc = new Arc2D.Double(50, 200, 100, 100, 0, 90, Arc2D.PIE);
            g2.setColor(Color.ORANGE);
            g2.fill(arc);
            
            // 5. 线段
            Line2D line = new Line2D.Double(200, 200, 300, 300);
            g2.setColor(Color.BLACK);
            g2.draw(line);
            
            // 6. 二次贝塞尔曲线
            QuadCurve2D quad = new QuadCurve2D.Double(350, 200, 400, 250, 450, 200);
            g2.setColor(Color.MAGENTA);
            g2.draw(quad);
            
            // 7. 三次贝塞尔曲线
            CubicCurve2D cubic = new CubicCurve2D.Double(50, 350, 100, 400, 150, 300, 200, 350);
            g2.setColor(Color.CYAN);
            g2.draw(cubic);
            
            // 8. 多边形
            int[] xPoints = {250, 300, 350, 320, 280};
            int[] yPoints = {350, 300, 350, 400, 400};
            Polygon polygon = new Polygon(xPoints, yPoints, 5);
            g2.setColor(Color.DARK_GRAY);
            g2.fill(polygon);
        }
        
        public static void main(String[] args) {
            JFrame frame = new JFrame("Shape Demo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new ShapeDemo());
            frame.setSize(550, 500);
            frame.setVisible(true);
        }
    }
相关推荐
爱吃面条的猿1 小时前
FontMetrics 字体属性类 java
java
蒹葭玉树1 小时前
【C++上岸】C++常见面试题目--操作系统篇(第二十九期)
java·c++·面试
小小仙。1 小时前
IT自学第二十天
java·开发语言
知识即是力量ol1 小时前
一次完整的 Spring Security JWT 鉴权链路解析
java·后端·spring·鉴权·springsecurity
heartbeat..1 小时前
深入理解 JVM:从核心原理到实战应用
java·jvm·jdk·学习笔记
独自破碎E1 小时前
数组列表中的最大距离
java
猿小羽1 小时前
基于 Spring AI 与 Streamable HTTP 构建 MCP Server 实践
java·llm·spring ai·mcp·streamable http
AC赳赳老秦1 小时前
等保2.0合规实践:DeepSeek辅助企业数据分类分级与自动化报告生成
大数据·人工智能·分类·数据挖掘·自动化·数据库架构·deepseek
大模型微调Online1 小时前
深度复盘:Qwen3-4B-Instruct-2507微调实战——打造“快思考、强执行”的 ReAct IoT Agent
java·后端·struts
ASD123asfadxv1 小时前
SAR图像地面军事目标识别与分类:YOLO11-Seg-RFAConv实现教程
人工智能·目标跟踪·分类