网页版几何画板开发笔记(六) 关于线

点的核心信息是坐标 x,y; 如果是别的子类型, 则根据子类型和所依赖的对象, 根据几何关系计算出点的坐标.

另一核心对象为线, 两点可以确定(determine)一条线. 因而线的最本质信息是点, 分别为 p1和p2,
其中 p1 做为起点, p2 作为终点或过该点.

当前暂时实现的线的子类型有: 线段, 射线, 直线, 平行线, 垂线, 角平分线. 下面分别笔记.

class Line extends ObjBase {
  Point p1;  // 起点
  Point p2;  // 终点
  string type = 'line'; // 对象类型: 线.
  string sub_type; // 线的子类型.
  Range t_range; // 参数 t 的取值范围.
  
  public static Line new_seg(p1,p2); // 新建线段子类型的线.
  public static Line new_ray(p1,p2); // 新建射线子类型的线.
  public static Line new_sline(p1,p2); // 新建过点 p1,p2 的直线.
  public static Line new_paral(line1, p3); // 新建过点 p3 平行于 line1 的直线.
  public static Line new_perpl(line1, p3); // 新建过点 p3 垂直于 line1 的直线.
  public static Line new_bisl(pA,pO,pB); // 新建∠AOB 的角平分线.
}

子类型的名字: 线段=segment, 射线=ray, 直线=sline, 平行线=paral, 垂线=perpl, 角平分线=bisl.

对于线段, 当用参数式表示线的时候, t 的取值范围为 [0, 1], 点在 p1,p2 之间.
对于射线, t 的取值范围为 [0, +无穷), 点在 p1->p2 方向.
对于直线, t 的取值范围为 (-无穷, +无穷), 点在整个实数范围.

平行线(paral), 垂线(perpl) 也是直线; 角平分线(bisl)则是射线.

线段, 射线, 直线都仅依赖点 p1,p2, 不需要特别阐述了. 下面笔记另三种线的创建和位置计算:

Line.new_paral(line1, p3) // 过点 p3 做 line1 的平行线.
  平行线依赖 line1, p3, 故此其父对象是 [line1, p3].
  在前面的数学推导中, 我们提及过点做平行线的推导, 在实际几何画板中, 根据研究, 算法如下:
V = (p2-p1)/2  -- p1,p2 是 line1 的点 p1,p2
平行线的 p1=p3-V, p2=p3+V
相当于在 p3 的两侧分别取p1->p2 的一半, 构成平行于 p1p2 的线.
t 的取值范围为 (-无穷, +无穷).

Line.new_perpl(line1, p3) // 过点 p3 做 line1 的垂线.
  类似于平行线, 垂线依赖 line1,p3. 计算点的算法:
V=(p2-p1)*i/2
垂线的 p1=p3-V, p2=p3+V.
t 的取值范围为 (-无穷, +无穷).

Line.new_bisl(pA, pO, pB) // 求角 ∠AOB 的角平分线.
  父对象: [pA,pO,pB]
尽管前面我们有推导过如果求三点的角平分线点, 但因要兼容几何画板的算法, 这里使用的
是根据几何画板的方式(自己研究的, 不一定对).
具体方法是在角的两条边上各取一点 L,K, 使得OL=OK=94.7 (经验值), 然后取 L,K 的中点
作为角平分线的 p2, p1 不言而喻是用 pO 点了.
角平分线的 t 取值范围为 [0, +无穷), 也即射线.

今假设要实现别的方式的线, 则方法是 1.添加子类型; 2.确定t的范围; 3.new/update 算法.


 

你可能感兴趣的:(网页版几何画板开发笔记(六) 关于线)