




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Canvas实现画图、虚线、辅助线、线条颜色、线条宽度,整合加强版使用Canvas实现画图程序。本次更新主要实现了一下功能:虚线实线的选择、辅助线、线条颜色选择、线条宽度选择进一步整理了下代码,发现了不少很有用的写法,具体看下面。效果截图:源代码:HTML代码htmlview plaincopy1. 2. 3. 4. 5. 6. 7. canvas8. background-color:rgb(247,247,247);9. margin-top:10px;10. 11. 12. 13. 14. 15. 线条类型16. 实线17. 虚线18. 19. 线条颜色20. black21. red2
2、2. blue23. 24. 线条宽度25. 126. 227. 428. 29. 网格线30. 坐标轴31. 辅助线32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 48. 49. 绘制坐标轴与网格htmlview plaincopy1. 2. 3. 4. 5. 6. 7. canvas8. 9. 10. 11. 12. 13. 14. 15. 网格线16. 坐标轴17. 18. 19. 20. 21. 22. 23. 24. /Vars-25. varcanvas=document.getElementById(canvas),26. cont
3、ext=canvas.getContext(2d),27. /正在绘制的绘图表面变量28. drawingSurfaceImageData,29. /鼠标按下相关对象30. mousedown=,31. /橡皮筋矩形对象32. rubberbandRect=,33. /拖动标识变量34. dragging=false;35. /控制对象36. vareraseAllButton=document.getElementById(eraseAllButton),37. axesCheckBox=document.getElementById(axesCheckBox),38. /检测axesChe
4、ckBox是否被选中39. haveAxes=axesCheckBox.checked;40. vargridCheckBox=document.getElementById(gridCheckBox);41. varhaveGrid=gridCheckBox.checked;42. /Functions-43. /将窗口坐标转换为Canvas坐标44. /传入参数:窗口坐标(x,y)45. functionwindowToCanvas(x,y)46. /获取canvas元素的边距对象47. varbbox=canvas.getBoundingClientRect();48. /返回一个坐标对
5、象49. /类似json的一种写法50. return51. x:x-bbox.left*(canvas.width/bbox.width),52. y:y-bbox.top*(canvas.height/bbox.height)53. ;54. 55. /保存当前绘图表面数据56. functionsaveDrawingSurface()57. /从上下文中获取绘图表面数据58. drawingSurfaceImageData=context.getImageData(0,0,canvas.width,canvas.height);59. 60. /还原当前绘图表面61. functionr
6、estoreDrawingSurface()62. /将绘图表面数据还原给上下文63. context.putImageData(drawingSurfaceImageData,0,0);64. 65. /橡皮筋相关函数66. 67. /更新橡皮筋矩形+对角线68. /传入参数:坐标对象loc69. functionupdateRubberband(loc)70. updateRubberbandRectangle(loc);71. drawRubberbandShape(loc);72. 73. /更新橡皮筋矩形74. /传入参数:坐标对象loc75. functionupdateRubbe
7、rbandRectangle(loc)76. /获得矩形的宽77. rubberbandRect.width=Math.abs(loc.x-mousedown.x);78. /获得矩形的高79. rubberbandRect.height=Math.abs(loc.y-mousedown.y);80. /获得矩形顶点的位置(left,top)81. /如果鼠标按下的点(起点)在当前点的的左侧82. /这里画一下图就懂了83. if(loc.xmousedown.x)84. rubberbandRect.left=mousedown.x;85. else86. rubberbandRect.le
8、ft=loc.x;87. 88. if(loc.ymousedown.y)89. rubberbandRect.top=mousedown.y;90. else91. rubberbandRect.top=loc.y;92. 93. 94. /绘制橡皮筋矩形的对角线95. /传入参数:坐标对象loc96. functiondrawRubberbandShape(loc)97. /alert(draw);98. context.beginPath();99. context.moveTo(mousedown.x,mousedown.y);100. context.lineTo(loc.x,loc
9、.y);101. context.stroke();102. 103. /事件处理-104. canvas.onmousedown=function(e)105. varloc=windowToCanvas(e.clientX,e.clientY);106. e.preventDefault();107. saveDrawingSurface();108. mousedown.x=loc.x;109. mousedown.y=loc.y;110. dragging=true;111. 112. 113. canvas.onmousemove=function(e)114. varloc;115
10、. if(dragging)116. e.preventDefault();117. loc=windowToCanvas(e.clientX,e.clientY);118. restoreDrawingSurface();119. updateRubberband(loc);120. 121. 122. canvas.onmouseup=function(e)123. loc=windowToCanvas(e.clientX,e.clientY);124. restoreDrawingSurface();125. updateRubberband(loc);126. dragging=fal
11、se;127. 128. eraseAllButton.onclick=function(e)129. context.clearRect(0,0,canvas.width,canvas.height);130. initialization();131. saveDrawingSurface();132. 133. axesCheckBox.onchange=function(e)134. haveAxes=axesCheckBox.checked;135. initialization();136. 137. gridCheckBox.onchange=function(e)138. ha
12、veGrid=gridCheckBox.checked;139. initialization();140. 141. /Initialization-142. functioninitialization()143. /清除画布144. context.clearRect(0,0,canvas.width,canvas.height);145. if(haveAxes)146. drawAxes(context,40);147. 148. if(haveGrid)149. drawGrid(context,10,10);150. 151. 152. /入口153. initializatio
13、n();154. 155. 绘制网格与坐标轴的js文件javascriptview plaincopy1. /Classes-2. functionmikuLoc(locX,locY)3. this.x=locX;4. this.y=locY;5. 6. /Contents-7. varGRID_STYLE=lightgray,8. GRID_LINE_WIDTH=0.5;9. 10. varAXES_STYLE=#a2a2a2,11. AXES_LINE_WIDTH=1,12. VERTICAL_TICK_SPACING=10,13. HORIZONTAL_TIKE_SPACING=10,1
14、4. TICK_WIDTH=10;15. /Function-16. /绘制网格17. /传入参数为:绘图环境,x轴间隔,y轴间隔18. functiondrawGrid(context,stepx,stepy)19. context.save();20. context.strokeStyle=GRID_STYLE;21. /设置线宽为0.522. context.lineWidth=GRID_LINE_WIDTH;23. /绘制x轴网格24. /注意:canvas在两个像素的边界处画线25. /由于定位机制,1px的线会变成2px26. /于是要+0.527. for(vari=stepx
15、+0.5;icontext.canvas.width;i=i+stepx)28. /开启路径29. context.beginPath();30. context.moveTo(i,0);31. context.lineTo(i,context.canvas.height);32. context.stroke();33. 34. /绘制y轴网格35. for(vari=stepy+0.5;icontext.canvas.height;i=i+stepy)36. context.beginPath();37. context.moveTo(0,i);38. context.lineTo(con
16、text.canvas.width,i);39. context.stroke();40. 41. context.restore();42. ;43. /Function-44. /绘制坐标轴45. /传入参数为:绘图环境,坐标轴边距46. functiondrawAxes(context,axesMargin)47. /保存样式48. context.save();49. varoriginLoc=newmikuLoc(axesMargin,context.canvas.height-axesMargin);50. varaxesW=context.canvas.width-(axesMa
17、rgin*2),51. axesH=context.canvas.height-(axesMargin*2);52. /设置坐标绘图样式绘图样式53. context.strokeStyle=AXES_STYLE;54. context.lineWidth=AXES_LINE_WIDTH;55. /绘制x,y轴56. drawHorizontalAxis();57. drawVerticalAxis();58. drawVerticalAxisTicks();59. drawHorizontalAxisTicks();60. /恢复样式61. context.restore();62. 63.
18、 /绘制x轴64. functiondrawHorizontalAxis()65. context.beginPath();66. context.moveTo(originLoc.x,originLoc.y);67. context.lineTo(originLoc.x+axesW,originLoc.y);68. context.stroke();69. 70. /绘制y轴71. functiondrawVerticalAxis()72. context.beginPath();73. context.moveTo(originLoc.x,originLoc.y);74. context.
19、lineTo(originLoc.x,originLoc.y-axesH);75. context.stroke();76. 77. /绘制垂直轴小标标78. functiondrawVerticalAxisTicks()79. vardeltaX;80. /当前垂直tick的y轴坐标81. varnowTickY=originLoc.y-VERTICAL_TICK_SPACING;82. for(vari=1;i=(axesH/VERTICAL_TICK_SPACING);i+)83. if(i%5=0)84. deltaX=TICK_WIDTH;85. else86. deltaX=TIC
20、K_WIDTH/2;87. 88. context.beginPath();89. /移动到当前的tick起点90. context.moveTo(originLoc.x-deltaX,nowTickY);91. context.lineTo(originLoc.x+deltaX,nowTickY);92. context.stroke();93. nowTickY=nowTickY-VERTICAL_TICK_SPACING;94. 95. 96. /绘制水平轴小标标97. functiondrawHorizontalAxisTicks()98. vardeltaY;99. varnowTi
21、ckX=originLoc.x+HORIZONTAL_TIKE_SPACING;100. for(vari=1;i=(axesW/HORIZONTAL_TIKE_SPACING);i+)101. if(i%5=0)102. deltaY=TICK_WIDTH;103. else104. deltaY=TICK_WIDTH/2;105. 106. context.beginPath();107. context.moveTo(nowTickX,originLoc.y+deltaY);108. context.lineTo(nowTickX,originLoc.y-deltaY);109. con
22、text.stroke();110. nowTickX=nowTickX+HORIZONTAL_TIKE_SPACING;111. 112. 113. ;绘制虚线javascriptview plaincopy1. /绘制虚线2. /传入参数:上下文,起点,终点,虚线间隔3. functiondrawDashedLine(context,x1,y1,x2,y2,dashLength)4. /运用三元表达式实现默认参数5. dashLength=dashLength=undefined?5:dashLength;6. /水平长度7. vardeltaX=x2-x1;8. /垂直长度9. vard
23、eltaY=y2-y1;10. /虚线数量11. varnumDashed=Math.floor(12. Math.sqrt(deltaX*deltaX+deltaY*deltaY)/dashLength13. );14. /开始绘制15. context.beginPath();16. for(vari=0;imousedown.x)70. rubberbandRect.left=mousedown.x;71. else72. rubberbandRect.left=loc.x;73. 74. if(loc.ymousedown.y)75. rubberbandRect.top=moused
24、own.y;76. else77. rubberbandRect.top=loc.y;78. 79. 80. /绘制橡皮筋矩形的对角线81. /传入参数:坐标对象loc82. functiondrawRubberbandShape(loc)83. /获取当前线条类型84. varlineType=lineTypeSelectBox.value;85. /获取当前线条颜色86. varlineColor=strokeColorSelectBox.value;87. /获取当前线条宽度88. varlineWidth=lineWidthSelectBox.value;89. /有改变context
25、画笔属性就要做画笔保护90. context.save();91. context.strokeStyle=lineColor;92. context.lineWidth=lineWidth;93. if(lineType=solid)94. /alert(draw);95. /注意重新开始路径96. context.beginPath();97. context.moveTo(mousedown.x,mousedown.y);98. /这里可以更改成画虚线99. context.lineTo(loc.x,loc.y);100. context.stroke();101. elseif(lineType=dashed)102. drawDashedLine(context,mousedown.x,mousedown.y,loc.x,loc.y);103. 104. context.restore();105. 106
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 村民与村民合作社互助土地使用协议
- 市政学研究生院试题及答案指导
- 学习方法与建筑工程考试试题及答案
- 2025关于房屋租赁合同模板
- 2025标准房屋租赁合同范本「版」2
- 2025私人借款抵押合同范本
- 行政管理的环境适应性与实践考查试题及答案
- 行政管理考试中的公文撰写试题及答案
- 建筑施工现场应急方案试题及答案
- 2025年管理学考试中的新时代试题及答案
- 珠海住建局质量问题防治脱落和开裂防治篇
- 职业暴露应急预案演练
- 2024年秋江苏开放大学文献检索与论文写作参考范文一:行政管理专业
- 《电力市场概论》 课件 第五章 系统安全与辅助服务
- 《10000以内数的读、写法》(教案)-二年级下册数学人教版
- 2024年湖南省高考生物试卷真题(含答案解析)
- 秘书公文写作范文
- 《民法典》2024年知识考试题库(含答案)
- 《篮球原地双手胸前传接球》教案 (三篇)
- 旅游经济专业知识和实务经济师考试(中级)试卷及解答参考(2025年)
- 高中化学新课标知识考试题库大全(新版)
评论
0/150
提交评论