现在的位置: 首页 > 综合 > 正文

基本的计算几何

2013年12月10日 ⁄ 综合 ⁄ 共 1425字 ⁄ 字号 评论关闭

http://www.csie.ntnu.edu.tw/~u91029/PointLinePlane.html

內積後取絕對值,求得的是投影量,再除以投影標的的單位向量,則得到投影長度。

外積後取絕對值,求得的是平行四邊形的面積量,再除以底的單位向量,則得到高。

 
  1. struct Point {double xy;};    // 點的資料結構
  2. typedef Point Vector;           // 向量的資料結構,和點一樣
  3.  
  4. // 向量的長度
  5. double length(Vectorv)
  6. {
  7.     return sqrt(v1.x * v1.x + v2.y * v2.y);
  8. //  return sqrt(dot(v, v));
  9. }
  10.  
  11. void print_d1_and_d2()
  12. {
  13.     Point pp1p2;
  14.     Vector v1 = p1 - pv2 = p2 - p;
  15.     cout << "d1:" << fabs(dot(v1v2)) / length(v1);
  16.     cout << "d2:" << fabs(cross(v1v2)) / length(v1);
  17. }

內積、外積跟角度的關係

 
  1. void print_θ()
  2. {
  3.     Point pp1p2;
  4.     Vector v1 = p1 - pv2 = p2 - p;
  5.     double l1 = length(v1), l2 = length(v2);
  6.     cout << "cos(θ):" << dot(v1v2) / l1 / l2;
  7.     cout << "sin(θ):" << cross(v1v2) / l1 / l2;
  8.     cout << "θ:" << acos(dot(v1v2) / l1 / l2);    // [0, π]
  9.     cout << "θ:" << asin(cross(v1v2) / l1 / l2);  // [-π/2, π/2]
  10. }

注意到 acos 與 asin 的回傳值,回傳的結果是弳度量( radian )而非度度量( grade ),而且回傳值的範圍也不同。一般都以內積與 acos 求得介於 0˚ 到 180˚ 之間的夾角大小。

內積與向量夾角

利用內積的性質,可以粗略判斷夾角大小:內積大於 0 時,兩向量夾角小於 90˚ ;等於 0 時,夾角等於 90˚ ;小於零時,夾角大於 90˚ 且小於 180˚ 。

 
  1. // 向量oa與向量ob進行內積。可以判斷∠aob之大小。
  2. double dot(PointoPointaPointb)
  3. {
  4.     return (a.x-o.x) * (b.x-o.x+ (a.y-o.y) * (b.y-o.y);
  5. }

外積與向量旋轉

外積大於 0 時,兩向量前後順序為逆時針順序(在 180˚ 之內);等於 0 時,兩向量平行,也就是指夾角等於 0˚ 或 180˚ ;小於 0 時,兩向量前後順序為順時針順序(在 180˚ 之內)。

 
  1. // 向量oa與向量ob進行外積,可以判斷oa到ob旋轉的方向。
  2. double cross(PointoPointaPointb)
  3. {
  4.     return (a.x-o.x) * (b.y-o.y) - (a.y-o.y) * (b.x-o.x);
  5. }

舉例來說,要判斷多邊形凹凸,就沿著多邊形外圍繞一圈,看看每一條邊是不是折向同方向即可。

抱歉!评论已关闭.