如何用程序画一个心形

方程看着复杂,我们不管这是怎么推导出来的,让我们使用拿来主义,直接使用吧!我们回忆一下圆的方程,比如:x^2+y^2=1,那么所有的点(x,y),若使得x^2+y^2==1,则这个点在这个圆的边界线上;若使得x^2+y^2<1,则这个点在圆内;若使得x^2+y^2>1,则这个点在圆外。

好了,同理,对于这个方程,若点(x,y)让方程左边等于0,则这个点在这个心形曲线上;若让方程左边小于0,则这个点在这个心形线内;若让方程左边大于0,则这个点在这个心形线外。

我们要做的就是写一个双重循环,遍历x和y的值,将心形线以内的地方,涂上某一个字符,比如‘*’。

那么我们首先要确定我们双重循环的边界。我们打印输出,肯定是要逐行输出,从上到下。所以我们的第一层循环要对y值做循环。观察一下,可以看到y的上界大概是1.3;下界大概是-1.1;所以,我们可以从1.3逐渐减少到-1.1,初始我们可以选取步长为0.1。同理,对于x,可以看出他的左右边界大概为-1.2和+1.2,我们就从-1.2遍历到1.2,步长也选择0.1。

php的实现代码如下

$str = /*join("", range('a', 'z'))*/"Oo";
$index = 0;
for($y = 1.3; $y>=-1.1;$y-=0.1) {
    for($x=-1.8;$x<=1.8;$x+=0.1) {
        //if(pow($x*$x+$y*$y-1.0, 3) - $x*$x*$y*$y*$y <= 0.0) {
        if($x*$x + pow(5.0*$y/4.0-sqrt(abs($x)), 2) - 1 <= 0.0) {
            //$randstr = str_shuffle($str);
            //echo substr($randstr, 0, 2);
            //保持str原字符串的输出顺序
            /*if($index < strlen($str) - 1) {
                echo $str[$index].$str[$index+1];
                $index += 2;
            }else if($index < strlen($str)) {
                echo $str[$index].$str[0];
                $index = 1;
            }else {
                $index = 0;
                echo $str[$index].$str[$index+1];
                $index += 2;
            }*/
            echo "Oo";
        }else {
            echo "  ";
            $index = 0;
        }
    }
    echo "\n";
    $index = 0;
}

上述分别有两种算法的实现,还有一种的算法方程是如下图

文章内容参考自:http://www.imooc.com/article/16359

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注