绘制二次三次曲线多次曲线

说明:大于一的幂级数与陡峭程度正相关,小于一的幂级数相当于曲线顺时针旋转90°,底数增减的量决定在横轴的平移。

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>绘制二次三次曲线多次曲线</title>
    </head>

     <body >
        <canvas id="myCanvus" width="1300px" height="640px" style="border:1px dashed black;">
            出现文字表示你的浏览器不支持HTML5
        </canvas>
     </body>
</html>
<script type="text/javascript">
<!--
    function draw(){
        var canvas=document.getElementById("myCanvus");
        var canvasWidth=1300;
        var canvasHeight=640;

        var context=canvas.getContext("2d");

        context.fillStyle = "white";
        context.fillRect(0, 0, canvasWidth, canvasHeight);

        context.strokeStyle = "black";
        context.fillStyle = "black";

        // 进行坐标变换:把原点放在左下角,东方为X轴正向,北方为Y轴正向
        var offsetY=320;// Y向偏移值,正值向上偏,用来画坐标轴
        var offsetX=650;// X向偏移值,正值向右偏,用来画坐标轴

        context.save();
        context.translate(0+offsetX,canvasHeight-offsetY);

        drawAxisXText(context);// 文字和线分开画比较好处理
        drawAxisYText(context);
        drawTitleText(context);

        context.rotate(getRad(180));
        context.scale(-1,1);        

        drawAxisX(context);
        drawAxisY(context);
        drawCurve(context);       

        context.restore();
    }

    function drawTitleText(ctx){
        ctx.lineWidth=0.5;
        ctx.strokeStyle=‘navy‘;
        ctx.fillStyle=‘navy‘;

        var x=350;
        var y=-250;

        // 写文字
        ctx.fillText("y=x^2 红色",x,y);
        ctx.fillText("y=(x-3)^3 绿色",x,y+20);
        ctx.fillText("y=(x-5)^4 黄色",x,y+40);
        ctx.fillText("y=(x-7)^5 青柠色",x,y+60);
        ctx.fillText("y=(x+3)^0.5 紫色",x,y+80);
        ctx.fillText("y=(x+5)^0.33 栗色",x,y+100);

        ctx.fillText("  绘制:逆火狂飙",x+170,y+30);
    }

    function drawCurve(ctx){
        var cds=[{}];
        var cds1=[{}];
        var cds2=[{}];
        var cds3=[{}];
        var cds4=[{}];
        var cds5=[{}];
        var cds6=[{}];

        var x,y,arr;
        for(x=-13;x<=13;x+=0.01){
            y=Math.pow(x,2);//
            arr={"x":x,"y":y};
            cds.push(arr);

            y=Math.pow(x-3,3);//
            arr={"x":x,"y":y};
            cds1.push(arr);

            y=Math.pow(x-5,4);//
            arr={"x":x,"y":y};
            cds2.push(arr);

            y=Math.pow(x-7,5);//
            arr={"x":x,"y":y};
            cds3.push(arr);

            y=Math.pow(x+3,1/2);//
            arr={"x":x,"y":y};
            cds4.push(arr);

            y=Math.pow(x+5,1/3);//
            arr={"x":x,"y":y};
            cds5.push(arr);
        }

        paintCurve(ctx,"red",cds);
        paintCurve(ctx,"green",cds1);
        paintCurve(ctx,"yellow",cds2);
        paintCurve(ctx,"lime",cds3);
        paintCurve(ctx,"purple",cds4);
        paintCurve(ctx,"maroon",cds5);
        //paintCurve(ctx,"maroon",cds6);*/

        /*var ymax=-1000,ymin=1000,xmax,xmin;
        for(var i=0; i<cds.length; i++){
            // 求y最大值
            if(cds[i].x<0 && cds[i].y>ymax){
                ymax=cds[i].y;
                xmax=cds[i].x;
            }

            // 求y最小值
            if(cds[i].x>=0 && cds[i].y<ymin){
                ymin=cds[i].y;
                xmin=cds[i].x;
            }
        } 

        console.log("ymin="+ymin+" xmin="+xmin+" ymax="+ymax+" ymin="+ymin+" xmax="+xmax);
        var SU=50;// Scale Unit
        // 极大值
        ctx.beginPath();
        ctx.moveTo(xmax*SU,ymax*5-5);
        ctx.lineTo(xmax*SU,ymax*5+5);

        ctx.save();
        ctx.scale(1,-1);
        ctx.fillText("ymax="+cutShort(ymax.toString(),8),xmax*SU,-ymax*5);
        ctx.restore();

        ctx.stroke();
        ctx.closePath();

        // 极小值
        ctx.beginPath();
        ctx.moveTo(xmin*SU,ymin*5-5);
        ctx.lineTo(xmin*SU,ymin*5+5);

        ctx.save();
        ctx.scale(1,-1);
        ctx.fillText("ymin="+ymin,xmin*SU,-ymin*5);
        ctx.restore();

        ctx.stroke();
        ctx.closePath();*/

    }

    function paintCurve(ctx,color,cds){
        var SU=50;// Scale Unit

        ctx.strokeStyle = color;
        ctx.beginPath();
        for(var i=0; i<cds.length; i++){
            ctx.lineTo(cds[i].x*SU,cds[i].y*SU);// 注意y轴比例
        }
        ctx.stroke();
        ctx.closePath();
    }

    function drawAxisX(ctx){
        ctx.save();

        ctx.lineWidth=0.5;
        ctx.strokeStyle=‘navy‘;
        ctx.fillStyle=‘navy‘;

        var start=-650;
        var end=650;

        // 画轴
        ctx.beginPath();
        ctx.moveTo(start, 0);
        ctx.lineTo(end, 0);
        ctx.stroke();
        ctx.closePath();

        // 画箭头
        ctx.beginPath();
        ctx.moveTo(end-Math.cos(getRad(15))*10, Math.sin(getRad(15))*10);
        ctx.lineTo(end, 0);
        ctx.lineTo(end-Math.cos(getRad(15))*10, -Math.sin(getRad(15))*10);
        ctx.stroke();
        ctx.closePath();

        // 画刻度
        var x,y;
        y=5;
        for(x=start;x<end;x+=50){
            ctx.beginPath();
            ctx.moveTo(x, 0);
            ctx.lineTo(x, y);

            ctx.stroke();
            ctx.closePath();
        }

        ctx.restore();
    }

    function drawAxisXText(ctx){
        ctx.lineWidth=0.5;
        ctx.strokeStyle=‘navy‘;
        ctx.fillStyle=‘navy‘;

        var start=-650;
        var end=650;

        // 写文字
        var x,y=5;
        for(x=start;x<end;x+=50){
            ctx.fillText(x/50,x,y+10);
        }
    }

    function drawAxisY(ctx){
        ctx.save();

        ctx.lineWidth=0.5;
        ctx.strokeStyle=‘navy‘;
        ctx.fillStyle=‘navy‘;

        var start=-300;
        var end=300;

        // 画轴
        ctx.beginPath();
        ctx.moveTo(0, start);
        ctx.lineTo(0, end);
        ctx.stroke();
        ctx.closePath();

        // 画箭头
        ctx.beginPath();
        ctx.moveTo(Math.sin(getRad(15))*10, end-Math.cos(getRad(15))*10);
        ctx.lineTo(0, end);
        ctx.lineTo(-Math.sin(getRad(15))*10, end-Math.cos(getRad(15))*10);
        ctx.stroke();
        ctx.closePath();

        // 画刻度
        var x,y;
        x=5;
        for(y=start;y<end;y+=50){// 注意y轴比例
            ctx.beginPath();
            ctx.moveTo(x, y);
            ctx.lineTo(0, y);

            ctx.stroke();
            ctx.closePath();
        }
    }

    function drawAxisYText(ctx){
        ctx.lineWidth=0.5;
        ctx.strokeStyle=‘navy‘;
        ctx.fillStyle=‘navy‘;

        var start=-250;
        var end=350;

        // 写文字
        var x=-19,y=5;
        for(y=start;y<end;y+=50){

            if(y!=0){
                ctx.fillText(-y/50,x,y);// 注意y轴比例
            }
        }
    }

    function getRad(degree){
        return degree/180*Math.PI;
    }

    function cutShort(str,length){
        if(str.length>length){
            str=str.substr(0,length)+"...";
        }

        return str;
    }
//-->
</script>

原文地址:https://www.cnblogs.com/xiandedanteng/p/8157169.html

时间: 2024-10-16 00:33:10

绘制二次三次曲线多次曲线的相关文章

canvas绘制二次贝塞尔曲线----演示二次贝塞尔四个参数的作用

canvas中绘制二次贝塞尔曲线的方法为ctx.quadraticCurveTo(x1,y1,x2,y2); 四个参数分别为两个控制点的坐标.开始点即当前canvas中目前的点,如果想从指定的点开始,需要使用ctx.moveTo(x,y)方法 演示效果如下图 上代码: html <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title

用Matplotlib绘制二维图像

唠叨几句: 近期在做数据分析,需要对数据做可视化处理,也就是画图,一般是用Matlib来做,但Matlib安装文件太大,不太想直接用它,据说其代码运行效率也很低,在网上看到可以先用Java做数据处理,然后调用Matlib来画图,另外,还可以使用Matplotlib,它是用Python写的类似Matlib的库,能实现Matlib的功能,而且画图的质量很高,可用于做论文发表.找了一天的资料,终于出图了. Matplotlib需要配合numpy,scipy才能使用,具体安装步骤稍后补充. 正文: 用M

OpenGL绘制简单的参数曲线——三阶Bezier曲线(二)

今天我们来介绍三次Bezier曲线,这曲线网上资料非常多,我这里只是简单介绍下原理. 在二维空间中(三维也类似),给定n+1个点P0.P1.... .Pn.参数t的n次的Bezier曲线是: 图1 我们根据上面式子可以推出一阶.二阶.三阶贝塞尔曲线,下面是一阶贝塞尔曲线: 图2 下面是二阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,每一个Q0Q1都是曲线的切向量: 图3 下面是三阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,P2P3线段取Q2,再从Q0Q1取R

canvas 绘制二次贝塞尔曲线

代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>canvas</title> <script> function init() { var canvas=document.getElementById('canvas'); var ctx=canvas.getContext('2d')

计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法

OpenGL曲线函数 生成圆和椭圆等基本曲线的函数并未作为图元功能包含在OpenGL核心库中.但该库包含了显示Bezier样条的功能,该曲线是由一组离散点定义的多项式.OpenGL实用库(GLU)中包含有球面和柱面等三维曲面函数以及生成B样条的函数,它是包含简化Bezier曲线的样条曲线的总集.我们可以使用有理B样条显示圆.椭圆和其他二维曲线.此外,OpenGL实用工具包(GLUT)中还有可以用来显示某些三维曲面(如球面.锥面和其他形体)的函数.然而,所有这些函数比本章中介绍的基本图元应用得更多

Matlab——图形绘制——二维平面图形

二维平面图形 hold on ————在已画好的图形上添加新的图形 plot 是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的x 及y 座标.下例可画出一条正弦曲线: >> x=0:0.001:10; % 0 到10 的1000 个点的x 座标 y=sin(x); % 对应的y 座标 plot(x,y); % 绘图 改变颜色 >> plot(x,y,'k') 改变颜色的同时改变图线形态 >> plot(x,y,'k*')  同时画两个函数[淡粉色

绘制二维图形的其它方案

1 其他形式的线性直角坐标图 在线性直角坐标系中,其他形式的图形有条形图.阶梯图.杆图和填充图等,所采用的函数分别是:bar(x,y,选项)%条形图 stairs(x,y,选项)%阶梯图 stem(x,y,选项)%杆图 fill(x1,y1,选项1,x2,y2,选项2...)%填充图前3个函数的用法与plot函数相似,但没有多输入变量形式.fill函数按向量元素下标渐增次序用直线段连接x,y对应元素定义的数据点.假如这样连接所得拆线不封闭,那么MATLAB将自动 把该 拆线的首尾连接起来,构成封

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可

amazeui+canvas绘制二维码

<link rel="stylesheet" type="text/css" href="css/amazeui.min.css"/> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="j