Canvas是html5中的画布标签,利用canvas画布,开发者可以进行图形的展示。本人在实践过程中,利用了canvas进行了图形的动态绘制,在绘制测量角(折线过程中,走了弯路),现作以下记录。

1. 绘制动态直线

javascript 画图 点 js 绘图_鼠标移动

javascript 画图 点 js 绘图_鼠标移动_02

1 1 <!--移动直线-->
 2  2 <!DOCTYPE html>
 3  3 <html>
 4  4 <head>
 5  5     <meta charset="utf-8" />
 6  6     <meta name="viewport" content="width=device-width,initial-scale=1,minimum-
 7  7 
 8  8 scale=1,maximum-scale=1,user-scalable=no" />
 9  9     <link rel="shortcut icon" href="../img/LGlogo.png">
10 10     <script src="../js/jquery-2.1.0.js"></script>
11 11     <script src="../js/mobile.js"></script>
12 12 <title>首页 | 测试</title>
13 13 <script>
14 14 function myfun(){
15 15     var canvas = document.getElementById("myCanvas");
16 16     var ctx = canvas.getContext("2d");    
17 17     ctx.strokeStyle = "#458B00";
18 18     ctx.lineWidth = 1;
19 19     var oX,oY;
20 20     //var vX,vY;
21 21     var flag = false;
22 22     var count=0;
23 23     function draw(sx,sy,ex,ey){    
24 24     //ctx.clearRect(0,0,1000,1000);
25 25     ctx.beginPath();
26 26     ctx.moveTo(sx,sy);
27 27     ctx.lineTo(ex,ey);
28 28     ctx.closePath();
29 29     ctx.stroke();
30 30     }
31 31     function comLength(x1,y1,x2,y2)
32 32     {
33 33         var dis=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
34 34         return (dis.toFixed(2));
35 35     }
36 36     function creadiv(x1,y1,x2,y2)
37 37     {        
38 38         var div=document.createElement("div");
39 39         var left=(x1+x2)/2;
40 40         var top=(y1+y2)/2;
41 41         div.style.position="absolute";
42 42         div.style.left=(left)+"px";
43 43         div.style.top=top+"px";        
44 44         div.innerText=comLength(x1,x2,y1,y2)+"mm";
45 45         document.body.appendChild(div);
46 46     }
47 47     canvas.onmousemove = function(e){
48 48     
49 49     if(flag)
50 50     {
51 51         ctx.clearRect(0,0,1000,1000);
52 52         draw(oX,oY,e.pageX,e.pageY);      
53 53     }
54 54 }
55 55     canvas.onclick = function(e){    
56 56     if(!flag){
57 57         oX = e.pageX;
58 58         oY = e.pageY; 
59 59     }
60 60     flag=!flag;
61 61     count++;
62 62     if(count==2)
63 63     {
64 64         creadiv(oX,oY,e.pageX,e.pageY);
65 65         count=0;
66 66     }
67 67     }
68 68 }
69 69 </script>
70 70 <style>
71 71     div{
72 72         font-size: 16pt;
73 73         color:red;
74 74     }
75 75 </style>
76 76 </head>
77 77 <body onload="myfun();">
78 78     <canvas id="myCanvas" width="800" height="600" style="border:solid 1px #CCC;">
79 79 您的浏览器不支持canvas,建议使用最新版的Chrome
80 80 </canvas>
81 81 </body>
82 82 </html>

View Code

canvas教程中对于直线的绘制其实很简单,就是两个步骤,第一步给出起始点,通过moveto()方法来绘制起点;第二步通过lineto()方法连接终点。仅需要两步,一个简单的直线就绘制好了。

此处,我们需要动态的绘制直线,即我们的直线起点和终点均不可知,于是我们在js中加入鼠标点击和移动事件来判断起点和终点位置,再通过方法进行绘制。代码中我们还简单对直线的长度进行了测量和显示(这里没有根据实际情况进行实际长度的计算)。

javascript 画图 点 js 绘图_Math_03

2. 绘制动态测量角

javascript 画图 点 js 绘图_鼠标移动

javascript 画图 点 js 绘图_鼠标移动_02

1 <!--画测量角-->
  2 <!DOCTYPE html>
  3 <html>
  4 <head>
  5     <meta charset="utf-8" />
  6     <meta name="viewport" content="width=device-width,initial-scale=1,minimum-
  7 
  8 scale=1,maximum-scale=1,user-scalable=no" />
  9     <link rel="shortcut icon" href="../img/LGlogo.png">
 10     <script src="../js/jquery-2.1.0.js"></script>
 11     <script src="../js/mobile.js"></script>
 12 <title>首页 | 测试</title>
 13 <script>
 14 function myfun(){
 15     var sx,sy;
 16     var ox,oy;
 17     var ex,ey;
 18     var count=0;
 19     var flag=false;
 20     var canvas=document.getElementById("myCanvas");    
 21     var ctx=canvas.getContext("2d");
 22     ctx.strokeStyle = "#458B00";
 23     ctx.lineWidth = 1;
 24     function draw(x1,y1,x2,y2)
 25     {
 26         ctx.beginPath();
 27         ctx.moveTo(x1,y1);
 28         ctx.lineTo(x2,y2);
 29         ctx.closePath();
 30         ctx.stroke();
 31     }
 32     function creadiv(left,top,t)
 33     {
 34         var div=document.createElement("div");
 35         div.style.position="absolute";
 36         div.style.left=(left-30)+"px";
 37         div.style.top=top+"px";
 38         div.innerText=t;
 39         document.body.appendChild(div);
 40     }
 41     function getAngle(x1,y1,x2,y2,x3,y3)
 42     {
 43         var cosfi=0,fi=0,norm=0;
 44         var x0=x2-x1;
 45         var y0=y2-y1;
 46         var x00=x3-x1;
 47         var y00=y3-y1;
 48         cosfi=x0*x00+y0*y00;
 49         norm=(x0*x0+y0*y0)*(x00*x00+y00*y00);
 50         cosfi/=Math.sqrt(norm);
 51         if(cosfi>=1.0)
 52         {
 53             return("0");
 54         }
 55         else if(cosfi<=-1.0)
 56         {
 57             return((Math.PI).toFixed(2));
 58         }
 59         fi=Math.acos(cosfi);
 60         if(180*fi/Math.PI<180)
 61         {
 62             return((180*fi/Math.PI).toFixed(2));
 63         }
 64         else
 65         {
 66             return((360-180*fi/Math.PI).toFixed(2));
 67         }
 68     }
 69     canvas.onclick=function(e)
 70     {        
 71 //        if(count==3)
 72 //        {
 73 //            ctx.clearRect(0,0,1000,1000);
 74 //        }
 75         if(!flag)
 76         {
 77             if(count==0)
 78             {
 79                 sx=e.pageX;
 80                 sy=e.pageY;
 81                 count++;
 82                 flag=!flag;
 83             }
 84             else if(count==1)
 85             {                
 86                 flag=!flag;
 87                 count++;
 88                 var text=getAngle(ox,oy,sx,sy,ex,ey)+"°";
 89                 creadiv(ox,oy,text);
 90             }
 91             
 92         }
 93         else
 94         {
 95             flag=!flag;
 96         }
 97     }    
 98     canvas.onmousemove=function(e){
 99         if(flag)
100         {
101             if(count==1)
102             {
103                 ctx.clearRect(0,0,1000,1000);
104                 draw(sx,sy,e.pageX,e.pageY);
105                 ox=e.pageX;
106                 oy=e.pageY;
107             }            
108         }
109         else if(count<2)
110         {
111             ctx.clearRect(0,0,1000,1000);
112             draw(sx,sy,ox,oy);
113             draw(ox,oy,e.pageX,e.pageY);
114             
115             ex=e.pageX;
116             ey=e.pageY;
117         }
118     }
119 }    
120 </script>
121 <style>
122     div{
123         color:red;
124         font-size:18pt;
125     }
126 </style>
127 </head>
128 <body onload="myfun();">
129     <canvas id="myCanvas" width="800" height="600" style="border:solid 1px 
130 
131 #CCC;">
132 您的浏览器不支持canvas,建议使用最新版的Chrome
133 </canvas>
134 </body>
135 </html>

View Code

绘制动态测量角对于绘制动态直线来说,多了一个端点,整个测量角有三个端点,即起点,中点和终点。整个测量角的绘制分为两个阶段,一是从起点到中点的绘制,在鼠标移动过程中,需要记录鼠标经过的位置,在鼠标未单击之前,所有鼠标经过的点需要通过clearRect()方法进行清除,保留最后鼠标点击时的那个点(这里通过flag值的判断)。当鼠标在中点处单击时,需要做两件事(1,单击时会进行清屏处理,此时根据之前记录的鼠标移动点,重新绘制一条同样的起点到中点的线段;2,记录鼠标移动的位置并实时清屏)。完成上述两件事后,再次单击鼠标,由于此时flag值为false;鼠标移动事件不再执行,由中点到终点的线段再次确定,至此,起点-中点-终点的测量角就绘制完成。同样此处进行了测量角的测量,可实时记录测量角的大小。

javascript 画图 点 js 绘图_鼠标移动_06