• <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 閱讀(1032) 評論(0)  編輯 收藏 引用 所屬分類: 計算幾何

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

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久综合视频网站| 色综合久久最新中文字幕| 一本久久免费视频| 久久婷婷五月综合成人D啪| 无码人妻久久久一区二区三区| 99久久精品日本一区二区免费| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 日日狠狠久久偷偷色综合0| 久久综合九色综合欧美就去吻| 精品国产婷婷久久久| 久久精品国产亚洲AV蜜臀色欲| 国产成人久久激情91| 久久一区二区免费播放| 漂亮人妻被黑人久久精品| 久久久中文字幕日本| 国产V综合V亚洲欧美久久| 免费精品久久天干天干| 99久久婷婷国产综合精品草原| 久久精品免费全国观看国产| 久久久久一区二区三区| 久久无码专区国产精品发布| 久久精品国产亚洲网站| 日本久久久久亚洲中字幕| 性欧美大战久久久久久久 | 精品综合久久久久久88小说 | 伊人久久大香线蕉精品| 亚洲精品乱码久久久久久久久久久久 | 一本一本久久A久久综合精品| 国产精品无码久久综合| 久久无码中文字幕东京热| 四虎久久影院| 日本亚洲色大成网站WWW久久 | 日韩欧美亚洲综合久久影院Ds | 伊人久久成人成综合网222| 久久天天躁狠狠躁夜夜2020老熟妇| 99久久无色码中文字幕| 久久精品人人做人人爽97 | 久久国产乱子伦精品免费强| 青草国产精品久久久久久| AV色综合久久天堂AV色综合在| 色狠狠久久AV五月综合|