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

               這個(gè)題用到2個(gè)計(jì)算幾何算法。求解凸包和簡(jiǎn)單多邊形面積。凸包算法詳細(xì)解釋見(jiàn)算法導(dǎo)論。求解多邊形面積的思想是將多邊形分解為三角
            形,一般是假設(shè)按順序取多邊形上面連續(xù)的2點(diǎn)與原點(diǎn)組合成一個(gè)三角形,依次下去用叉積求有向面積之和,最后取絕對(duì)值即可。注意,這些
            點(diǎn)必須是在多邊形上逆時(shí)針或者順時(shí)針給出的,而求出凸包剛好給了這樣的一系列點(diǎn)。
               凸包代碼,其實(shí)先找出一個(gè)y坐標(biāo)最小的點(diǎn),再對(duì)剩下的所有點(diǎn)按極角排序。然后對(duì)排序后的點(diǎn)進(jìn)行一個(gè)二維循環(huán)即可。二維循環(huán)的解釋是
            當(dāng)加入新的點(diǎn)進(jìn)入凸包集合時(shí)候,如果與以前加入的點(diǎn)形成的偏轉(zhuǎn)方向不一致,那么前面那些點(diǎn)都需要彈出集合。

               代碼如下:
            #include <stdio.h>
            #include <string.h>
            #include <algorithm>
            #include <math.h>
            using namespace std;
            #define MAX_N (10000 + 10)

            struct Point
            {
                double x, y;
                bool operator <(const Point& p) const
                {
                    return y < p.y || y == p.y && x < p.x;
                }
            };

            Point pts[MAX_N];
            int nN;
            Point ans[MAX_N];
            int nM;

            double Det(double fX1, double fY1, double fX2, double fY2)
            {
                return fX1 * fY2 - fX2 * fY1;
            }

            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);
            }

            bool CrossCmp(const Point& a, const Point& b)
            {
                double cs = Cross(pts[0], a, b);
                return cs > 0 || cs == 0 && a.x < b.x; 
            }

            void Scan()
            {
                nM = 0;
                sort(pts + 1, pts + nN, CrossCmp);//對(duì)所有點(diǎn)按極角排序,逆時(shí)針偏轉(zhuǎn)
                
                
            //第0-2個(gè)點(diǎn),其實(shí)不會(huì)進(jìn)入第二重循環(huán)的
                
            //從第3個(gè)點(diǎn)開(kāi)始,就依次檢查與凸包中前面點(diǎn)形成的邊的偏轉(zhuǎn)方向
                
            //如果不是逆時(shí)針偏轉(zhuǎn),則彈出該點(diǎn)
                for (int i = 0; i < nN; ++i)
                {
                    while (nM >= 2 && Cross(ans[nM - 2], ans[nM - 1], pts[i]) <= 0)
                    {
                        nM--;
                    }
                    ans[nM++] = pts[i];
                }
            }

            double GetArea()
            {
                double fAns = 0.0;
                Point ori = {0.0, 0.0};
                for (int i = 0; i < nM; ++i)
                {
                    fAns += Cross(ori, ans[i], ans[(i + 1) % nM]);
                }
                return fabs(fAns) * 0.5;
            }

            int main()
            {
                while (scanf("%d", &nN) == 1)
                {
                    for (int i = 0; i < nN; ++i)
                    {
                        scanf("%lf%lf", &pts[i].x, &pts[i].y);
                        if (pts[i] < pts[0])
                        {
                            swap(pts[i], pts[0]);//pts[0]是y坐標(biāo)最小的點(diǎn)
                        }
                    }
                    
                    Scan();//掃描出凸包
                    double fArea = GetArea();
                    printf("%d\n", (int)(fArea / 50));
                }
                
                return 0;
            }

            posted on 2012-07-18 20:28 yx 閱讀(1068) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 計(jì)算幾何

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

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            99久久国产主播综合精品| 国产99久久九九精品无码| 免费精品久久天干天干| 久久久久久午夜成人影院| 亚洲国产精品久久久久婷婷软件| 久久福利片| 精品综合久久久久久888蜜芽| 欧美综合天天夜夜久久| 久久人妻无码中文字幕| 国产精品久久久久影院色| 亚洲午夜久久久| 国产一区二区精品久久岳| 热re99久久精品国99热| 久久久久国产视频电影| 久久午夜伦鲁片免费无码| 久久久国产精品| 漂亮人妻被黑人久久精品| 狠狠色伊人久久精品综合网| 中文无码久久精品| 麻豆国内精品久久久久久| 日韩欧美亚洲综合久久影院d3| 久久久久高潮综合影院| 久久综合五月丁香久久激情| 欧美777精品久久久久网| 久久精品天天中文字幕人妻| 久久久久亚洲国产| 开心久久婷婷综合中文字幕| 精品久久久久久无码中文野结衣| 国内精品人妻无码久久久影院 | 久久精品桃花综合| 国产精品久久久久天天影视| 久久精品天天中文字幕人妻| 日韩久久久久久中文人妻 | 久久久久久久综合综合狠狠| 久久香蕉国产线看观看99 | 久久精品国产精品亚洲下载| 久久亚洲欧美日本精品| 久久精品免费观看| 久久天天躁狠狠躁夜夜av浪潮 | 精品久久久久久中文字幕| 精品无码久久久久久尤物|