日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算几何基础-2

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算几何基础-2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 直線:
  • 圖形:
  • 求垂足
  • 求兩圓交點
  • 直線與圓交點
  • 多邊形問題
    • 判斷一個點是否在任意多邊形內部
    • Pick定理
  • 凸包
    • 求點集的凸包
      • 水平法:
      • 增量法:
  • 半平面
    • 半平面交
    • 求半平面交

直線:

struct Line{point p,v;Line(){}Line(point _p.point _v):p(_p),v(_v){} }L[N];

圖形:

求垂足

point vp(Line l,point p)//求p點向l做垂線得到的垂足 {double Dis=dis(l,p);//求p到l的距離Dis Dis=Dis*Dis;double pDis=(p-l.p).length();//求AP距離pDis pDis=pDis*pDis;double vDis=sqrt(pDis-Dis);//勾股定理得到AH距離 point ans=l.p+l.v*(vDis/l.v.length());//通過方向單位向量乘長度得到路徑,加起點得到答案 return ans; }

求兩圓交點

  • 先求余弦定理 cosp1
  • 反函數 角p1
  • p1p2旋轉到p11T方向
  • 調整長度
  • p1+p1T向量=T
    代碼:
  • point get_intersection(circle A,circle B) {point AB=B.o-A.o;double costheta=AB.length() * AB.length() + A.r *A.r-B.r*B.r;costheta=costheta/(2*AB.length()*A.r);//余弦定理AB=AB.rotatr(acos(costheta));//旋轉theta角return A.o+AB*(A.r/AB.length()); }

    直線與圓交點


    代碼:

    point get_intersection(circle A,Line B) {point H=vp(B,A.o);//求垂線 double OH=(H-A.o).length();double HY=sqrt(A.r * A.r -OH * OH);return H + B.v *(HY/B.v.length());// return H + B.v *(-HY/B.v.length()); }

    點+單位向量 * 長度

    多邊形問題

    平面上n個點收尾順次連接組成的平面圖形
    可能是凸多邊形或者凹多邊形

    判斷一個點是否在任意多邊形內部

    從這個點出發引一條射線,如果這個射線與多邊形有奇數個交點則在內部,否則在外部

    double calc_S() {double ans=0;int n=poly.size();for(int i=1;i<n;i++)ans+=poly[i-1]^poly[i];ans+=poly[n-1]^poly[0];return ans/2; }

    Pick定理

    對于頂點都是整點的多邊形,設其面積為S,多邊形內部的點數為a,邊上的點數為b,那么滿足:
    S = a + b/2 - 1

    凸包

    給出一個二維平面內的點集,如果任意兩個點的連線都在點集內,則這個點集是個凸集
    對于給定的散點集X,包含X的所有凸集的交集S叫做X的凸包
    點就是墻上的釘子,用一個橡皮筋套在外面,收縮后形成的凸多邊形就是凸包

    求點集的凸包

    水平法:

    凸包一般使用水平法求解
    將凸包分為上凸殼和下凸殼兩部分,分別求解
    每一部分按照x的坐標排序,用單調棧維護,利用叉積的符號判斷凹凸性

    增量法:


    判斷情況:
    此時B合法

    此時B不合法

    不合法的點一定是最后添加入S的,且是連續的

    //判斷上凸包 sort(poly.begin(),poly.end(),cmp); int top=0,n=poly.size(); Stack[++top]=poly[0]; for(int i=1;i<n;i++) {point C=poly[i];while(top>1){point B=Stack[top];point A=Stack[top-1];point AB=B-A;point AC=C-A;if((AB^AC)>eps)top--;else break;}Stack[++top]=C; }

    半平面

    ? 顧名思義,就是平面的一半。一條直線會把平面分成兩部分,就 是兩個半平面。對于半平面,我們可以用直線方程式如: ax+by+c > 0 表示,更常用的是用直線表示

    半平面交

    ? 顧名思義,就是多個半平面求交集。其結果可能是一個凸多邊形、 無窮平面、直線、線段、點等。 ? 什么時候需要半平面交?
    ? 1. 二維線性規劃 (高中數學)
    ? 2. 求多邊形的核 ? 多邊形的核:如果多邊形中存在一個區域使得在區域中可以看到 多邊形中任意位置(反之亦然),則這個區域就是多邊形的核

    求半平面交

    ? 理論上有很多很多種求法,但是在實際應用中效率最高而且最好 寫的是 S&I 增量法,也就是一個一個插入半平面并且更新答案。
    ? 核心思想:
    ? 1. 選取逆時針方向為正方向,把所有的直線變成向量。
    ? 2. 所有的向量按照極角排序,角度相同的保留左邊的。
    ? 3. 按照順序每次插入一個平面,刪掉右面的部分,保留左邊的部 分。
    ###具體方法:
    1.選方向,排序(如上文)
    ? 2.用雙端隊列保存構成當前核的所有向量。
    ? 3.按照順序遍歷所有向量,每次加入判斷影響
    ? 假設隊列中最后兩條直線的交點是左圖所示。如果新加入了直線 后原來的交點在直線右側,說明最后一條直線沒有用,把它從隊 列中刪除。


    看遍邊6要不要保留,就看5和6的交點在直線的哪一側

    由p指向v的向量
    ans存的交點
    q存的邊

    總結

    以上是生活随笔為你收集整理的计算几何基础-2的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。