• <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 閱讀(360) 評論(0)  編輯 收藏 引用 所屬分類: geometry
            国产巨作麻豆欧美亚洲综合久久| 欧美午夜A∨大片久久| 伊人久久大香线蕉综合影院首页| 精品久久久久久中文字幕大豆网| 久久午夜无码鲁丝片秋霞| 亚洲综合伊人久久大杳蕉| 精品熟女少妇a∨免费久久| 国产精品久久久久乳精品爆| 久久久久无码中| 无码伊人66久久大杳蕉网站谷歌| 国产精品一区二区久久不卡| 久久国产乱子伦精品免费午夜| 亚洲综合久久久| 九九久久99综合一区二区| 久久99精品久久久久久不卡 | 中文字幕日本人妻久久久免费| 久久精品国产清高在天天线| 久久本道综合久久伊人| 精品少妇人妻av无码久久| 欧美一区二区久久精品| 狠狠色婷婷综合天天久久丁香| 亚洲国产视频久久| 久久久WWW成人免费精品| 久久亚洲高清观看| 久久99精品久久久久久hb无码| 亚洲精品乱码久久久久久不卡| 久久亚洲国产午夜精品理论片| 热re99久久6国产精品免费| 色综合合久久天天给综看| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久久久久久久免费精品| 久久久久久亚洲Av无码精品专口| 久久人人爽人人爽人人爽| 香蕉久久永久视频| 中文字幕无码久久久| 久久精品亚洲精品国产欧美| 久久免费视频观看| 国产精品狼人久久久久影院| 日韩亚洲欧美久久久www综合网| 18岁日韩内射颜射午夜久久成人| 久久久久四虎国产精品|