网页版几何画板开发笔记(十一) 角的标记

在几何画板中, 有一项功能是为边和角添加标记, 以前做过角标记(AngleMark)的处理, 但在更改程序的
时候不知道哪里改动了, 使得功能出现了异常. 为此, 写下原来如何做的思路和笔记, 来帮助查找和解决
问题.

为产生一个角标记的鼠标操作过程为:
  1. 选择标记工具(MarkTool), 在角的顶点处按下鼠标(左键).
  2. 拖动鼠标(左键按下状态), 到所需出现角标记的方向.
  3. 松开鼠标左键, 此时实际创建角标记.

分别对应 MarkTool 工具的三个处理函数: mouse_down, mouse_move, mouse_up.

在 mouse_down() 中, 对鼠标点击位置进行点击测试, 如果点击到一个点上面, 则
设置属性 this.angle_pt 并返回. 这个就当做是角的顶点.

在 mouse_move() 中, 如果有 this.angle_pt 属性被设置(前提是左键被按下), 则使用
鼠标的位置向量 e.objX-this._down_x 计算 mouse_mark(false).
(回顾这里的时候, 发现了bug, 这里计算鼠标向量出错了)

在 mouse_up() 中, 如果有 this.angle_pt, 则也计算 mouse_mark(true), 与 mouse_move()
的区别是, 实际创建出 AngleMark. 下面说明函数 mouse_mark().

函数 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 必须由三个点构成,
分别是顶点, 角左边上的点, 角右边上的点. 下面说明求取左右边点的函数.

函数 edge_to_pt(e) 用于求出在边 e 上面的一个点, 使得角顶点和该点构成边.

函数 foc_pt_on_edge(e) 用于查找或创建(find or create) 点在边 e 上面. 由于边 e
上面可能没有所需要的定位角的点, 此时则需要创建一个新的 oopt 在 e 上面. 当前
取像素 100 个长度作为新的点的位置.

你可能感兴趣的:(网页版几何画板开发笔记(十一) 角的标记)