zoukankan      html  css  js  c++  java
  • 毕业设计总结(1)-canvas画图

      去年6月底完成的毕业设计,到现在也才开始给它做个总结,里面有很多可以学习和借鉴的东西。

      我的毕业设计的题目是“一种路径规划算法的改进与设计”,具体的要求可参见下面的表格:

    题目

    一种路径规划算法的改进与设计

    类型

    毕业设计

    性质

    工程设计

    来源

    结合科研

    限选人数

    1

    已选人数

    1

    毕业设计的任务和要求

    在一个布满障碍物的地图上,过凸极值点划分区域;在相应的区域中抽象出一个点来对应各区域,画出连通无向图;根据对应的权值找出最优路径;写出相应的算法。

    毕业设计的具体工作内容

    1.学习课题相关理论知识,进行必要的调研和查阅相关的资料,撰写毕业设计开题报告;
    2.对课题进行需求分析,撰写需求分析说明书;然后进行系统设计,书写系统设计说明书,完成所规定的内容:
          1)拟合曲线模拟障碍物;
          2)过凸极值点做水平切线划分区域;
          3)区域存储;
          4)构造无向图;  
       (5)设定权值,确定最优路径;
          6)证明此算法的有效性。
    3.完成系统的设计;
    4.完成系统测试工作;
    5.翻译计算机相关外文文献;
    6.撰写毕业设计说明书。

    对毕业设计成果的要求

    开题报告一份,任务书一份,毕业设计说明书一份,软件一套,3000字外文翻译一份。

    备注

     

    已选学生

     

       我总结的内容差不多也是按照按照需求里的步骤进行的,首先进行的是canvas画图

      canvas是在html5里添加的新元素,利用该元素能够在网页上进行画图。当然,canvas元素本身没有画图能力,所有的绘制工作必须在 JavaScript 内部完成,画布是一个矩形区域,您可以控制其每一像素。

      <canvas> 标记和 SVG 以及 VML 之间的差异

      <canvas> 标记和 SVG 以及 VML 之间的一个重要的不同是,<canvas> 有一个基于 JavaScript 的绘图 API,而 SVG 和 VML 使用一个 XML 文档来描述绘图。

    这两种方式在功能上是等同的,任何一种都可以用另一种来模拟。从表面上看,它们很不相同,可是,每一种都有强项和弱点。例如,SVG 绘图很容易编辑,只要从其描述中移除元素就行。

      要从同一图形的一个 <canvas> 标记中移除元素,往往需要擦掉绘图重新绘制它。

      

      如何使用 <canvas> 标记绘图

    大多数 Canvas 绘图 API 都没有定义在 <canvas> 元素本身上,而是定义在通过画布的 getContext() 方法获得的一个“绘图环境”对象上。

    Canvas API 也使用了路径的表示法。但是,路径由一系列的方法调用来定义,而不是描述为字母和数字的字符串,比如调用 beginPath() 和 arc() 方法。

    一旦定义了路径,其他的方法,如 fill(),都是对此路径操作。绘图环境的各种属性,比如 fillStyle,说明了这些操作如何使用。

      1. 创建

      使用前,我们首先要新建一个canvas的元素

    <canvas id="screen" width="800" height="600">骚瑞,您的浏览器不支持canvas</canvas>

      如果您的浏览器不支持html5的canvas,那么浏览器上就会出现“骚瑞,您的浏览器不支持canvas”的字样,您就需要升级或更换浏览器了。

      画布创建好以后,我们还需要一支笔:

    var screen  = document.getElementById("screen");
    var context = screen.getContext("2d");

      getContext方法指定参数2d,表示该canvas对象用于生成2D图案(即平面图案)。如果参数是3d,就表示用于生成3D图像(即立体图案),这部分实际上单独叫做WebGL API。

      2. 绘制图形

      canvas的画布原点是在左上角,原点向右是x轴,原点向下是y轴。最小的单位就是一个像素点了,(0, 0)

      (1) 绘制线段

      beginPath()表示开始路径绘制。

    context.beginPath();            // 开始路径绘制
    context.moveTo(20, 20);         // 设置路径起点,坐标为(20,20)
    context.lineTo(200, 20);        // 设置终点
    context.lineWidth = 0.1;        // 设置线宽
    context.strokeStyle = "black";  // 设置线的颜色
    context.stroke();               // 进行线的着色,这时整条线才变得可见

      (2)绘制矩形

      fillRect(x, y, width, height)方法用来绘制矩形,它的四个参数分别为矩形左上角顶点的x坐标、y坐标,以及矩形的宽和高。fillStyle属性用来设置矩形的填充色。

      strokeRect方法与fillRect类似,用来绘制空心矩形。

      clearRect方法用来清除某个矩形区域的内容。

    context.fillStyle = 'yellow';
    context.fillRect(50, 50, 200, 100);
    context.strokeRect(10,10,200,100);
    context.clearRect(100,50,50,50);

      上面的这些都是canvas API里原生的方法,原生的方法其实已经能够满足我当时的需求了,只是觉得画出的线和点有点丑;也就使用到了canvas的一个js库:【jcscript】,这是外国的一个网站,打开时可能有点慢。库里提供不少的画图方法和动画效果。

        

      这个框架里没有三次贝塞尔曲线的画法,只能自己在库里添加了一个方法,取名叫b3Curve()。关于三次贝塞尔曲线将在下一次的文章进行讲解。

      第1906行的前后,与bCurve()的代码风格一样

      

    proto.b3Curve=function(){
        this.draw=function(ctx)
        {
            if(this._x0===undefined)return;
            ctx.moveTo(this._x0,this._y0);
            for(var j=0;j<this.shapesCount;j++)
            {
                ctx.bezierCurveTo(this['_cp1x'+j],this['_cp1y'+j],this['_cp2x'+j],this['_cp2y'+j],this['_cp3x'+j],this['_cp3y'+j]);
            }
        }
        this.base=function(points,color,fill)
        {
            proto.b3Curve.prototype.base.call(this,points,color,fill);
            return this;
        }
        this._proto='b3Curve';
        this.pointNames=['_x','_y','_cp1x','_cp1y','_cp2x','_cp2y', '_cp3x', '_cp3y'];
    }
    proto.b3Curve.prototype=new proto.lines;

      第3025行的前后:

    jCanvaScript.b3Curve=function(points,color,fill)
    {
        var b3Curve = new proto.b3Curve;
        return b3Curve.base(points,color,fill);
    }

      这样就可以使用b3Curve()方法画三次贝塞尔曲线了,调用的方式与调用bCurve()的方式相同,

    jc.start('screen');
    jc('#srceen').lineStyle(lineWidth);
    jc.b3Curve(arr,color, fill);
    //jc.b3Curve([[points[i].x, points[i].y, extrapoints[i*2+1].x, extrapoints[i*2+1].y, extrapoints[nexti*2].x, extrapoints[nexti*2].y, points[nexti].x, points[nexti].y]], '#00ffbb');
    jc.start('screen');

      arr是一个数组,每个值都是三次贝赛尔曲线的四个节点,若数组中有多个值的话,b3Curve()会依次把所有的贝赛尔曲线都画出来。

      毕设里用到的每个知识点,都是一个巨大的分支里的小点,不可能对所有的东西都熟悉,但我们一直在努力。

      参考:

      http://javascript.ruanyifeng.com/htmlapi/canvas.html

      

  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/xumengxuan/p/3988585.html
Copyright © 2011-2022 走看看