点的核心信息是坐标 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 算法.