实现笛卡尔心形线的重复循环绘制

HTML部分:

1.<a οnclick="logoClick()"></a>

2.<div id="canvasZone">
       <canvas id="myCanvas"></canvas>
   </div>

CSS部分:

#canvasZone {
    width: 100%;
    height: 100%;
    text-align: center;
    padding-top: 20px;
    margin-left: -35px;
}
#myCanvas {
    height: 300px;
    width: auto;
}

JS部分:

var arr = [];//保存所有的XY坐标,只为验证。实际程序中可删除。 

var r = 4;
var radian;//弧度
var i;
var radianDecrement;//弧度增量
var time = 15;//每个点之间的时间间隔
var intervalId;
var num = 618;//分割为 618 个点
var startRadian = Math.PI;
var ctx;

function logoClick(){
    startAnimation();
    window.setInterval("lisner()",1);//监听事件,监听是否画所有的点
}

function lisner(){
    if(i >= num){//判断点是否画完
        i = 0;//当所有的点画完即进行初始化
       $("#canvasZone").empty();//清空画布
       $("#canvasZone").append("<canvas id=\"myCanvas\"></canvas>");//重新建立画布并开始进行内容绘制
       startAnimation();
    }
}

function startAnimation() {
    ctx = document.getElementById("myCanvas").getContext("2d");
    //让画布撑满整个屏幕,-20是滚动条的位置,需留出。如滚动条出现则会挤压画布。
    WINDOW_HEIGHT=document.documentElement.clientHeight-20;
    WINDOW_WIDTH=document.documentElement.clientWidth-20;
    ctx.width = WINDOW_WIDTH;
    ctx.heigh = WINDOW_HEIGHT;
    drawHeart();
}
function drawHeart() {
    ctx.strokeStyle = "red";
    ctx.lineWidth = 1;//设置线的宽度
    radian = startRadian;//弧度设为初始弧度
    radianDecrement = Math.PI / num * 2;
    ctx.moveTo(getX(radian), getY(radian));//移动到初始点
    i = 0;
    intervalId = setInterval("printHeart()", time);
}
//x = 16 sin^3 t, y = (13 cos t - 5 cos 2t - 2 cos 3t - cos 4t)
function printHeart() {
    radian += radianDecrement;
    ctx.lineTo(getX(radian), getY(radian));//在旧点和新点之间连线
    //arr.push("X:" + getX(radian) + "<br/>Y:" + getY(radian) + "<br/>");
    i++;
    ctx.stroke();//画线
    if (i >= num) {
        clearInterval(intervalId);
       //document.getElementById("bs").innerHTML = arr.join("");//打印所有的XY坐标点。
    }
}
function getX(t) {//由弧度得到 X 坐标
    return 100 + r * (16 * Math.pow(Math.sin(t), 3));
}
function getY(t) {//由弧度得到 Y 坐标
    return 50 - r * (13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t));
}

转载于:https://www.cnblogs.com/Man-Dream-Necessary/p/5058321.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/*=============================================== 作者:LXZ-2008 FROM:CUMT 计08级 时间:2012-04-22 功能:能在SDK、MFC编程中实现笛卡尔 坐标系统的绘制,以及曲线,点的绘制。 特性:1.本程序采用面向对象思想设计; 2.具备很好的独立性,随时可以把这两个文件应 用在任意SDK、MFC开发中; 3.有良好的灵活性,扩展性,易用性,在稍微扩 展一下可以绘制任意曲线,图形; 4.具备良好的组合性,符合模块内高内聚,模块 外低耦合的思路; 5.整个程序仅有1300行左右代码,如果嫌代码过 多,可以把原先变量的PROTECTED保护类型打开, 换成PUBLIC,这样去掉GET和SET函数,这个思路 起源于我对J2EE中STRUTS2框架的学习以及对COM 组件技术的了解,它们也是这种思路这时可以省 下几百行代码。 6.当然也会有设计模式的思路在里面。 个人说明: 本程序花了我将近2天的时间编写,尽管开始有点 不想,但是还是觉得有意义,能给广大网友提供益处。 本系统的雏形来自2010年下半年的程序,当时花了 10天时间,弄了3千行代码。在现在看来当时的程序的 执行效率未必比现在的低,但是可维护性糟糕,可拓展 性糟糕,不具备良好的灵活性。需求改变了,代码会大 幅改变。换句话说,现在看来当时的程序是十分糟糕的, 生命周期已经结束。 而在用了面向对象的思想和设计模式,以及一些数 据结构去重新搭建这个系统的时候,代码其实1千多行就 搞定了,时间3-4天,不需要那么多(现在我来弄的话)。 主要起源于自己参与真实的有数十万代码的项目的开发, 这样提高了对程序开发的认识,以及商业程序应该如何 开发。同时也是自己面向对象思想和设计模式学习,对 自身思想的提高。 希望阅读代码的人觉得这些代码是优雅的,这就满 足了,尽管注释少了些,你们自己加吧。 QQ:706625262 E-MAIL:706625262@qq.com 不做商业和技术支持。 声明: 本程序代码未经本人同意,或者未给我MONEY的前提下, 不得用于商业目的,别让我鄙视你。在非商业目的使用 下请注明本人是原创,表学腾讯。 ==================================================*/
### 回答1: 要使用两个 for 循环实现笛卡尔心形曲线,可以将 x 和 y 的取值范围分别拆分成两个循环,然后在内层循环中计算每个点的坐标并输出。 下面是一个示例代码,可以使用两个 for 循环来打印出笛卡尔心形曲线的图形: ```c #include <stdio.h> #include <math.h> int main() { int x, y, r = 16; for (y = r; y >= -r; y--) { for (x = -2 * r; x <= 2 * r; x++) { if (pow(x / 4.0, 2) + pow(y / 4.0, 2) - pow(r, 2) <= 0) { if (pow(x / 4.0, 2) + pow((y - 7 * sin(x / 4.0)) / 4.0, 2) - pow(r, 2) <= 0) { printf("*"); } else { printf(" "); } } else { printf(" "); } } printf("\n"); } return 0; } ``` 在这个示例代码中,我们使用了两个 for 循环分别遍历 y 和 x 的取值范围。在内层循环中,我们使用笛卡尔心形曲线的数学方程来计算出每个点的坐标,然后根据坐标和半径的关系来判断这个点是否在曲线上。如果是,我们输出一个字符表示这个点,否则输出一个空格表示这个点不在曲线上。 需要注意的是,在这个示例代码中我们使用了一个常数 r 来表示曲线的半径。同时,为了让图形显示完整,我们将 y 的取值范围从 r 到 -r,x 的取值范围从 -2r 到 2r。如果你希望调整图形的大小和位置,可以调整这些常数的值。 ### 回答2: 要实现笛卡尔心形曲线,可以借助两个for循环来控制曲线的生成。 首先,我们需要确定心形曲线的数学表达式。一种常用的表达式是: x = 16 * (sin(t))^3 y = 13 * cos(t) - 5 * cos(2t) - 2 * cos(3t) - cos(4t) 接下来,我们可以使用两个for循环来生成曲线上的每个点。首先,我们需要确定t的取值范围,通常取0到2π(或360度)。然后,我们可以通过设定一个步长来控制t的变化。 下面是一个使用两个for循环实现笛卡尔心形曲线的示例代码: ```python import math for t in range(0, 360, 1): t_rad = math.radians(t) # 将角度转换为弧度 x = 16 * (math.sin(t_rad))**3 y = 13 * math.cos(t_rad) - 5 * math.cos(2 * t_rad) - 2 * math.cos(3 * t_rad) - math.cos(4 * t_rad) print(f"({x:.2f}, {y:.2f})") ``` 上述代码中,我们使用了`math.sin()`和`math.cos()`函数来计算正弦和余弦值,`math.radians()`函数将角度转换为弧度。 循环从0到360度(或0到2π)遍历了所有角度值,计算了每一个点的坐标(x,y),并打印出来。 这样,通过两个for循环笛卡尔心形曲线的数学表达式,我们就实现笛卡尔心形曲线的生成。 ### 回答3: 要实现笛卡尔心形曲线,可以使用两个for循环来生成坐标点,然后将这些点连接在一起形成心形图案。 首先,我们需要定义一个适当的范围来生成x和y的值。假设x的范围是从-2到2,y的范围是从-3到3。这是一个经验性的范围选择,可以根据实际需要进行调整。 接下来,我们可以使用两个嵌套的for循环来遍历x和y的值。外层的循环控制x的变化,内层的循环控制y的变化。 在每次循环中,我们需要计算该点的距离心形中心的距离,并判断这个距离是否在心形的范围内。如果在范围内,就将这个点添加到心形图案中。 在每次迭代中,我们可以根据当前的x和y的值计算它们与心形中心之间的距离。可以使用勾股定理来计算距离,即sqrt(x^2 + y^2)。 然后,我们可以将这个距离与心形的形状进行比较,来判断该点是否在心形范围内。通常,心形的形状定义为1 - abs(sqrt(x^2 + y^2) - 1)。 如果计算出的距离在这个范围内,我们可以将这个点添加到心形图案中。可以使用符号*或其他字符来表示图案。 完成内外层的循环后,我们就可以得到一个用字符表示的心形图案。 总结起来,使用两个for循环可以遍历心形图案的所有可能的点,判断每个点是否在心形范围内,并将它们连接起来形成心形曲线。根据实际需求,可以调整范围和心形的形状来获得不同的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值