用多种编程语言绘制爱心图案的艺术

news2025/1/23 13:53:14

目录

一、Python:用 Matplotlib 绘制静态爱心

代码示例:

效果展示:

二、JavaScript:用 HTML5 Canvas 绘制跃动的爱心

代码示例:

效果展示:

三、Java:用 Swing 绘制静态爱心

代码示例:

效果展示:

四、C 语言:在控制台打印静态爱心

代码示例:

效果展示:

五、C++:使用 SFML 库绘制动态爱心

代码示例:

效果展示:

六、JavaScript:在控制台打印动态爱心

代码示例:

效果展示:

结语


爱心,作为浪漫和美好的象征,一直以来都是编程世界中有趣的图形挑战。本文将带您走进多种常见的编程语言,探索如何用代码绘制出美丽的爱心图案。其中,既有静态的精美图案,也有跃动的动态效果。让我们一起感受编程与艺术的完美融合。


一、Python:用 Matplotlib 绘制静态爱心

Matplotlib 是 Python 中强大的绘图库,我们可以利用数学公式,在平面上绘制出精致的爱心。

代码示例:

 
import numpy as np
import matplotlib.pyplot as plt

# 参数 t 取值范围
t = np.linspace(0, 2 * np.pi, 1000)
# 爱心公式
x = 16 * np.sin(t) ** 3
y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t)

# 绘图设置
plt.figure(figsize=(6, 6))
plt.plot(x, y, color='red')
plt.fill_between(x, y, color='red')
plt.axis('equal')
plt.axis('off')
plt.show()

效果展示:

运行上述代码,您将看到一个红色填充的爱心图案,完美呈现在坐标系中。


二、JavaScript:用 HTML5 Canvas 绘制跃动的爱心

利用 HTML5 Canvas,我们可以在网页上绘制并呈现动态的爱心效果,为网页增添一份浪漫。

代码示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>爱心动画</title>
    <style>
        canvas {
            background-color: #fff;
            display: block;
            margin: 0 auto;
        }
    </style>
</head>
<body>
<canvas id="canvas" width="600" height="500"></canvas>
<script>
    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');

    function drawHeart(scale) {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.beginPath();
        for (let i = 0; i <= Math.PI * 2; i += 0.01) {
            let x = 16 * Math.pow(Math.sin(i), 3);
            let y = 13 * Math.cos(i) - 5 * Math.cos(2 * i) - 2 * Math.cos(3 * i) - Math.cos(4 * i);
            ctx.lineTo(300 + x * scale, 250 - y * scale);
        }
        ctx.fillStyle = 'red';
        ctx.fill();
    }

    let scale = 10;
    let delta = 0.1;
    function animate() {
        if (scale > 12 || scale < 8) delta = -delta;
        scale += delta;
        drawHeart(scale);
        requestAnimationFrame(animate);
    }
    animate();
</script>
</body>
</html>

效果展示:

将上述代码保存为 .html 文件并在浏览器中打开,您将看到一个尺寸不断变化的红色爱心,仿佛在心跳般跃动。


三、Java:用 Swing 绘制静态爱心

Java 的 Swing 库提供了强大的图形界面支持,我们可以利用它在应用程序窗口中绘制爱心。

代码示例:

 
import javax.swing.*;
import java.awt.*;

public class HeartShape extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        int width = getWidth();
        int height = getHeight();

        g2.setColor(Color.RED);
        g2.translate(width / 2, height / 2);

        for (double t = 0; t <= 2 * Math.PI; t += 0.01) {
            double x = 16 * Math.pow(Math.sin(t), 3);
            double y = 13 * Math.cos(t) - 5 * Math.cos(2 * t)
                    - 2 * Math.cos(3 * t) - Math.cos(4 * t);
            g2.fillOval((int) x, (int) -y, 2, 2);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("爱心图案");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new HeartShape());
        frame.setSize(600, 600);
        frame.setVisible(true);
    }
}

效果展示:

编译并运行该程序,您将看到一个窗口中绘制着精美的红色爱心,呈现出细腻的视觉效果。


四、C 语言:在控制台打印静态爱心

即使是在控制台中,我们也能用简单的字符拼出爱心的形状,充分体现编程的魅力。

代码示例:

 
#include <stdio.h>

int main() {
    float x, y;
    for (y = 1.5f; y > -1.5f; y -= 0.1f) {
        for (x = -1.5f; x < 1.5f; x += 0.05f) {
            float a = x * x + y * y - 1;
            if (a * a * a - x * x * y * y * y <= 0.0f)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
    return 0;
}

效果展示:

运行程序,控制台会输出由星号 * 组成的爱心形状,简单却别有一番风味。


五、C++:使用 SFML 库绘制动态爱心

SFML(Simple and Fast Multimedia Library)是一个简洁高效的多媒体库,用于创建图形界面、处理音频等。我们可以用它来绘制动态的爱心图案。

代码示例:

 
#include <SFML/Graphics.hpp>
#include <vector>
#include <cmath>

int main() {
    sf::RenderWindow window(sf::VideoMode(600, 500), "爱心动画");
    sf::ConvexShape heart;
    heart.setFillColor(sf::Color::Red);

    std::vector<sf::Vector2f> points;
    for (double t = 0; t <= 2 * M_PI; t += 0.01) {
        double x = 16 * pow(sin(t), 3);
        double y = 13 * cos(t) - 5 * cos(2 * t)
                 - 2 * cos(3 * t) - cos(4 * t);
        points.emplace_back(300 + x * 10, 250 - y * 10);
    }
    heart.setPointCount(points.size());
    for (size_t i = 0; i < points.size(); ++i) {
        heart.setPoint(i, points[i]);
    }

    float scale = 1.0f;
    float delta = 0.005f;

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        if (scale > 1.2f || scale < 0.8f) delta = -delta;
        scale += delta;
        heart.setScale(scale, scale);
        heart.setPosition(300 - 300 * (scale - 1), 250 - 250 * (scale - 1));

        window.clear(sf::Color::White);
        window.draw(heart);
        window.display();
    }
    return 0;
}

效果展示:

编译并运行代码,您将看到一个窗口中红色的爱心不断地缩放,呈现出动态的效果。

注意:需要先安装 SFML 库才能编译运行此代码。


六、JavaScript:在控制台打印动态爱心

利用 JavaScript,我们还能在浏览器的控制台中打印出动态变化的爱心图案,别具一格。

代码示例:

 
let frames = 0;
function animateHeart() {
    let output = '';
    for (let y = 15; y > -15; y -= 1) {
        for (let x = -30; x < 30; x += 1) {
            let a = x / 15;
            let b = y / 15;
            let equation = a * a + b * b - 1;
            if (equation * equation * equation - a * a * b * b * b <= 0.0) {
                output += '*';
            } else {
                output += ' ';
            }
        }
        output += '\n';
    }
    console.clear();
    console.log(output);
    frames++;
    if (frames < 20) {
        setTimeout(animateHeart, 200);
    }
}
animateHeart();

效果展示:

在浏览器的开发者工具中运行上述代码,控制台会不断刷新,显示出动态变化的爱心形状。

编程语言图形类型使用库/技术动态/静态代码示例功能
Python平面图形Matplotlib静态使用数学公式绘制红色填充的爱心
JavaScript (Canvas)网页图形HTML5 Canvas动态实现心跳效果的爱心
Java图形界面Swing静态在应用程序窗口中绘制精致的红色爱心
C控制台字符图形控制台输出静态在控制台打印由星号组成的爱心
C++图形界面SFML动态使用 SFML 库绘制并缩放的动态爱心
JavaScript (控制台)控制台字符图形浏览器控制台动态控制台中显示动态变化的爱心形状

代码创作的特点和说明

  • Python:简洁的代码结构,借助 Matplotlib 轻松绘制出高质量的静态图形。适合快速生成图像。
  • JavaScript (Canvas):利用 Canvas 实现网页上的动态效果,非常适合交互性强的应用场景。
  • Java (Swing):Java GUI 支持绘制复杂的图形,并能在桌面应用程序中展示静态爱心。
  • C:通过简单的控制台输出,实现字符画效果,最基本的图形展示手段,展现编程的朴素魅力。
  • C++ (SFML):结合 SFML 库的强大图形支持,能绘制复杂且动态的图形效果,适合游戏开发或图形展示。
  • JavaScript (控制台):以独特的方式在控制台中呈现动态字符图形,趣味性十足,适合展示编程的灵活性。

结语

通过以上的示例,我们可以看到,编程语言不仅是解决问题的工具,更是创造艺术的媒介。不同的语言有着各自的特色,但它们都能用数学和逻辑之美,绘制出浪漫的爱心图案。希望本文能激发您对编程艺术的兴趣,鼓励您探索更多有趣的代码创作。


提示:以上代码均可直接复制运行,若遇到问题,请确保已正确安装相关的编译环境和库。例如,C++ 的示例需要先安装 SFML 库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【新手上路】衡石分析平台系统管理手册-安全管理

安全策略​ 安全策略是针对系统中所有用户进行的安全控制&#xff0c;只有系统管理员可以设置。 打开设置->安全策略页面。 登录安全策略​ 启用复杂密码​ 启用之后&#xff0c;用户修改密码时&#xff0c;必须输入符合要求的复杂密码。 密码90天失效​ 密码的有效期…

江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

【嵌入式】二进制参数配置生效策略引发数据类型校验失败问题

背景 嵌入式产品发布后&#xff0c;可以通过升级二进制小文件进行产品参数配置。因为预留配置问题&#xff0c;当二进制转化为内部结构体架构化数据时&#xff0c;会判断如果值为255则表示无需配置生效。但是因为笔误&#xff0c;代码不严谨&#xff0c;调试的时候发现数值校验…

用代码生成代码之Roslyn-C#代码分析和生成工具

Roslyn 是什么&#xff1f; Roslyn是微软公司开源的.NET编译器&#xff0c;它提供了丰富的代码分析API&#xff0c;并支持C#和Visual Basic代码的编译。 Roslyn 的主要功能 编译器扩展&#xff1a; 使用Roslyn可以创建自定义的编译器扩展&#xff0c;如语法分析器、重构器、…

50页PPT麦肯锡精益运营转型五步法

读者朋友大家好&#xff0c;最近有会员朋友咨询晓雯&#xff0c;需要《 50页PPT麦肯锡精益运营转型五步法》资料&#xff0c;欢迎大家下载学习。 知识星球已上传的资料链接&#xff1a; 企业架构 企业架构 (EA) 设计咨询项目-企业架构治理(EAM)现状诊断 105页PPTHW企业架构设…

JavaSE--集合总览02:单列集合Collection的体系之一:List

Collection体系的特点 分为 list 和set集合&#xff0c;这篇文章主要讲述List&#xff0c;下篇讲述Set。 简单认识单列集合collection集合的特点 : list集合的特点&#xff1a; 有序 可重复 有索引 set集合的特点&#xff1a;无序 不重复 无索引 其中LinkedHashSet有序 TreeS…

基于springboot的智慧社区微信小程序

文未可获取一份本项目的java源码和数据库参考。 本课题研究目标 本文主要对小区生活服务平台的功能和非功能需求进行了分析&#xff0c;系统除了提供物业保修、小区资讯、投诉留言、常用电话等基础功能外&#xff0c;为了满足用户的多样化需求&#xff0c;还提供邻里圈子和有…

仪表放大器AD620

AD623 是一款低功耗、高精度的仪表放大器&#xff0c;而不是轨到轨运算放大器。它的输入电压范围并不覆盖整个电源电压&#xff08;轨到轨&#xff09;&#xff0c;但在单电源供电下可以处理接近地电位的输入信号。 AD620 和 AD623 都是仪表放大器&#xff0c;但它们在一些关键…

【OceanBase诊断调优】—— 断连接问题根因分析

背景 当前用户请求执行的链路主要如下&#xff0c;请求从客户端发送到ObProxy&#xff0c;ObProxy将请求路由到对应的ObServer节点&#xff0c;ObServer处理请求发送回包给ObProxy&#xff0c;ObProxy回给客户端。目前整条链路上都可能发生断连接的场景&#xff0c;比如请求处…

Java 每日一刊(第12期):面向对象

“任何复杂的程序&#xff0c;都可以通过分解成若干个简单的问题来解决。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; 类对象类与对象的关系Java 中的三种变量类型OOP 的三大特性 类 类 是对现实世界中某类事物…

修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)

随着Docker技术的广泛应用&#xff0c;它极大地简化了复杂项目的部署与维护流程&#xff0c;仅凭单一镜像即可轻松运行。然而&#xff0c;随着数据量不断增长&#xff0c;Docker的默认数据存储方式可能逐渐成为挑战&#xff0c;尤其是当默认安装于根目录&#xff08;“/”&…

计算机的错误计算(九十八)

摘要 探讨 的计算精度问题。 由计算机的错误计算&#xff08;九十六&#xff09;知&#xff0c;IEEE 754-2019标准中含有 运算。 另外&#xff0c;似乎没有语言直接编程实现内置了该运算。 例1. 已知 x-0.9999999999321 . 计算 不妨用Java编程计算&#xff1a; import…

微服务注册中⼼1

1. 微服务的注册中⼼ 注册中⼼可以说是微服务架构中的”通讯录“ &#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c; 服务会注册到这⾥&#xff0c;当服务需要调⽤其它服务时&#xff0c;就这⾥找到服务的地址&#xff0c;进⾏调⽤。 1.1 注册中⼼的…

前端面试题——token安全问题处理与大数据列表展示

1.长时间保存token问题 长时间保存Token涉及多个方面的问题&#xff0c;包括安全性、性能、以及Token的管理策略等。以下是对长时间保存Token问题的详细分析&#xff1a; 一、安全性问题 Token泄露风险&#xff1a; Token是用户身份验证的凭证&#xff0c;如果长时间保存且未…

矿场工程车检测数据集 4900张 工程车 带标注voc yolo

矿场工程车检测数据集 数据集描述 该数据集旨在用于矿场工程车的检测和分类任务&#xff0c;涵盖了多种常见的工程车辆类型。数据集包含了大量的工程车图像及其对应的标注信息&#xff0c;可用于训练计算机视觉模型&#xff0c;以识别和定位矿场中的不同工程车辆。 数据规模 …

【速成Redis】02 Redis 五大基本数据类型常用命令

前言&#xff1a; 上一节课&#xff0c;我们对redis进行了初步了解&#xff0c;和安装好了redis。【速成Redis】01 Redis简介及windows上如何安装redishttps://blog.csdn.net/weixin_71246590/article/details/142319358?spm1001.2014.3001.5501 该篇博客&#xff0c;我们正…

如何在Unity发布安卓移动端游戏

在移动端手机游戏开发的时候&#xff0c;我从最开始就遇到了一个问题&#xff0c;并不是技术上的问题&#xff0c;而是移动端游戏如何进行发布的问题&#xff0c;由于之前所使用的都是基于Windows平台的电脑游戏&#xff0c;并没有使用过手机游戏开发环境&#xff0c;所以&…

【ComfyUI】自定义节点ComfyUI_LayerStyle——模仿 Adob​​e Photoshop 的图层样式、图层混合、图文混合、添加不可见水印

官方代码&#xff1a;https://github.com/chflame163/ComfyUI_LayerStyle.git 相关资料下载&#xff1a;https://pan.baidu.com/s/16vmPe6-bycHKIjSapOAnZA?pwd0919 简介 在ComfyUI画布点击右键 - Add Node, 找到 “&#x1f63a;dzNodes”。 节点根据功能分为5组&#xff…

C++ | Leetcode C++题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canCross(vector<int>& stones) {int n stones.size();vector<vector<int>> dp(n, vector<int>(n));dp[0][0] true;for (int i 1; i < n; i) {if (stones[i] - stones[i -…

【tomcat】tomcat学习笔记

文章目录 1.tomcat乱码问题1.1 linux乱码中文显示乱码问号问题1.2windows乱码1.2.1 方式一1.2.2方式二 1.3 Idea中运行tomcat乱码问题 2. 获取tomcat启动端口号3. idea运行tomcat 的配置问题4.dockerfile构建tomcat镜像问题4.1 替换端口号 5.启动多个tomcat方法6.修改tomcat JA…