在几何画板中, 有一项功能是为边和角添加标记, 之前作过角标记(AngleMark)的处理, 但在更改程序的
时候不知道哪里改动了, 使得功能出现了异常. 为此, 写下原来如何作的思路和笔记, 来帮助查找和解决
问题. 函数
为产生一个角标记的鼠标操做过程为:
1. 选择标记工具(MarkTool), 在角的顶点处按下鼠标(左键).
2. 拖动鼠标(左键按下状态), 到所需出现角标记的方向.
3. 松开鼠标左键, 此时实际建立角标记. 工具
分别对应 MarkTool 工具的三个处理函数: mouse_down, mouse_move, mouse_up. oop
在 mouse_down() 中, 对鼠标点击位置进行点击测试, 若是点击到一个点上面, 则
设置属性 this.angle_pt 并返回. 这个就当作是角的顶点. 测试
在 mouse_move() 中, 若是有 this.angle_pt 属性被设置(前提是左键被按下), 则使用
鼠标的位置向量 e.objX-this._down_x 计算 mouse_mark(false).
(回顾这里的时候, 发现了bug, 这里计算鼠标向量出错了) this
在 mouse_up() 中, 若是有 this.angle_pt, 则也计算 mouse_mark(true), 与 mouse_move()
的区别是, 实际建立出 AngleMark. 下面说明函数 mouse_mark(). spa
函数 mouse_mark() 用于计算/建立点 this.angle_pt 在方向 (x0,y0) 的角标记. 步骤以下:
1. 计算/找到全部过点 this.angle_pt 的射线(过该点的直线被当作两个相反方向的射线看待).
并按照射线与 x 轴的夹角大小排序.
2. 查找向量 (x0,y0) 构成的角 β 在哪两条射线之间. 则顶点 this.angle_pt 和这两条射线
构成要标记的角. (几何画板支持更好的选择操做, 咱们暂时不实现了)
3. 若是是鼠标移动阶段, 则建立一个临时的 AngleMark 对象. 并返回.
4. 若是是鼠标弹起, 则建立最终的 AngleMark 对象, 可能还要建立 oopt. 对象
这里问题: 因为每次 mouse_move() 都建立了临时的 AngleMark, 致使绘制有点麻烦.
TODO: 思考怎么改进. 排序
临时 AngleMark 和持久 AngleMark 都须要点, 由于一个 AngleMark 必须由三个点构成,
分别是顶点, 角左边上的点, 角右边上的点. 下面说明求取左右边点的函数. bug
函数 edge_to_pt(e) 用于求出在边 e 上面的一个点, 使得角顶点和该点构成边. 程序
函数 foc_pt_on_edge(e) 用于查找或建立(find or create) 点在边 e 上面. 因为边 e 上面可能没有所须要的定位角的点, 此时则须要建立一个新的 oopt 在 e 上面. 当前 取像素 100 个长度做为新的点的位置.