C++和Java命令行绘制心形图案

心形线

心形线,是一个圆上的固定一点在它绕着与其相切且半径相同的另外一个圆周滚动时所形成的轨迹,因其形状像心形而得名。

心脏线亦为蚶线的一种。在曼德博集合正中间的图形便是一个心脏线。心脏线的英文名称“Cardioid”是 de Castillon 在1741年的《Philosophical Transactions of the Royal Society》发表的;意为“像心脏的”。

极坐标方程

水平方向: ρ=a(1-cosθ) 或 ρ=a(1+cosθ) (a>0)
垂直方向: ρ=a(1-sinθ) 或 ρ=a(1+sinθ) (a>0)

直角坐标方程

心形线的平面直角坐标系方程表达式分别为 x^2+y^2+a*x=a*sqrt(x^2+y^2) 和 x^2+y^2-a*x=a*sqrt(x^2+y^2)

参数方程

x=a*(2*cos(t)-cos(2*t))
y=a*(2*sin(t)-sin(2*t))
所围面积为3/2*PI*a^2,形成的弧长为8a

通过不同变换可以有如下样式

解题思路

在直角坐标系中x、y轴的正方向分别是右侧和上方,原点在中间;而在命令行中正方向分别是右方和下方,原点在左上角。因此就需要进行坐标轴变换。

由于直角坐标系中的心形线是横着的,因此需要x<->y轴的变换。

由于在命令行具有行高这一固定参数,因此同样字符数的行和列长度是不同的(行会比列短很多),因此又需要进行控制台x轴的拉伸操作。

C++代码

#include <iostream>
#include <math.h>

using namespace std;

#define X_DIVIDED_BY_Y 0.5
#define MAX_X (35.0 / X_DIVIDED_BY_Y)
#define MAX_Y 35.0
#define THRESHOLD 0.5
#define A 13

char getSentenceChar(const char *sentence, int &index) {
 while(true) {
  if (index >= strlen(sentence)) {
   index = 0;
  }
  char c = sentence[index++];
  if(' ' == c) {
   index++;
  } else {
   return c;
  }
 }
}

inline float getX(float x) {
 return (x - MAX_X / 2) * X_DIVIDED_BY_Y;
}

inline float getY(float y) {
 return MAX_Y / 7.0 - y;
}

bool func(float x, float y) {
 return (pow(x, 2) + pow(y, 2) + A * x - A * sqrt(pow(x, 2) + pow(y, 2))) < THRESHOLD;
}

void main(int argc, char** argv) {
 const char *LOVE_SENTENCE = "No rose, no diamond ring, that is the simple and romantic love stories in college. The graduates have to face the approaching of June, a time to farewell their beloved. When their future is confronted with love, which one is more important? What will the lovers do in June?";
 int sentenceIndex = 0;

 for (int y = 0; y <= MAX_Y; y++) {
  for (int x = 0; x <= MAX_X; x++) {
   cout<<(func(getY(y), getX(x)) ? getSentenceChar(LOVE_SENTENCE, sentenceIndex) : '.');
  }
  cout<<endl;
 }

}

Java代码

package com.example.demo;

public class BenevolenceDemo {

 private static final float X_DIVIDED_BY_Y = 0.5f;
 private static final float MAX_X = 35f / X_DIVIDED_BY_Y;
 private static final float MAX_Y = 35f;
 private static final float THRESHOLD = 0.5f;
 private static final float A = 13;
 private static final String LOVE_SENTENCE = "No rose, no diamond ring, that is the simple and romantic love stories in college. The graduates have to face the approaching of June, a time to farewell their beloved. When their future is confronted with love, which one is more important? What will the lovers do in June?";
 private static int sentenceIndex = 0;

 private static char getSentenceChar() {
  while(true) {
   if (sentenceIndex >= LOVE_SENTENCE.length()) {
    sentenceIndex = 0;
   }
   char c = LOVE_SENTENCE.charAt(sentenceIndex++);
   if(' ' == c) {
    sentenceIndex++;
   } else {
    return c;
   }
  }
 }

 public static void main(String[] args) {
  for (int y = 0; y <= MAX_Y; y++) {
   for (int x = 0; x <= MAX_X; x++) {
    System.out.print(func(getY(y), getX(x)) ? getSentenceChar() : '=');
   }
   System.out.println();
  }
 }

 public static final float getX(float x) {
  return (x - MAX_X / 2) * X_DIVIDED_BY_Y;
 }

 public static final float getY(float y) {
  return MAX_Y / 7f - y;
 }

 public static boolean func(float x, float y) {
  return (Math.pow(x, 2) + Math.pow(y, 2) + A * x - A * Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))) < THRESHOLD;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用C++描绘心形

    谁说程序猿就一定不解风情,今天就给大家分享一个C++绘制的心形图案,送给你的TA吧 复制代码 代码如下: #include <stdio.h> void main() {   int i, j, k, l, m;  char c=3;   for (i=1; i<=5; i++)      printf("\n");   for (i=1; i<=3; i++)   {     for (j=1; j<=32-2*i; j++)  printf("

  • C++和Java命令行绘制心形图案

    心形线 心形线,是一个圆上的固定一点在它绕着与其相切且半径相同的另外一个圆周滚动时所形成的轨迹,因其形状像心形而得名. 心脏线亦为蚶线的一种.在曼德博集合正中间的图形便是一个心脏线.心脏线的英文名称"Cardioid"是 de Castillon 在1741年的<Philosophical Transactions of the Royal Society>发表的:意为"像心脏的". 极坐标方程 水平方向: ρ=a(1-cosθ) 或 ρ=a(1+cos

  • 通过Spring Shell 开发 Java 命令行应用

    提到 Java,大家都会想到 Java 在服务器端应用开发中的使用.实际上,Java 在命令行应用的开发中也有一席之地.在很多情况下,相对于图形用户界面来说,命令行界面响应速度快,所占用的系统资源少.在与用户进行交互的场景比较单一时,命令行界面是更好的选择.命令行界面有其固定的交互模式.通常是由用户输入一系列的参数,在执行之后把相应的结果在控制台输出.命令行应用通常需要处理输入参数的传递和验证.输出结果的格式化等任务.Spring Shell 可以帮助简化这些常见的任务,让开发人员专注于实现应用

  • Java命令行运行错误之找不到或无法加载主类问题的解决方法

    目录 前言: 一. 问题分析 二. 问题解决 1. 类名错误 2. 类所在位置未添加至类加载路径中 三.扩展知识 1. JDK目录结构及环境变量介绍 2. 为什么jdk1.5后不需要配置环境变量了? 总结 前言: 虽然学习Java语言约有两年多,但在最近需要使用命令行工具编译并运行Java程序时,还是报错了.花费了一些时间,解决了该问题,发现解决方法在初学Java时使用过.一则,为了避免以后再出现同样的问题而浪费不必要的时间:二则,作为使用该语言的程序员,对于该语言的一些基本问题,应该有清晰的理

  • Android自定义View实现心形图案

    本文实例为大家分享了Android自定义View实现心形的具体代码,供大家参考,具体内容如下 通过继承View实现的❤形 在绘制心形需要Path类中的两个重要方法分别是:moveTo.cubicTo moveTo 不会进行绘制,只用于移动移动画笔. lineTo 用于进行直线绘制. quadTo 用于绘制圆滑曲线,即贝塞尔曲线. cubicTo 同样是用来实现贝塞尔曲线的. 具体实现: public class HeartView extends View { private int mMeas

  • 利用php输出不同的心形图案

    首先为大家分享php输出心形曲线的代码,代码如下 <?php for($t=0;$t<360;$t++) { $y=2*cos($t)-cos(2*$t); //笛卡尔心形曲线函数 $x=2*sin($t)-sin(2*$t); $x+=3; $y+=3; $x*=70; $y*=70; $x=round($x); $y=round($y); $str[]=$x; $y=$y+2*(180-$y);//图像上下翻转 $x=$y; $str[]=$x; } $im=imagecreate(400

  • Java命令行下Jar包打包小结

    jar包打包实现 jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件.第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行.这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件

  • 解决java 命令行乱码的问题

    虚拟机参数加上 -Dfile.encoding=GBK -Ddefault.client.encoding=GBK -Duser.language=zh -Duser.region=CN 补充:java执行cmd命令,返回结果中文乱码问题解决 public static void main(String[] args) { try { // 执行ping命令 Process process = Runtime.getRuntime().exec("cmd /c e:&dir")

  • Java基础之常用的命令行指令

    1.进入某盘,直接打出要进入的存储盘再冒号回车即可 例如:从C盘中的\Users\Administrator目录下进入d盘 打出"d:"再回车就欧克啦~ 2. "dir"显示某目录或某盘下的所有文件目录 例如:1.显示D盘下的文件目录 打出"dir"再回车 3. "md"新建文件夹 例如:1.在d盘下创建一个叫JavaEE的文件[也可在d盘的文件目录下建立文件夹] 格式是md javaEE再回车就可以啦.我们可以去我的电脑d盘

  • Java程序命令行参数用法总结

    目录 基于命令行输入参数 基于命令行输入系统属性 JVM参数设置 环境变量 vs 系统属性 基于Maven命令运行Spring Boot应用 前言: 在命令行中输入可以输入各类参数,本文将针对这些参数做一个小结. 基于命令行输入参数 测试程序如下: import java.util.Arrays; public class Main { public static void main(String[] args) { System.out.println("System Property, ab

随机推荐