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

            <2011年12月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久波多野结衣高潮| 久久夜色精品国产欧美乱| 99精品国产在热久久| 国产精品久久久久久久| 久久免费高清视频| 久久伊人色| 麻豆精品久久久久久久99蜜桃 | 青青青青久久精品国产| 国产成人久久精品麻豆一区| 性欧美大战久久久久久久| 日日躁夜夜躁狠狠久久AV| 99久久夜色精品国产网站| 久久精品国产亚洲AV香蕉| 色噜噜狠狠先锋影音久久| 精品久久人人爽天天玩人人妻| 国产精品久久影院| 欧美一区二区久久精品| 久久久久久狠狠丁香| 久久一日本道色综合久久| 伊人久久精品影院| 国产精品免费久久久久影院| 欧洲成人午夜精品无码区久久| 一级a性色生活片久久无少妇一级婬片免费放 | 97久久精品无码一区二区| 欧美一级久久久久久久大| 国产精品一久久香蕉产线看| 中文国产成人精品久久不卡| 久久WWW免费人成—看片| 国产精品久久久久久福利漫画| 久久精品中文无码资源站| 国产亚洲精品久久久久秋霞| 亚洲国产天堂久久久久久| 国产精品成人精品久久久| 久久久久亚洲AV成人片| 亚洲精品无码久久久久去q| 国产精品久久久久久五月尺| 久久久久这里只有精品 | 99久久99久久精品免费看蜜桃 | 久久久久久久97| 久久99久国产麻精品66| 久久AV高潮AV无码AV|