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

简介:

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

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

     <body onload="draw()">
        <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>
复制代码

 













本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/xiandedanteng/p/8157169.html,如需转载请自行联系原作者


相关文章
|
并行计算 PyTorch 测试技术
MMDetection系列 | 1. MMDetection安装流程与测试
MMDetection系列 | 1. MMDetection安装流程与测试
1234 0
|
8月前
|
人工智能 数据挖掘 大数据
人工智能模型决策过程:机器与人类协作成效
决策智能(DI)融合AI与人类判断,提升商业决策质量。通过数据驱动的预测与建议,结合人机协作,实现更高效、精准的业务成果,推动企业迈向数据文化新阶段。(238字)
|
11月前
|
数据采集 人工智能 运维
甭再盯死日志了,AI已经悄悄替你盯着网络流量了
甭再盯死日志了,AI已经悄悄替你盯着网络流量了
525 0
|
人工智能 安全 搜索推荐
SecMulti-RAG:兼顾数据安全与智能检索的多源RAG框架,为企业构建不泄密的智能搜索引擎
本文深入解析SecMulti-RAG框架,该框架通过整合企业内部知识库、预构建专家知识及受控外部大语言模型,结合保密性过滤机制,解决企业在部署AI助手时面临的信息准确性、数据安全性和成本控制问题。它采用多层策略,利用三种知识来源(动态更新的企业知识、专家预写知识和按需外部知识),并通过微调的开源LLM生成最终响应,确保安全性与性能。实验表明,SecMulti-RAG在汽车行业技术报告生成任务中显著优于传统RAG系统,展现了其在企业环境中的实用性和优势。
596 5
SecMulti-RAG:兼顾数据安全与智能检索的多源RAG框架,为企业构建不泄密的智能搜索引擎
|
人工智能 Rust 自然语言处理
37.1K star!AI模型全能工具箱,这个开源项目让智能体开发更简单!
"Awesome MCP Servers 是当前最全面的模型上下文协议服务器集合,为AI开发者提供开箱即用的工具链支持。通过标准化协议实现AI模型与各类资源的无缝对接,堪称智能体开发的瑞士军刀!"
644 7
|
12月前
|
人工智能 容器
打卡习惯,记录坚持:我用 CodeBuddy 做了个毛玻璃风格的习惯打卡小应用
打卡习惯,记录坚持:我用 CodeBuddy 做了个毛玻璃风格的习惯打卡小应用
232 9
|
10月前
|
安全 数据安全/隐私保护
小红书批量发布工具,协议脚本软件小红书上传,发布笔记视频作品软件
这个代码框架包含了小红书批量发布工具的主要功能模块。实际使用时需要注意:1.需要处理验证码等反爬机制
|
存储 JavaScript 安全
HarmonyOSNext 端云一体化(6)
本文深入讲解了 HarmonyOSNext 的端云一体化开发中的云函数部分,重点介绍云对象的创建、调试、部署及调用方法。云函数采用 serverless 技术,使用 TypeScript 语法,简化后端开发流程。文章详细说明了云对象的创建步骤、配置文件解析(如 `function-config.json` 和 `package.json`),以及如何通过 DevEco Studio 调试和部署云对象。此外,还探讨了云对象调用云数据库、云存储、第三方 API 及其他云对象的具体实现方式,并提供了客户端调用云对象的示例代码。
393 8
 HarmonyOSNext 端云一体化(6)
|
12月前
|
缓存 前端开发 API
HarmonyOS实战:一招解决等待多个并发结果
本文分享了在开发鸿蒙NEXT版本软件时遇到的并发问题及解决方案。公司为赶在鸿蒙纯血系统上市前发布相关软件,将开发重点放在清除缓存功能上。针对需同时清除四个缓存文件夹的需求,文章分析了官方API 11文档中提供的异步处理方法(如Promise和async/await)的不足,并提出使用Promise.all实现优雅解决方案,避免多层嵌套与代码混乱。通过封装异步任务、构建任务数组及统一处理结果,最终实现高效清除缓存并统计大小的功能。文末呼吁开发者共同参与优化鸿蒙生态。
260 0

热门文章

最新文章