• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-21  評論-10  文章-21  trackbacks-0
            如何快速的計算線段和多邊形(內部)是否相交?
            判線段相交要采用快速排斥來加速
            用遞歸的想法做, 就轉化成判線段與梯形是否相交
              1 #include<iostream>
              2 #include<vector>
              3 #include<cstdio>
              4 using namespace std;
              5 const double EPS = 1e-8// 給梯形縮框
              6 const double eps = 1e-12// 計算精度
              7 
              8 struct Point {
              9     double x, y;
             10 };
             11 
             12 struct Line {
             13     Point a, b;
             14     bool flag;
             15 };
             16 
             17 inline int dcmp(double x) {
             18     return x < -eps ? -1 : x > eps;
             19 }
             20 
             21 inline bool LEQ(double x, double y) // less equal, x <= y
             22 {
             23     return dcmp(x - y) <= 0;
             24 }
             25 
             26 inline bool GEQ(double x, double y) // greater equal, x >= y
             27 {
             28     return dcmp(x - y) >= 0;
             29 }
             30 
             31 double xmult(Point p1, Point p2, Point p0)//p0是原點
             32 {
             33     return (p1.x - p0.x)*(p2.y - p0.y)-(p2.x - p0.x)*(p1.y - p0.y);
             34 }
             35 
             36 vector<Line> stack;
             37 Point poly[4];
             38 int n;
             39 
             40 Point SymPoint(Point p, Line L) // 求二維平面上點p關于直線L的對稱點
             41 {
             42     Point result;
             43     double a = L.b.x - L.a.x;
             44     double b = L.b.y - L.a.y;
             45     double t = ((p.x - L.a.x) * a + (p.y - L.a.y) * b) / (a * a + b * b);
             46     result.x = 2 * L.a.x + 2 * a * t - p.x;
             47     result.y = 2 * L.a.y + 2 * b * t - p.y;
             48     return result;
             49 }
             50 
             51 Line SymLine(Line L, Line base) {
             52     L.a = SymPoint(L.a, base);
             53     L.b = SymPoint(L.b, base);
             54     return L;
             55 }
             56 
             57 bool segcross(Line L1, Line L2) // 判斷二維的兩條線段是否相交
             58 {
             59     return (GEQ(max(L1.a.x, L1.b.x), min(L2.a.x, L2.b.x)) &&
             60             GEQ(max(L2.a.x, L2.b.x), min(L1.a.x, L1.b.x)) &&
             61             GEQ(max(L1.a.y, L1.b.y), min(L2.a.y, L2.b.y)) &&
             62             GEQ(max(L2.a.y, L2.b.y), min(L1.a.y, L1.b.y)) &&
             63             LEQ(xmult(L2.a, L1.b, L1.a) * xmult(L2.b, L1.b, L1.a), 0&&
             64             LEQ(xmult(L1.a, L2.b, L2.a) * xmult(L1.b, L2.b, L2.a), 0));
             65 }
             66 
             67 bool inside_convex(Point q) {
             68     for (int i = 0; i < 4; i++)
             69         if (dcmp(xmult(poly[(i + 1% 4], q, poly[i])) < 0)return false;
             70     return true;
             71 }
             72 
             73 bool in_poly(Line fold) {
             74     Line L;
             75     if (inside_convex(fold.a))return true;
             76     for (int i = 0; i < 4; i++) {
             77         L.a = poly[i];
             78         L.b = poly[(i + 1% 4];
             79         if (segcross(fold, L)) return true;
             80     }
             81     return false;
             82 }
             83 
             84 void construt_poly(Line L1, Line L2) {
             85     poly[0].x = L1.a.x + EPS;
             86     poly[0].y = L1.a.y + EPS;
             87     poly[1].x = L2.a.x - EPS;
             88     poly[1].y = L2.a.y + EPS;
             89     poly[2].x = L2.b.x - EPS;
             90     poly[2].y = L2.b.y - EPS;
             91     poly[3].x = L1.b.x + EPS;
             92     poly[3].y = L1.b.y - EPS;
             93 }
             94 
             95 bool isBad(Line fold) {
             96     int cnt = stack.size();
             97     if (cnt < 2 || fold.flag != stack[cnt - 1].flag)return false;
             98     while (cnt >= 2) {
             99         fold = SymLine(fold, stack[cnt - 1]);
            100         construt_poly(stack[cnt - 2], stack[cnt - 1]);
            101         if (in_poly(fold))return true;
            102         cnt--;
            103     }
            104     return false;
            105 }
            106 
            107 int main() {
            108     //freopen("in","r",stdin);
            109     Line left;
            110     left.a.x = left.b.x = 0;
            111     left.a.y = 0, left.b.y = 1;
            112     while (scanf("%d"&n) != EOF && n) {
            113         stack.clear();
            114         stack.push_back(left);
            115         bool good = true;
            116         for (int i = 0; i < n; i++) {
            117             Line tem;
            118             tem.b.y = 1;
            119             tem.a.y = 0;
            120             scanf("%lf %lf %d"&tem.b.x, &tem.a.x, &tem.flag);
            121             if (good) {
            122                 if (isBad(tem)) {
            123                     printf("NO %d\n", i + 1);
            124                     good = false;
            125                     continue;
            126                 }
            127                 stack.push_back(tem);
            128             }
            129         }
            130         if (good) printf("YES\n");
            131     }
            132 }


            posted on 2009-09-30 16:27 wangzhihao 閱讀(353) 評論(0)  編輯 收藏 引用 所屬分類: geometry
            久久国产成人| 久久99国产精品一区二区| 久久久久人妻精品一区三寸蜜桃| 日产精品99久久久久久| 久久久久亚洲AV无码麻豆| 国产精品免费久久久久久久久| 国产精品美女久久福利网站| 国产成人久久AV免费| 色婷婷综合久久久久中文字幕| 久久久免费精品re6| 久久亚洲高清综合| 狠狠色丁香久久婷婷综| 97精品伊人久久久大香线蕉| 久久久国产精品福利免费| 97久久国产综合精品女不卡| 情人伊人久久综合亚洲| 中文字幕人妻色偷偷久久| 久久激情五月丁香伊人| 99久久国产综合精品麻豆| 国产成年无码久久久久毛片| 亚洲婷婷国产精品电影人久久 | 精品久久久久香蕉网| 国产欧美久久久精品影院| 国内精品久久久久久久涩爱 | 狠狠色丁香久久婷婷综合蜜芽五月| 久久久久四虎国产精品| 人妻精品久久久久中文字幕一冢本| 日本亚洲色大成网站WWW久久| 99久久亚洲综合精品成人| 欧美亚洲国产精品久久蜜芽| 伊人久久大香线焦AV综合影院 | 国产成人精品久久一区二区三区av | 久久久久久精品无码人妻| 久久久久18| 久久久国产视频| 婷婷久久五月天| 久久人人爽人人人人片av| 久久精品中文字幕大胸| 日本WV一本一道久久香蕉| 无码八A片人妻少妇久久| 区久久AAA片69亚洲 |