首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用Java绘制五角星-GUI与控制台-双版本

使用Java绘制五角星-GUI与控制台-双版本

作者头像
红目香薰
发布2025-12-16 14:51:27
发布2025-12-16 14:51:27
1780
举报
文章被收录于专栏:CSDNToQQCodeCSDNToQQCode

前言

在计算机图形学中,绘制几何图形是一项基础且重要的技能。本文将介绍如何使用Java实现五角星的绘制,分别通过图形界面(GUI)和控制台两种不同的方式。这两种方法展示了Java在图形处理方面的灵活性,也是学习Java编程和算法思维的绝佳案例。 ​​

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过学习这两个示例,你将掌握:

  1. Java Swing图形界面编程
  2. 控制台字符图形绘制
  3. 数学计算在图形绘制中的应用
  4. Bresenham直线算法的实现

核心代码说明

方法一:使用Java Swing绘制图形界面五角星 (Demo4.java)

这个方法使用Java的Swing和AWT库来创建一个图形窗口,并在窗口中绘制一个红色的五角星。

代码语言:javascript
复制
import javax.swing.*;
import java.awt.*;

public class Demo4 extends JFrame {
    
    public Demo4() {
        setTitle("Star Drawing");
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        Graphics2D g2d = (Graphics2D) g;
        
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        g2d.setColor(Color.RED);
        
        int centerX = getWidth() / 2;
        int centerY = getHeight() / 2;
        int radius = 100;
        
        int[] xPoints = new int[10];
        int[] yPoints = new int[10];
        
        for (int i = 0; i < 10; i++) {
            double angle = Math.PI / 2 - i * 2 * Math.PI / 10;
            
            int currentRadius = (i % 2 == 0) ? radius : radius / 2;
            
            xPoints[i] = (int) (centerX + currentRadius * Math.cos(angle));
            yPoints[i] = (int) (centerY - currentRadius * Math.sin(angle));
        }
        
        g2d.fillPolygon(xPoints, yPoints, 10);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new Demo4();
        });
    }
}

核心算法说明

  1. 创建一个JFrame窗口作为绘图容器
  2. 重写paint方法,使用Graphics2D进行绘图
  3. 计算五角星的十个顶点(五个外角点和五个内角点)
  4. 使用数学公式计算每个点的坐标:
    • 外角点使用完整半径
    • 内角点使用一半的半径
    • 使用三角函数计算每个点的精确位置
  5. 使用fillPolygon方法绘制填充的五角星
方法二:使用控制台字符绘制五角星 (Demo5.java)

这个方法在控制台中使用字符(‘*’)绘制五角星,展示了如何在没有图形界面的情况下实现图形绘制。

代码语言:javascript
复制
public class Demo5 {
    public static void main(String[] args) {
        int size = 20;
        
        char[][] screen = new char[size][size];
        
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                screen[i][j] = ' ';
            }
        }
        
        int centerX = size / 2;
        int centerY = size / 2;
        
        int outerRadius = size / 2 - 2;
        int innerRadius = outerRadius / 2;
        
        int[][] points = new int[10][2];
        
        for (int i = 0; i < 10; i++) {
            double angle = Math.PI / 2 - i * 2 * Math.PI / 10;
            
            int currentRadius = (i % 2 == 0) ? outerRadius : innerRadius;
            
            points[i][0] = (int) (centerX + currentRadius * Math.cos(angle));
            points[i][1] = (int) (centerY - currentRadius * Math.sin(angle));
        }
        
        for (int i = 0; i < 10; i++) {
            int nextIndex = (i + 1) % 10;
            drawLine(screen, points[i][0], points[i][1], points[nextIndex][0], points[nextIndex][1], '*');
        }
        
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(screen[i][j]);
            }
            System.out.println();
        }
    }
    
    private static void drawLine(char[][] screen, int x1, int y1, int x2, int y2, char c) {
        int dx = Math.abs(x2 - x1);
        int dy = Math.abs(y2 - y1);
        int sx = x1 < x2 ? 1 : -1;
        int sy = y1 < y2 ? 1 : -1;
        int err = dx - dy;
        
        while (true) {
            if (x1 >= 0 && y1 >= 0 && x1 < screen.length && y1 < screen[0].length) {
                screen[y1][x1] = c;
            }
            
            if (x1 == x2 && y1 == y2) {
                break;
            }
            
            int e2 = 2 * err;
            if (e2 > -dy) {
                err -= dy;
                x1 += sx;
            }
            if (e2 < dx) {
                err += dx;
                y1 += sy;
            }
        }
    }
}

核心算法说明

  1. 创建一个二维字符数组作为"屏幕"
  2. 计算五角星的十个顶点坐标(与GUI方法类似)
  3. 使用Bresenham直线算法绘制五角星的边缘
  4. 将结果打印到控制台

注意事项

GUI绘制方法 (Demo4.java)
  1. 需要导入javax.swing和java.awt包
  2. 使用抗锯齿(setRenderingHint)可以使图形边缘更平滑
  3. 窗口大小会影响五角星的位置和比例
  4. 使用SwingUtilities.invokeLater确保GUI在事件调度线程中创建
控制台绘制方法 (Demo5.java)
  1. 控制台字符绘制受限于字符的矩形特性,可能导致图形不够平滑
  2. 屏幕大小(size变量)需要适当设置,太小会导致五角星变形
  3. Bresenham算法是一种高效的直线绘制算法,但在字符网格上可能出现不连续的情况
  4. 边界检查很重要,防止数组越界异常

使用方法

GUI绘制方法 (Demo4.java)
  1. 编译Java文件:javac Demo4.java
  2. 运行程序:java Demo4
  3. 程序会打开一个窗口,显示红色的五角星
  4. 关闭窗口即可退出程序
控制台绘制方法 (Demo5.java)
  1. 编译Java文件:javac Demo5.java
  2. 运行程序:java Demo5
  3. 程序会在控制台输出由’*'字符组成的五角星
  4. 程序执行完毕后自动退出

对学习Java的重要作用

  1. 面向对象编程实践:通过继承JFrame类和重写paint方法,展示了Java面向对象的特性
  2. 数学应用:使用三角函数计算坐标点,展示了数学在编程中的应用
  3. 算法学习:Bresenham直线算法是计算机图形学的经典算法,学习它有助于理解算法思维
  4. 多种输出方式:展示了Java在GUI和控制台两种不同环境下的图形处理能力
  5. 数据结构应用:使用数组存储和操作坐标点,展示了数据结构的实际应用
  6. 问题分解能力:将复杂的图形绘制问题分解为计算坐标点和连接线段两个子问题

总结

通过这两个五角星绘制的例子,我们可以看到Java在图形处理方面的多样性和灵活性。GUI方法使用Java Swing提供了更美观、交互性更强的图形界面,而控制台方法则展示了如何在资源受限的环境中实现图形绘制。

这两种方法虽然实现方式不同,但核心算法思想是相似的:计算五角星的顶点坐标,然后将这些点连接起来。这种"数学模型+图形渲染"的思路是计算机图形学的基本方法,也是解决许多图形问题的通用思路。

无论是哪种方法,都体现了编程中的重要原则:问题分解、算法选择和数据结构应用。通过学习这些例子,不仅可以掌握具体的图形绘制技术,还能提升整体的编程思维和解决问题的能力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 核心代码说明
    • 方法一:使用Java Swing绘制图形界面五角星 (Demo4.java)
    • 方法二:使用控制台字符绘制五角星 (Demo5.java)
  • 注意事项
    • GUI绘制方法 (Demo4.java)
    • 控制台绘制方法 (Demo5.java)
  • 使用方法
    • GUI绘制方法 (Demo4.java)
    • 控制台绘制方法 (Demo5.java)
  • 对学习Java的重要作用
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档