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

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久婷婷| 欧美亚洲国产精品久久蜜芽| 女同久久| 99久久免费国产精品热| 国内精品人妻无码久久久影院导航| 久久久久国产精品| 国产成人精品久久亚洲高清不卡 | 亚洲午夜久久久影院| 国产精品久久久久无码av| 精品久久人人妻人人做精品| 成人综合伊人五月婷久久| 久久久久99精品成人片试看| 亚洲精品国产综合久久一线| 久久精品国产只有精品66| 亚洲精品无码久久一线| 日韩人妻无码精品久久久不卡| 免费久久人人爽人人爽av| 国产精品久久久久久久人人看| 亚洲综合久久综合激情久久| 国产精久久一区二区三区| 亚洲成色WWW久久网站| 国产综合成人久久大片91| 久久狠狠高潮亚洲精品| 国产精品99久久久精品无码 | 久久99精品久久久久久不卡| 国产A级毛片久久久精品毛片| 久久久久婷婷| 日本欧美国产精品第一页久久| 99久久国产免费福利| 日韩精品无码久久久久久| 色综合久久精品中文字幕首页| 久久96国产精品久久久| 久久精品国产久精国产思思| 久久久久免费看成人影片| 久久精品一区二区三区中文字幕| 久久性精品| 久久久女人与动物群交毛片| 97精品依人久久久大香线蕉97| 狠狠色噜噜色狠狠狠综合久久| 国产99久久久国产精品小说| 欧美国产成人久久精品|