• <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>

            poj 3130 How I Mathematician Wonder What You Are!

               半平面交的一個題,也是求多邊形的核心。求出這個好像也可以用于解決一些線性規劃問題。我用的是N*N的基本算法,每加入一條直線,
            就對原來求出的半平面交進行處理,產生新的核心。
               代碼參照臺灣的一個網站演算法筆記上的內容和代碼。表示這個網站巨不錯,求凸包的算法也參照了這個網站上的內容和代碼。
            半平面交的地址:http://www.csie.ntnu.edu.tw/~u91029/Half-planeIntersection.html#a4
               
               代碼思路主要是:先讀入所有的多邊形頂點,放入一個vector(vp)里面,然后對多邊形的每條邊求一個半平面。剛開始的時候,用一個
            vector(Polygon)保存代表上下左右四個無限遠角的四個點,表示原始的半平面。然后,用讀入的多邊形的每條邊去切割原來的半平面。
            切割的過程是,如果原來(Polygon)中的點在當前直線的指定一側,那么原來的點還是有效的。如果原來的點和它相鄰的下一個點與當前
            直線相交,那么還需要把交點加入Polygon集合。
               還有求交點的方法比較奇葩,類似于黑書上面的那種根據面積等分的方法。

               代碼如下:
            #include <stdio.h>
            #include <string.h>
            #include <math.h>
            #include <vector>
            #include <algorithm>
            using namespace std;

            double fPre = 1e-8;
            struct Point
            {
                double x;
                double y;
                Point(){}
                Point(double fX, double fY)
                {
                    x = fX, y = fY;
                }
            };
            typedef vector<Point> Polygon;
            typedef pair<Point, Point> Line;
            Point operator+(const Point& a, const Point& b)
            {
                Point t;
                t.x = a.x + b.x;
                t.y = a.y + b.y;
                return t;
            }

            Point operator-(const Point& a, const Point& b)
            {
                Point t;
                t.x = a.x - b.x;
                t.y = a.y - b.y;
                return t;
            }

            Point operator*(Point a, double fD)
            {
                Point t;
                t.x = a.x * fD;
                t.y = a.y * fD;
                return t;
            }

            int DblCmp(double fD)
            {
                return fabs(fD) < fPre ? 0 : (fD > 0 ? 1 : -1);
            }

            double Det(double fX1, double fY1, double fX2, double fY2)
            {
                return fX1 * fY2 - fX2 * fY1;
            }
            //3點叉積
            double Cross(Point a, Point b, Point c)
            {
                return Det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
            }
            //向量叉積
            double Cross(Point a, Point b)
            {
                return a.x * b.y - a.y * b.x;
            }

            //求直線交點的一種簡便方法
            //平行四邊形面積的比例等于高的比例
            Point Intersection(Point a1, Point a2, Point b1, Point b2)
            {
                Point a = a2 - a1;
                Point b = b2 - b1;
                Point s = b1 - a1;
                
                return a1 + a * (Cross(b, s) / Cross(b, a));
            }

            Polygon HalfPlane(Polygon& pg, Point a, Point b)
            {
                Polygon pgTmp;
                int nN = pg.size();
                for (int i = 0; i < nN; ++i)
                {
                    double fC = Cross(a, b, pg[i]);
                    double fD = Cross(a, b, pg[(i + 1) % nN]);
                    if (DblCmp(fC) >= 0)
                    {
                        pgTmp.push_back(pg[i]);
                    }
                    if (fC * fD < 0)
                    {
                        pgTmp.push_back(Intersection(a, b, pg[i], pg[(i + 1) % nN]));
                    }
                }
                return pgTmp;
            }

            int main()
            {
                int nN;
                Point p;
                vector<Point> vp;
                Polygon pg;
                
                while (scanf("%d", &nN), nN)
                {
                    vp.clear();
                    for (int i = 0; i < nN; ++i)
                    {
                        scanf("%lf%lf", &p.x, &p.y);
                        vp.push_back(p);
                    }
                    pg.clear();
                    pg.push_back(Point(-1e9, 1e9));
                    pg.push_back(Point(-1e9, -1e9));
                    pg.push_back(Point(1e9, -1e9));
                    pg.push_back(Point(1e9, 1e9));
                    for (int i = 0; i < nN; ++i)
                    {
                        pg = HalfPlane(pg, vp[i], vp[(i + 1) % nN]);
                        if (pg.size() == 0)
                        {
                            printf("0\n");
                            break;
                        }
                    }
                    if (pg.size())
                    {
                        printf("1\n");
                    }
                }

                return 0;
            }

            posted on 2012-07-23 10:41 yx 閱讀(1047) 評論(0)  編輯 收藏 引用 所屬分類: 計算幾何

            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久永久免费| 久久99热这里只频精品6| 久久久久久精品久久久久| 久久本道久久综合伊人| 日日狠狠久久偷偷色综合免费| 国产午夜精品理论片久久| 国产综合精品久久亚洲| 久久精品成人欧美大片| 成人午夜精品无码区久久| 99久久免费国产特黄| 综合久久给合久久狠狠狠97色 | 国产精品美女久久久久av爽| 思思久久好好热精品国产| 色婷婷综合久久久久中文一区二区| 精品久久久久久无码中文字幕一区| jizzjizz国产精品久久| 亚洲欧洲精品成人久久曰影片| 久久精品国产亚洲AV无码麻豆 | 97精品久久天干天天天按摩 | 精品久久久久久久久午夜福利| 日韩一区二区久久久久久| 久久久久一本毛久久久| 99久久er这里只有精品18| 欧美精品久久久久久久自慰| 久久国产精品免费一区| 91麻精品国产91久久久久| 国内精品久久久久影院薰衣草| 午夜精品久久久久久99热| 久久久精品午夜免费不卡| 99久久久精品免费观看国产| 丰满少妇人妻久久久久久| 一本久久知道综合久久| 久久青青草原亚洲av无码app| 日韩AV毛片精品久久久| 久久精品人人做人人爽电影| 亚洲精品美女久久久久99| 少妇高潮惨叫久久久久久| 国产毛片久久久久久国产毛片| 久久久久亚洲精品天堂久久久久久| 欧美成人免费观看久久| 66精品综合久久久久久久|