網頁版幾何畫板開發筆記(六) 關於線

點的核心信息是座標 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 的角平分線.
} string

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

對於線段, 當用參數式表示線的時候, t 的取值範圍爲 [0, 1], 點在 p1,p2 之間.
對於射線, t 的取值範圍爲 [0, +無窮), 點在 p1->p2 方向.
對於直線, t 的取值範圍爲 (-無窮, +無窮), 點在整個實數範圍. date

平行線(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 的取值範圍爲 (-無窮, +無窮). static

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 算法.

相關文章
相關標籤/搜索