Java代码输出心形图案

初学编程的小伙伴肯定有过这样一个想法,就是我能不能利用代码来输出一个特定的图案呢?比如一个爱心?那必然是可以的,代码能实现的功能很多,这只是其中的一小小用法。以下是思路与代码。

方法一

暴力解法

我们可以先画出一个正方形,然后,随后我们可以在这个正方形的范围内画出一个爱心图案,最后将爱心图案所涉及到的点一个一个标记起来,最后在有标记点的地方输出小爱心,没有标记点的地方输出空白。这样就能在屏幕上输出一个爱心图案了。

例如:这里我选择的是,使用网格图来作为载体,这样更好进行标记点的位置,也便于代码实现

Java代码实现

注:由于在Java中引用数据类型的默认值为 0 ,所以我们只需要将特定的位置赋值为1起到标记的作用,无需标记其他位置。代码中说的行列是以上面图像作为基础的

java 复制代码
public class test {
    public static void main(String[] args) {
        //根据图像要求,创建一个行长为12,列长为13的二维数组
        int[][] arr=new int[12][13];
        //第一行像素点的赋值
        for(int i=2,j=10; i<5; ++i,--j){
            arr[0][i]=1;
            arr[0][j]=1;
        }
        //第二行像素点的赋值
        int index=1;
        arr[index][1]=1;
        arr[index][5]=1;
        arr[index][11]=1;
        arr[index][7]=1;

        //中间独自一个的格子
        int n=arr[0].length;
        arr[index+1][(n-1)/2]=1;

        //第二行到第五行像素点的赋值
        int i;
        for(i=2; i<6; ++i){
            arr[i][0]=1;
            arr[i][n-1]=1;
        }
        //第六行到最后一行的格子
        int left=1;
        int right=n-2;
        for(; i<arr.length; ++i){
            arr[i][left++]=1;
            arr[i][right--]=1;
        }

        //内部填满
        InternalMarkup(arr);

        //输出函数
        Effect_Output(arr);
    }

    //将爱心内部填满
    public static void InternalMarkup(int[][] arr){

        for(int i=1; i<arr.length; ++i){
            //寻找左边界
            int left=0;
            while(arr[i][left++] == 0);
            //寻找右边界
            int right=arr[i].length-1;
            while(arr[i][right--] == 0);

            //左右边界内的格子标记为 1 ,爱心内部填满
            while(left <= right){
                arr[i][left]=1;
                arr[i][right]=1;
                ++left;
                --right;
            }
        }

        //第一行中间格子需要为零
        arr[1][arr[1].length/2]=0;
        return;
    }

    //按传递的参数输出爱心图案
    public static void Effect_Output(int[][] arr){
        //爱心符号的unicode码
        char target='\u2764';
        for(int i=0; i<arr.length; ++i){
            for(int j=0; j<arr[i].length; ++j){
                //判断该下标的值是否为 1 ,是则输出爱心图案,反之输出空格
                if(arr[i][j] == 1){
                    System.out.print(target+" \t");
                } else{
                    System.out.print(" \t");
                }
            }
            System.out.println();   //换行
        }
    }

运行效果

总结

虽然使用暴力解法,语法变得更简单,但是输出的图像还是太过于生硬了。

方法二

数学公式解法

相信很多人都听说过笛卡尔方程的故事,该方程图形显现出来确实一个心形图像。公式:(X²×Y²-1)³ - X²×Y³=0;

图像

该图片来自网络,侵删

Java代码实现

注:**以下代码部分来自知乎,怎么用JAVA打出来小爱心~~~? - 木木编程的回答 - 知乎https://www.zhihu.com/question/352773471/answer/2494438152**,注释是自己添加的,本人数学比较差,属实是没想出来怎么用数学公式解这题。

java 复制代码
public class test
{
	public static void main(String[] args)
	{
        //需要使用浮点数进行运算
        float x,y;
        //y轴控制的是图像的长度,因为图像打印是由上往下打印,根据图像y从正数开始
        //其中递减的值是可由实际情况调整
        for(y=1.3f; y>-1.1f; y-=0.15f){
            //x轴控制的是图像的宽度,自左向右打印,根据图像x从负数开始
            for(x=-1.2f; x<=1.2f; x+=0.05f){
                //使用中间变量代替较长的运算
                float temp=x*x+y*y-1;
                //pow方法作用是获取x的n次方,第一个参数为x,第二个参数为n
                if( (Math.pow(temp,3) - (x*x*Math.pow(y,3) )) <= 0.0f){
                    //由于unicode码不好进行对齐,所以这里使用 * 号代替
                    System.out.print("*");
                }else{
                    //输出空格
                    System.out.print(" ");
                }
            }
            //换行
            System.out.println();
        }
	}
}

运行效果

总结

使用公式法解,图像优化了很多,且语法也并不复杂,只是对数学不太感冒的人来说不够友好,例如我,但这的确是我所了解到的最优解了。所以想要写出更好更优美的代码,还是要学好用好数学。在此,吾与诸君共勉之。

感谢各位的阅读,如有错误,欢迎指出。

相关推荐
Swift社区3 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht3 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht3 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20243 小时前
Swift 数组
开发语言
吾日三省吾码4 小时前
JVM 性能调优
java
stm 学习ing4 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
LNTON羚通4 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
湫ccc5 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐5 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis