首页 > 其他分享 >【230905-5】用Canvas上勾画对数曲线:y=log10_x

【230905-5】用Canvas上勾画对数曲线:y=log10_x

时间:2023-09-05 10:32:51浏览次数:48  
标签:index Canvas 230905 text ctx arr log10

【图像】

【230905-5】用Canvas上勾画对数曲线:y=log10_x_对数函数 图像 y=log10_x

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>勾画log10_x</title>
     <style type="text/css">
     .centerlize{
        margin:0 auto;
        border:0px solid red;
        width:1200px;height:600px;
     }
     </style>
     </head>

     <body onl oad="draw();">
        <div class="centerlize">
            <canvas id="myCanvas" width="1200px" height="600px" style="border:1px dashed black;">
                您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.
            </canvas>
        </div>
     </body>
</html>
<script type="text/javascript">
<!--
// 画布宽度
const WIDTH=1200;

// 画布高度
const HEIGHT=600;

// 画布环境
var context=0;   

// 舞台对象
var stage;

// 总时间
var t=0;

// 核心勾画函数,由body_onload调用
function draw(){
    // 画图前初始化
    var canvas=document.getElementById('myCanvas');    
    canvas.width=WIDTH;
    canvas.height=HEIGHT; 
    context=canvas.getContext('2d');   
    
    // 进行屏幕坐标系到笛卡尔坐标系的变换
    // 处置完成前,原点在左上角,向右为X正向,向下为Y的正向
    // 处置完毕后,原点移动到画布中央,向右为X正向,向上为Y的正向
    context.translate(WIDTH/2,HEIGHT/2);
    context.rotate(getRad(180));
    context.scale(-1,1);

    // 之后再移动原点和改变横纵比例
    // 进行坐标原点的平移
    context.translate(-500,0);
    // 进行横纵方向的比例转换
    context.scale(1,1);

    // 初始化舞台
    stage=new Stage();

    // 开始动画
    animate();
};

//-------------------------------
// 画图
//-------------------------------
function animate(){    
    t+=0.01;// 时间每轮增加0.1

    stage.update(t);
    stage.paintBg(context);
    stage.paint(context);

    if(t<1000){        
        window.requestAnimationFrame(animate);
    }
}

//-------------------------------
// 舞台对象定义处
//-------------------------------
function Stage(){
    var obj=new Object;

    obj.prpty={"x":0,"y":0,"cds":[],"points":[]};

    // 随时间更新
    obj.update=function(t){
        obj.prpty.x+=0.1;// 横坐标递增
        obj.prpty.y=Math.LOG10E*Math.log(obj.prpty.x);// 纵坐标取10为底数,横坐标值的对数

        let x=obj.prpty.x;// 记录点轨迹横坐标
        let y=obj.prpty.y;// 记录点轨迹纵坐标
        console.log(x,y);

        // 坐标点存入数组
        let arr={"x":x,"y":y*20};
        this.prpty.cds.push(arr);
    };

    // 画背景
    obj.paintBg=function(ctx){
        // 清屏
        ctx.clearRect(-200,-200,2400,600);

        // 画X轴
        drawAxisX(ctx,-200,1050,50);

        // 画Y轴
        drawAxisY(ctx,-200,200,20);

        drawText(ctx,"绘制10为底数的对数图像 by:逆火",1000,220);
    };

    // 画前景
    obj.paint=function(ctx){  
        // 写当前点坐标
        drawText(ctx,"X:"+this.prpty.x.toFixed(3)+"  Y:"+this.prpty.y.toFixed(3),1000,200);
        paintCurve(ctx,"red",this.prpty.cds);
    };
    
    return obj;
}

// 连点成线画曲线
function paintCurve(ctx,color,cds){
    var SU=1;// 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);
    }         
    ctx.stroke();
    ctx.closePath();
}

// 画横轴
function drawAxisX(ctx,start,end,step){
    ctx.save();
    
    ctx.lineWidth=0.25;
    ctx.strokeStyle='navy';
    ctx.fillStyle='navy';

    // 画轴
    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+=step){
        ctx.beginPath();
        ctx.moveTo(x, 0);
        ctx.lineTo(x, y);
        
        ctx.stroke();
        ctx.closePath();

        drawText(ctx,x+"",x,y-20);
    }

    ctx.restore();
}

// 画纵轴
function drawAxisY(ctx,start,end,step){
    ctx.save();
    
    ctx.lineWidth=0.5;
    ctx.strokeStyle='navy';
    ctx.fillStyle='navy';

    // 画轴
    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+=step){
        ctx.beginPath();
        ctx.moveTo(x, y);
        ctx.lineTo(0, y);
        
        drawText(ctx,y/20+"",x-15,y);

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

//-------------------------------
// 角度得到弧度
//-------------------------------
function getRad(degree){
    return degree/180*Math.PI;
}

//-------------------------------
// 得到颜色
//-------------------------------
function getColor(index){
    var arr=["red","purple","blue","green","skyblue","yellow","#aa0000",
             "orange","maroon","navy",
             "lime","teal","fuchsia",
             "aqua","black"];

    if(index>arr.length){
        index=index % arr.length;
    }

    return arr[index];
}

//-------------------------------
// 在笛卡尔坐标系中绘制文字
//-------------------------------
function drawText(ctx,text,x,y){
    ctx.save();
    ctx.translate(x,y)
    ctx.rotate(getRad(180))
    ctx.scale(-1,1)

    ctx.textBaseline="bottom";
    ctx.textAlign="center";
    ctx.fillText(text,0,0);
    ctx.restore();
}
//-->
</script>

END

标签:index,Canvas,230905,text,ctx,arr,log10
From: https://blog.51cto.com/u_7726611/7368925

相关文章

  • 【230905-1】正弦定理之证明
    ......
  • #yyds干货盘点#用canvas实现一个简单的画板
    画板的功能修改画笔颜色;修改画笔粗细;橡皮擦;重置画板;撤销上一步;保存成图片;一步步实现<canvasid="myCanvas"width="400"height="400"></canvas>classBoard{constructor(id){this.canvas=document.getElementById(id);this.context=this.canva......
  • android短视频开发,js如何设置canvas绕图形中心旋转
    android短视频开发,js如何设置canvas绕图形中心旋转1.准备一个页面拟写一个页面,用于实验,代码如下 <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initcal-scale=1.0"/><title>......
  • canvas组件
    以下是使用Python的Tkinter库中的Canvas组件的一些常用方法的示例代码: ```pythonimporttkinterastk defcreate_canvas(root):  canvas=tk.Canvas(root)  returncanvas #在Canvas组件上绘制图形defdraw_shape(canvas,shape,**kwargs):  canva......
  • uniapp使用canvas电子签名
    <template><viewclass="draw-page"><viewclass="draw-content"><canvasstyle="width:100%;height:100%"ref="sign"canvas-id="sign"id=&qu......
  • 详情讲解canvas实现电子签名
    签名的实现功能我们要实现签名:1.我们首先要鼠标按下,移动,抬起。经过这三个步骤。我们可以实现一笔或者连笔。按下的时候我们需要移动画笔,可以使用moveTo来移动画笔。e.pageX,e.pageY来获取坐标位置移动的时候我们进行绘制ctx.lineTo(e.pageX,e.pageY)ctx.stroke()......
  • canvas实现签名
    在开源项目中发现canvas实现签名功能以此记录:http://www.youlai.tech/pages/52d5c3/HTML:<divclass="canvas-dom"><el-buttonplaintype="text"style="margin-left:20px;margin-top:20px;font-size:18px;"@click="back">返回<......
  • canvas实现图片加水印
    前言:有时候需要在一张图片上添加文字水印,形成新的图片,便于1vs多的分享。html中:<imgsrc=""alt=""id="newImg"/><canvasid="myCanvas"class="hidden"></canvas>js中:引入jquery.qrcode.min.js后functionImg(){//图片加......
  • 2023-08-21 canvas之fillText如何换行
    canvas的文本绘制:ctx.fillText('这是一段需要换行的内容啦啦啦啦啦啦啦啦',0,0);换行方式1:1、设置最大宽度:100(具体根据业务来定);ctx.fillText('这是一段需要换行的内容啦啦啦啦啦啦啦啦',0,0,100);2、判断要显示的文字内容是否超出100的长度,超出就截取一下,把超出的内容再......
  • Canvas绘制毛玻璃背景分享海报
    最近重新设计了分享海报,用毛玻璃作为背景,使整体更有质感,如果没有用到canvas,毛玻璃效果其实很好实现,给元素添加一个滤镜即可(比如:filter:blur(32px)),但是实践的过程中发现,canvas在IOS端一直没有效果,查了一个文档发现IOS端不支持filter。。。有点想骂人。。(PS:微信官方有关CanvasRende......