资源下载地址:https://download.csdn.net/download/sheziqiong/85907763
资源下载地址:https://download.csdn.net/download/sheziqiong/85907763
scanConversion.html html文件,前端显示文件
config.js js文件,本次项目的全部功能全部有其实现
开发环境:Chrome浏览器 73.0
运行:确保scanConversion.html和config.js在同一个目录下,用Chrome浏览器打开html文件即可
函数名 | 作用 | 参数 | 返回 |
---|---|---|---|
calculateKAndB | 根据传入线段两端点,计算线段y=kx+b的k与 b | 线段两个端点 | 线段斜率存在,返回数组[k,b],不存在返回 null |
findNode | 根据传入扫描线y、线段两个端点、线段斜率来计算扫描线与线段的交点 | 扫描线y;线段两端点 kb数组;填充颜色color | 如果不存在交点,返回-1;存在一个交点,返回交点x坐标;如果扫描线与线段重合,则直接在该函数内画线并返回-1 |
sortNumber | js数组排序的compare接口 | 比较的两元素 | return a-b |
drawQuad | 根据传入的一个四边形顶点数组,进行扫描获取交点,根据交点进行画线 | 需要绘制的四边形的顶点数组 | 无返回 |
drawQuadAll | 画出全部四个四边形,会根据当前移动的手;柄,判断哪个四边形变化,并按照变化的四边形后画的顺序调用drawQuad进行填充四边形 | 当前移动的手柄下标 | 无返回 |
circle | 中心画圆法,根据顶点左边以及半径画圆,每次绘制一个点 | 顶点坐标x,y 半径r;填充颜色color | 无返回 |
drawCircle | 遍历顶点数组,并调用circle绘制全部顶点 | 无 | 无 |
isInCanvas | 判断当前鼠标坐标是否在canvas内部 | 鼠标坐标x,y | 在canvas内部返回true,否则返回false |
getPoint | 判断当前鼠标坐标是否在某个手柄内部,并获取手柄下标 | 鼠标坐标x,y | 在某个手柄内部,返回手柄下标,否则返回-1 |
doMousedown | 鼠标按下事件处理函数,判断按下时鼠标是否在某个手柄上,是的话绑定鼠标移动事件,不是则无动作 | 事件ev | 无 |
doMousemove | 鼠标移动事件处理函数,获取鼠标坐标,更新顶点坐标数组,并清空canvas,重新绘制四边形与手柄 | 事件ev | 无 |
doMouseup | 鼠标松开事件处理函数,调用鼠标移动函数进行绘制图像,并解除鼠标移动事件的绑定 | 事件ev | 无 |
在drawQuadAll中,判断当前移动的四边形,将移动与未移动的四边形进行分组,优先绘制未移动的四边形,再绘制移动的四边形
根据顺序,依次传入一个四边形顶点数组调用drawQuad函数
使用drawQuad绘制单个四边形时,先获取全部顶点左边,计算该四边形的四条边斜率(事先计算保存,保证绘制一个四边形每条线段只计算一次斜率,提高性能)
判断四边形的四个顶点的最大与最小y坐标,由此确定扫描线的扫描区间(确定区间,无需扫描整个canvas,提升效率)
遍历扫描区间,根据扫描线、线段的斜率等,采用一次函数y=kx+b求出扫描线与四边形四条边的交点,并存入交点数组,扫描过程会维持三个交点数组,分布用于存储本次扫描结果、上次扫描结果、上上次扫描结果。
扫描时如果遇到扫描线与线段重合,直接绘制该线段,并且不返回交点坐标。
本次扫描结束后,会对上次扫描结果进行排序,开始图像绘制,对上次扫描结果进行分类绘制:
四个交点:有主要下图两种情况,所以要根据本次扫描结果以及上上次扫描结果进行判断绘制
如果本次以及上上次扫描结果交点个数均为2,则是左图情况,则直接绘制线段:交点数组的第一个到第四个交点
如果前后两次交点个数有一者不为两个,说明是右图情况,则绘制线1-2,3-4;
遍历顶点数组,获取每个顶点的下标,每次调用circle函数,传入一个顶点进行绘制
circle函数采用中点画圆算法,对顶点进行绘制
按下鼠标之后启动mousedown事件,获取鼠标坐标,判断左边是否在canvas内且在某个手柄内部。如果符合条件,为鼠标移动绑定事件mousemove
鼠标移动mousemove事件:如果绑定了该事件,鼠标移动时,被选定的手柄会与鼠标坐标同时移动,每移动一次,canvas就会清空画布,根据当前坐标重新绘制四边形与手柄。如果手柄移动到canvas外部,鼠标移动事件将暂时失效
鼠标松开事件mouseup:如果鼠标松开,会最后一次调用mousemove,重新绘制画布,之后解除mousemove事件的绑定
资源下载地址:https://download.csdn.net/download/sheziqiong/85907763
资源下载地址:https://download.csdn.net/download/sheziqiong/85907763