• <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>
            隨筆 - 87  文章 - 279  trackbacks - 0
            <2015年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            潛心看書研究!

            常用鏈接

            留言簿(19)

            隨筆分類(81)

            文章分類(89)

            相冊

            ACM OJ

            My friends

            搜索

            •  

            積分與排名

            • 積分 - 216400
            • 排名 - 117

            最新評論

            閱讀排行榜

            評論排行榜

            該算法有幾個可學(xué)習(xí)的地方:
            (1)正負(fù)1思想
            (2)對邊界條件的處理
            (3)數(shù)據(jù)結(jié)構(gòu)的選擇

            code:
            sweep.h

            #ifndef SWEEP_H
            #define SWEEP_H

            struct Edge {
                
            int nxty;
                
            int curx;
                
            int dx, dy; // 所在掃描線的增量
                Edge *nxt;
            }
            ;

            //掃描線主算法
            void sweep(int p[][2], int n, void (*setPixel)(intint));
            #endif
            sweep.cpp
            #include "sweep.h"
            #include 
            <algorithm>
            using namespace std;

            const int MAXN = 1024;

            int cp[MAXN][2], n;
            inline 
            bool cmp(int i, int j) {
                
            return cp[i][1< cp[j][1|| (cp[i][1== cp[j][1&& cp[i][0< cp[j][0]);
            }



            Edge 
            * e[MAXN], *h, *ph, *data;
            void insert(int ly, int px, int ind) {
                
            int y1,y2,y, nxt, pre, flag=0;

                nxt 
            = (ind + 1% n; pre = (ind - 1 + n) % n;
                y 
            = cp[ind][1]; y1 = cp[nxt][1]; y2 = cp[pre][1];
                
            if (y1 > y2) swap(y1, y2);
                
            if (y1 < y && y < y2) {
                    
            //需縮短一個單位
                    flag = 1;
                }


                h 
            = e[ly]; ph=NULL;
                
            while (h) {
                    
            if (h->dy > cp[ind][1|| (h->dy == cp[ind][1&& h->dx > cp[ind][0])) break;
                    ph 
            = h;
                    h 
            = h->nxt;
                }

                
                data 
            = new Edge;
                data
            ->curx = px; data->nxty = cp[ind][1]; data->dx = cp[ind][0- px; data->dy = cp[ind][1- ly; data->nxt = NULL;
                
            if (flag) data->nxty--;

                
            if (ph) {    
                    data
            ->nxt = ph->nxt;
                    ph
            ->nxt = data;
                }
             else {
                    data
            ->nxt = e[ly];
                    e[ly] 
            = data;
                }

                

            }


            int ex[MAXN][MAXN], ne[MAXN];
            inline 
            int abs(int a) {
                
            return a > 0 ? a : -a;
            }

            void makepoint(int line, Edge *h) {
                
            int dx = h->dx, dy = h->dy, cnt=0;
                
            int x, y, flag=1;
                
            if ((h->dx)*(h->dy)<0) flag=0;
                
            for (y=line, x=h->curx; y<=h->nxty; y++{
                    ex[y][ne[y]
            ++= x;
                    cnt 
            += 2*abs(dx);
                    
            while (cnt>=2*abs(dy)) {
                        cnt 
            -= 2*abs(dy);
                        
            if (flag) x++;
                        
            else x--;
                    }

                }

            }


            void sweep(int p[][2], int nn, void (*setPixel)(intint)) {
                
            //對所有點(diǎn)按y坐標(biāo)遞增排序,y坐標(biāo)相等的按x坐標(biāo)遞增排序
                n = nn;
                
            int i, j, k, ind, nxt, pre;
                
            int *num = new int[n];    //點(diǎn)索引;
                for (i=0; i<n; i++) num[i] = i;
                memcpy(cp, p, 
            sizeof(cp));
                sort(num, num
            +n, cmp);

                
            //建立有序邊表
                memset(e, 0sizeof(e));
                
            for (i=0; i<n; i++{
                    ind 
            = num[i]; 
                    nxt 
            = (ind + 1% n; 
                    pre 
            = (ind - 1 + n) % n;
                    
            if (p[nxt][1> p[ind][1]) insert(p[ind][1], p[ind][0], nxt);
                    
            if (p[pre][1> p[ind][1]) insert(p[ind][1], p[ind][0], pre);
                }


                
            //處理active edge list
                memset(ne, 0sizeof(ne));
                
            for (i=0; i<MAXN; i++{
                    h 
            = e[i]; ph = NULL;

                    
            while (h) {
                        makepoint(i, h);
                        h 
            = h->nxt;
                    }

                    sort(ex[i], ex[i]
            +ne[i]);
                    
            for (j=0; j<ne[i]; j+=2
                        
            for (k=ex[i][j]; k<=ex[i][j+1]; k++)
                            setPixel(k,i);
                }


            }
            sweepline.cpp
            #include <stdlib.h>
            #include 
            <stdio.h>
            #include 
            <GL/glut.h>
            #include 
            "sweep.h"

            void myInit();

            void setPixel(int x, int y);

            void myDisplay();

            int main(int argc, char **argv) {
                glutInit(
            &argc, argv);
                glutInitDisplayMode(GLUT_SINGLE
            |GLUT_RGB);
                glutInitWindowSize(
            640480);
                glutInitWindowPosition (
            100150);
                glutCreateWindow(
            "SweepLine");
                glutDisplayFunc(myDisplay);
                myInit();
                glutMainLoop();
                
            return 0;
            }



            void setPixel(int x, int y) {
                glBegin(GL_POINTS);
                glVertex2i(x, y);
                glEnd();
            }


            void myInit() {
                glClearColor(
            1.01.01.00.0);
                glColor3f(
            0.00.00.0);
                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                gluOrtho2D(
            0.0640.00.0480.0);
            }



            void myDisplay() {
                
            int i, j;
                glClear(GL_COLOR_BUFFER_BIT);
                
            int p[5][2];
                p[
            0][0= 100; p[0][1= 300;
                p[
            1][0= 200; p[1][1= 50;
                p[
            2][0= 300; p[2][1= 100;
                p[
            3][0= 400; p[3][1= 0;
                p[
            4][0= 350; p[4][1= 470;
                sweep(p, 
            5, setPixel);
                glFlush();
            }

            posted on 2007-10-20 22:33 閱讀(7805) 評論(3)  編輯 收藏 引用 所屬分類: 計算機(jī)圖形學(xué)

            FeedBack:
            # re: 掃描線-通用多邊形填充算法 2007-12-15 14:32 wa
            謝謝哦,真的很感謝!我一直很想學(xué)好CG的,但是不大熟悉這些資源,耽誤了很多的時間,現(xiàn)在有點(diǎn)時間不等人大的感覺!  回復(fù)  更多評論
              
            # re: 掃描線-通用多邊形填充算法 2008-10-15 21:13 
            奇怪了,這個程序,為什么我在C_FREE上調(diào)不通呢。
            有什么需要我注意的嗎?  回復(fù)  更多評論
              
            # re: 掃描線-通用多邊形填充算法 2009-04-03 12:17 組織者
            以后寫算法建議用純C寫。  回復(fù)  更多評論
              
            色欲久久久天天天综合网精品 | 亚洲精品无码久久久影院相关影片| 99久久精品日本一区二区免费| 99精品国产免费久久久久久下载| 久久久久成人精品无码| 久久精品国内一区二区三区 | 久久精品成人免费看| 久久精品aⅴ无码中文字字幕不卡| 久久99热这里只有精品国产| 一级a性色生活片久久无少妇一级婬片免费放 | 9999国产精品欧美久久久久久| 久久99国产亚洲高清观看首页| 精品久久一区二区三区| 久久亚洲高清观看| 丁香五月综合久久激情| 中文字幕亚洲综合久久2| 精品久久久久久国产免费了| 久久无码AV中文出轨人妻| 亚洲国产成人乱码精品女人久久久不卡 | 久久久精品午夜免费不卡| 久久精品国产99国产电影网 | 久久久国产99久久国产一| 亚洲精品乱码久久久久久中文字幕| 久久精品国产亚洲AV久| 国内精品人妻无码久久久影院 | 久久久久亚洲av综合波多野结衣| 色欲av伊人久久大香线蕉影院| 久久久久久亚洲AV无码专区| 狠狠干狠狠久久| 日韩美女18网站久久精品| 7777精品伊人久久久大香线蕉| 粉嫩小泬无遮挡久久久久久| 中文字幕成人精品久久不卡| 狠狠色丁香婷婷久久综合五月| 丰满少妇高潮惨叫久久久| 久久亚洲天堂| 精品久久久久久无码专区| 人人狠狠综合久久亚洲高清| 久久天天躁狠狠躁夜夜躁2O2O| 精品久久久久久无码国产| 性做久久久久久久|