Canvas版实现画图、虚线、辅助线、线条颜色、线条宽度_第1页
Canvas版实现画图、虚线、辅助线、线条颜色、线条宽度_第2页
Canvas版实现画图、虚线、辅助线、线条颜色、线条宽度_第3页
Canvas版实现画图、虚线、辅助线、线条颜色、线条宽度_第4页
Canvas版实现画图、虚线、辅助线、线条颜色、线条宽度_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Canvas实现画图、虚线、辅助线、线条颜色、线条宽度,整合加强版使用Canvas实现画图程序。本次更新主要实现了一下功能:虚线实线的选择、辅助线、线条颜色选择、线条宽度选择进一步整理了下代码,发现了不少很有用的写法,具体看下面。效果截图:源代码:HTML代码html view plaincopy1. <!docutype html>  2. <!-date 2014-12-28->  3. <html>  4.     <

2、head>  5.         <meta http-equiv="content-type" content="text/html; charset=utf-8" />  6.         <style type="text/css"> &

3、#160;7.             canvas  8.                 background-color: rgb(247, 247, 247);  9.       

4、          margin-top: 10px;  10.               11.         </style>  12.     </head>

5、;  13.     <body>  14.         <div class="controls">  15.             线条类型<select id="lineTypeSelectBox"

6、>  16.             <option value="solid">实线</option>  17.             <option value="dashed">虚线</option>

7、;  18.             </select>  19.             线条颜色<select id="strokeColorSelectBox">  20.      

8、60;              <option value="black">black</option>  21.                     <option

9、0;value="red">red</option>  22.                     <option value="blue">blue</option>  23.        

10、     </select>  24.             线条宽度<select id="lineWidthSelectBox">  25.                

11、0;    <option value="1">1</option>  26.                     <option value="2">2</option>  27.   

12、                  <option value="4">4</option>  28.             </select>     

13、0;        29.             网格线<input  id="gridCheckBox" type="checkbox" checked="checked" >  30.      

14、60;      坐标轴<input  id="axesCheckBox" type="checkbox" checked="checked" >  31.             辅助线<input  id="guideWiresCheck

15、Box" type="checkbox" checked="checked" >  32.             <input type="button" value="清除画布" id="eraseAllButton">  33.  &#

16、160;      </div>  34.         <!-canvas默认大小300*150->  35.         <canvas id="canvas" width="800" height="500"

17、>  36.         </canvas>  37.     </body>  38.         <!-导入绘制坐标、网格的js文件->  39.         <script&

18、#160;type = "text/javascript" src ="mikuCanvasAxes.js"></script>  40.         <!-导入绘制虚线的js文件->  41.         <script type = &quo

19、t;text/javascript" src ="mikuCanvasLine.js"></script>  42.         <!-导入主要绘图js文件->  43.         <!-  44.        

20、     全局变量定义  45.             函数:窗口坐标转换为Canvas坐标、保存还原当前绘图表面数据、橡皮筋法相关函数、绘制辅助线相关函数、初始化函数  46.             事件处理:鼠标down,move,up事件、按钮点击事件、单选框

21、变化事件  47.         ->  48.         <script type = "text/javascript" src ="mikuCanvasPaintAppMain.js"></script>  49. </html>&#

22、160; 绘制坐标轴与网格html view plaincopy1. <!docutype html>  2. <!-date 2014-12-28->  3. <html>  4.     <head>  5.         <meta http-equiv="content-ty

23、pe" content="text/html; charset=utf-8" />  6.         <style type="text/css">  7.             canvas  8.   

24、;                9.               10.         </style>  11.      

25、0;  <script type = "text/javascript" src ="mikuCanvasAxes.js"></script>  12.     </head>  13.     <body>  14.        

26、; <div class="controls">  15.             网格线<input  id="gridCheckBox" type="checkbox" checked="checked" >  16.    

27、60;        坐标轴<input  id="axesCheckBox" type="checkbox" checked="checked" >  17.             <input type="button&quo

28、t; value="清除画布" id="eraseAllButton">  18.         </div>  19.         <!-canvas默认大小300*150->  20.         

29、;<canvas id="canvas" width="800" height="500">  21.         </canvas>  22.     </body>  23.     <script type="text

30、/javascript">  24.         /Vars-  25.         var canvas =document.getElementById("canvas"),  26.           

31、60; context =canvas.getContext("2d"),  27.             /正在绘制的绘图表面变量  28.             drawingSurfaceImageData,  29.   

32、60;         /鼠标按下相关对象  30.             mousedown = ,  31.             /橡皮筋矩形对象  32.   

33、;          rubberbandRect = ,  33.             /拖动标识变量  34.             dragging = false;&

34、#160; 35.         /控制对象  36.         var eraseAllButton = document.getElementById("eraseAllButton"),  37.           

35、0; axesCheckBox = document.getElementById("axesCheckBox"),  38.             /检测axesCheckBox是否被选中  39.             haveAxes = 

36、axesCheckBox.checked;  40.         var gridCheckBox = document.getElementById("gridCheckBox");  41.         var haveGrid = gridCheckBox.checked;  42.

37、        /Functions-  43.         /将窗口坐标转换为Canvas坐标  44.         /传入参数:窗口坐标(x,y)  45.         function win

38、dowToCanvas(x,y)  46.             /获取canvas元素的边距对象  47.             var bbox = canvas.getBoundingClientRect();  48.    &

39、#160;        /返回一个坐标对象  49.             /类似json的一种写法  50.             return   51.    

40、0;                x : x - bbox.left*(canvas.width/bbox.width),  52.                     y&

41、#160;: y - bbox.top*(canvas.height/bbox.height)  53.                   54.           55.        

42、0;/保存当前绘图表面数据  56.         function saveDrawingSurface()  57.           /从上下文中获取绘图表面数据  58.           drawingSurfaceImageData

43、 = context.getImageData(0,0,canvas.width,canvas.height);  59.           60.         /还原当前绘图表面  61.         function restoreDrawingSurfa

44、ce()  62.           /将绘图表面数据还原给上下文  63.           context.putImageData(drawingSurfaceImageData,0,0);  64.           65.

45、        /橡皮筋相关函数  66.           67.         /更新橡皮筋矩形+对角线  68.         /传入参数:坐标对象loc  69.   

46、;      function updateRubberband(loc)  70.             updateRubberbandRectangle(loc);  71.             drawRubberbandShape(l

47、oc);  72.           73.         /更新橡皮筋矩形  74.         /传入参数:坐标对象loc  75.         function updat

48、eRubberbandRectangle(loc)  76.             /获得矩形的宽  77.             rubberbandRect.width = Math.abs(loc.x - mousedown.x);  78. 

49、60;           /获得矩形的高  79.             rubberbandRect.height = Math.abs(loc.y - mousedown.y);  80.        

50、0;    /获得矩形顶点的位置(left,top)  81.             /如果鼠标按下的点(起点)在当前点的的左侧  82.             /这里画一下图就懂了  83.      &

51、#160;      if(loc.x > mousedown.x)  84.                 rubberbandRect.left = mousedown.x;  85.         

52、60;   else  86.                 rubberbandRect.left = loc.x;  87.               88.    

53、60;        if(loc.y > mousedown.y)  89.                 rubberbandRect.top = mousedown.y;  90.        

54、     else  91.                 rubberbandRect.top = loc.y;  92.               93.   &

55、#160;       94.         /绘制橡皮筋矩形的对角线  95.         /传入参数:坐标对象loc  96.         function drawRubberbandShape(loc) 

56、0;97.             /alert("draw");  98.             context.beginPath();  99.             c

57、ontext.moveTo(mousedown.x,mousedown.y);  100.             context.lineTo(loc.x,loc.y);  101.             context.stroke();  102.    

58、60;      103.         /事件处理-  104.         canvas.onmousedown = function(e)  105.            var loc

59、 =windowToCanvas(e.clientX,e.clientY);  106.            e.preventDefault();  107.            saveDrawingSurface();  108.      

60、0;     mousedown.x = loc.x;  109.            mousedown.y = loc.y;  110.            dragging = true;  111.

61、           112.           113.         canvas.onmousemove = function(e)  114.           &#

62、160; var loc;  115.             if(dragging)  116.                 e.preventDefault();  117.     

63、60;           loc = windowToCanvas(e.clientX,e.clientY);  118.                 restoreDrawingSurface();  119.     &

64、#160;           updateRubberband(loc);  120.               121.           122.       

65、  canvas.onmouseup = function(e)  123.             loc = windowToCanvas(e.clientX,e.clientY);  124.             restoreDrawingSurf

66、ace();  125.             updateRubberband(loc);  126.             dragging = false;  127.         &#

67、160; 128.         eraseAllButton.onclick = function(e)  129.             context.clearRect(0,0,canvas.width,canvas.height);  130.       

68、;      initialization();  131.             saveDrawingSurface();  132.           133.         axesCh

69、eckBox.onchange = function(e)  134.             haveAxes = axesCheckBox.checked;  135.             initialization();  136.  &

70、#160;        137.         gridCheckBox.onchange = function(e)  138.             haveGrid = gridCheckBox.checked;  139. &

71、#160;           initialization();  140.           141.         /Initialization-  142.         f

72、unction initialization()  143.             /清除画布  144.             context.clearRect(0,0,canvas.width,canvas.height);  145.    

73、60;        if(haveAxes)  146.                drawAxes(context,40);  147.               148. 

74、60;           if(haveGrid)  149.                drawGrid(context,10,10);  150.             

75、;  151.           152.         /入口  153.         initialization();  154.     </script>  155. </html&g

76、t;  绘制网格与坐标轴的js文件javascript view plaincopy1. /Classes-  2. function mikuLoc(locX,locY)  3.     this.x = locX;  4.     this.y = locY;  5.   6. /Contents-  7. var

77、 GRID_STYLE  = "lightgray",  8.     GRID_LINE_WIDTH = 0.5;  9.   10. var AXES_STYLE  = "#a2a2a2",  11.     AXES_LINE_WIDTH = 1,  1

78、2.     VERTICAL_TICK_SPACING = 10,  13.     HORIZONTAL_TIKE_SPACING = 10,  14.     TICK_WIDTH = 10;  15. /Function-  16. /绘制网格  17. /传入参数为:绘图环境,x轴间隔,y轴间隔 &

79、#160;18. function drawGrid(context,stepx,stepy)  19.     context.save();  20.     context.strokeStyle = GRID_STYLE;  21.     /设置线宽为0.5  22.     context.lineWidth

80、0;  = GRID_LINE_WIDTH;  23.     /绘制x轴网格  24.     /注意:canvas在两个像素的边界处画线  25.     /由于定位机制,1px的线会变成2px  26.     /于是要+0.5  27.     for(var&

81、#160;i=stepx+0.5;i<context.canvas.width;i=i+stepx)  28.         /开启路径  29.         context.beginPath();  30.         context.moveTo(i,0); 

82、0;31.         context.lineTo(i,context.canvas.height);  32.         context.stroke();  33.           34.        

83、60;/绘制y轴网格  35.     for(var i=stepy+0.5;i<context.canvas.height;i=i+stepy)  36.         context.beginPath();  37.         context.moveTo(0,i);  38. 

84、0;       context.lineTo(context.canvas.width,i);  39.         context.stroke();  40.           41.     context.restore();  42

85、. ;  43. /Function-  44. /绘制坐标轴  45. /传入参数为:绘图环境,坐标轴边距  46. function drawAxes(context,axesMargin)  47.     /保存样式  48.     context.save();  49.     var originLoc

86、 = new mikuLoc(axesMargin, context.canvas.height-axesMargin);  50.     var axesW = context.canvas.width  - (axesMargin*2),  51.         axesH = context.canvas.h

87、eight - (axesMargin*2);  52.     /设置坐标绘图样式绘图样式  53.     context.strokeStyle   =  AXES_STYLE;  54.     context.lineWidth =   AXES_LINE_WIDTH;  55.

88、     /绘制x,y轴  56.     drawHorizontalAxis();  57.     drawVerticalAxis();  58.     drawVerticalAxisTicks();  59.     drawHorizontalAxisTicks();  60. &#

89、160;   /恢复样式  61.     context.restore();  62.       63.     /绘制x轴  64.     function drawHorizontalAxis()  65.       

90、0; context.beginPath();  66.         context.moveTo(originLoc.x, originLoc.y);  67.         context.lineTo(originLoc.x + axesW, originLoc.y);  68.    

91、     context.stroke();  69.       70.     /绘制y轴  71.     function drawVerticalAxis()  72.         context.beginPath();  

92、73.         context.moveTo(originLoc.x, originLoc.y);  74.         context.lineTo(originLoc.x, originLoc.y - axesH);  75.         context.st

93、roke();  76.       77.     /绘制垂直轴小标标  78.     function drawVerticalAxisTicks()  79.         var deltaX;  80.      &

94、#160;  /当前垂直tick的y轴坐标  81.         var nowTickY =originLoc.y-VERTICAL_TICK_SPACING;  82.         for(var i=1;i<=(axesH/VERTICAL_TICK_SPACING);i+)  83.   

95、;          if(i%5 = 0)  84.                 deltaX=TICK_WIDTH;  85.             

96、else   86.                 deltaX=TICK_WIDTH/2;     87.               88.       

97、      context.beginPath();  89.             /移动到当前的tick起点  90.             context.moveTo(originLoc.x-deltaX,nowTickY);  

98、;91.             context.lineTo(originLoc.x+deltaX,nowTickY);  92.             context.stroke();  93.          

99、0;  nowTickY=nowTickY-VERTICAL_TICK_SPACING;  94.           95.       96.     /绘制水平轴小标标  97.     function drawHorizontalAxisTicks()  98

100、.         var deltaY;  99.         var nowTickX = originLoc.x+HORIZONTAL_TIKE_SPACING;  100.          for(var i=1;i<=(axesW/HOR

101、IZONTAL_TIKE_SPACING);i+)  101.             if(i%5 = 0)  102.                 deltaY = TICK_WIDTH;  103.  

102、;           else  104.                 deltaY = TICK_WIDTH/2;     105.         &

103、#160;     106.             context.beginPath();  107.             context.moveTo(nowTickX,originLoc.y+deltaY);  108.    

104、         context.lineTo(nowTickX,originLoc.y-deltaY);  109.             context.stroke();  110.             nowTick

105、X = nowTickX + HORIZONTAL_TIKE_SPACING;  111.           112.       113. ;  绘制虚线javascript view plaincopy1. /绘制虚线  2. /传入参数:上下文,起点,终点,虚线间隔  3. function 

106、;drawDashedLine(context,x1,y1,x2,y2,dashLength)  4.         /运用三元表达式实现默认参数  5.         dashLength = dashLength=undefined ? 5 : dashLength;  6.    

107、;     /水平长度  7.         var deltaX = x2 - x1;  8.         /垂直长度  9.         var deltaY =&#

108、160;y2 - y1;  10.         /虚线数量  11.         var numDashed = Math.floor(  12.             Math.sqrt(delta

109、X*deltaX+deltaY*deltaY)/dashLength  13.         );  14.         /开始绘制  15.         context.beginPath();  16.      &

110、#160;  for(var i=0; i<numDashed;i+)  17.             /这种写法太强大了  18.             /(deltaX/numDashed)是指虚线的长度  19.   

111、60;         contexti%2=0 ? "moveTo":"lineTo"(x1+(deltaX/numDashed)*i,y1+(deltaY/numDashed)*i);  20.               21.     

112、60;   /要记得描线啊  22.         context.stroke();  23.         /结束绘制  24.         context.closePath();  25.   主要绘图代码java

113、script view plaincopy1. /Vars-  2.         var canvas =document.getElementById("canvas"),  3.             context =canvas.getContext("2d"),&

114、#160; 4.             /正在绘制的绘图表面变量  5.             drawingSurfaceImageData,  6.             /鼠标按

115、下相关对象  7.             mousedown = ,  8.             /橡皮筋矩形对象  9.             rub

116、berbandRect = ,  10.             /拖动标识变量  11.             dragging = false;  12.         &

117、#160; 13.         /控件  14.         /擦除画布的控制  15.         var eraseAllButton = document.getElementById("eraseAllButton"); 

118、0;16.         /坐标轴的控制  17.         var axesCheckBox = document.getElementById("axesCheckBox");  18.         /网格线的控制  19. 

119、0;       var gridCheckBox = document.getElementById("gridCheckBox");  20.         /辅助线的控制  21.         var guideWiresCheckBox =

120、60;document.getElementById("guideWiresCheckBox");   22.         /线条颜色的控制  23.         var strokeColorSelectBox =document.getElementById("strokeColorSelectBox"); 

121、; 24.         /线条样式的控制  25.         var lineTypeSelectBox = document.getElementById("lineTypeSelectBox");  26.         /线条宽度的控制

122、60; 27.         var lineWidthSelectBox = document.getElementById("lineWidthSelectBox");  28. /Functions-  29.         /将窗口坐标转换为Canvas坐标  30.    &

123、#160;    /传入参数:窗口坐标(x,y)  31.         function windowToCanvas(x,y)  32.             /获取canvas元素的边距对象  33.       

124、60;     var bbox = canvas.getBoundingClientRect();  34.             /返回一个坐标对象  35.             /类似json的一种写法  3

125、6.             return   37.                     x : x - bbox.left*(canvas.width/bbox.width),  3

126、8.                     y : y - bbox.top*(canvas.height/bbox.height)  39.                 &

127、#160; 40.           41.         /保存当前绘图表面数据  42.         function saveDrawingSurface()  43.         

128、  /从上下文中获取绘图表面数据  44.           drawingSurfaceImageData = context.getImageData(0,0,canvas.width,canvas.height);  45.           46.      

129、;   /还原当前绘图表面  47.         function restoreDrawingSurface()  48.           /将绘图表面数据还原给上下文  49.           conte

130、xt.putImageData(drawingSurfaceImageData,0,0);  50.           51.         /橡皮筋相关函数  52.           53.       

131、60; /更新橡皮筋矩形+对角线  54.         /传入参数:坐标对象loc  55.         function updateRubberband(loc)  56.             updateRubberban

132、dRectangle(loc);  57.             drawRubberbandShape(loc);  58.           59.         /更新橡皮筋矩形  60.    &

133、#160;    /传入参数:坐标对象loc  61.         function updateRubberbandRectangle(loc)  62.             /获得矩形的宽  63.       

134、60;     rubberbandRect.width = Math.abs(loc.x - mousedown.x);  64.             /获得矩形的高  65.             rubberbandR

135、ect.height = Math.abs(loc.y - mousedown.y);  66.             /获得矩形顶点的位置(left,top)  67.             /如果鼠标按下的点(起点)在当前点的的左侧  68. 

136、0;           /这里画一下图就懂了  69.             if(loc.x > mousedown.x)  70.              

137、0;  rubberbandRect.left = mousedown.x;  71.             else  72.                 rubberbandRect.left = loc.x;

138、  73.               74.             if(loc.y > mousedown.y)  75.             

139、    rubberbandRect.top = mousedown.y;  76.             else  77.                 rubberbandRect.top =

140、0;loc.y;  78.               79.           80.         /绘制橡皮筋矩形的对角线  81.         

141、/传入参数:坐标对象loc  82.         function drawRubberbandShape(loc)  83.             /获取当前线条类型  84.             

142、var lineType = lineTypeSelectBox.value;  85.             /获取当前线条颜色  86.             var lineColor = strokeColorSelectBox.value;

143、60; 87.             /获取当前线条宽度  88.             var lineWidth = lineWidthSelectBox.value;  89.        

144、0;    /有改变context画笔属性就要做画笔保护  90.             context.save();  91.             context.strokeStyle = lineColor;  92. 

145、60;           context.lineWidth = lineWidth;  93.             if(lineType = "solid")  94.        

146、60;        /alert("draw");  95.                 /注意重新开始路径  96.                 context.beginPath();  97.           &#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论