• <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>
            隨筆:78 文章:7 評論:38 引用:0
            C++博客 首頁 發新隨筆
            發新文章 聯系 聚合管理

            轉自:http://blog.sina.com.cn/s/blog_4d035b080100k3ep.html?retcode=0
            opengl文字處理(1) (入門學習十六)(轉)

            OpenGL
            版的“Hello, World!”
            寫完了本課,我的感受是:顯示文字很簡單,顯示文字很復雜。看似簡單的功能,背后卻隱藏了深不可測的玄機。
            呵呵,別一開始就被嚇住了,讓我們先從“Hello, World!”開始。
            前面已經說過了,要顯示字符,就需要通過操作系統,把繪制字符的動作裝到顯示列表中,然后我們調用顯示列表即可繪制字符。
            假如我們要顯示的文字全部是ASCII字符,則總共只有0127128種可能,因此可以預先把所有的字符分別裝到對應的顯示列表中,然后在需要時調用這些顯示列表。
            Windows系統中,可以使用wglUseFontBitmaps函數來批量的產生顯示字符用的顯示列表。函數有四個參數:
            第一個參數是HDC,學過Windows GDI的朋友應該會熟悉這個。如果沒有學過,那也沒關系,只要知道調用wglGetCurrentDC函數,就可以得到一個HDC了。具體的情況可以看下面的代碼。
            第二個參數表示第一個要產生的字符,因為我們要產生0127的字符的顯示列表,所以這里填0
            第三個參數表示要產生字符的總個數,因為我們要產生0127的字符的顯示列表,總共有128個字符,所以這里填128
            第四個參數表示第一個字符所對應顯示列表的編號。假如這里填1000,則第一個字符的繪制命令將被裝到第1000號顯示列表,第二個字符的繪制命令將被裝到第1001號顯示列表,依次類推。我們可以先用glGenLists申請128個連續的顯示列表編號,然后把第一個顯示列表編號填在這里。
            還要說明一下,因為wglUseFontBitmapsWindows系統特有的函數,所以在使用前需要加入頭文件:#include <windows.h>
            現在讓我們來看具體的代碼:

            #include <windows.h>

            // ASCII
            字符總共只有0127,一共128種字符
            #define MAX_CHAR       128

            void drawString(const char* str) {
                static int isFirstCall 1;
                static GLuint lists;

                if( isFirstCall // 
            如果是第一次調用,執行初始化
                                    // 為每一個ASCII字符產生一個顯示列表
                    isFirstCall 0;

                    // 
            申請MAX_CHAR個連續的顯示列表編號
                    lists glGenLists(MAX_CHAR);

                    // 
            把每個字符的繪制命令都裝到對應的顯示列表中
                    wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
                }
                // 
            調用每個字符對應的顯示列表,繪制每個字符
                for(; *str!='\0'; ++str)
                    glCallList(lists *str);
            }



            顯示列表一旦產生就一直存在(除非調用glDeleteLists銷毀),所以我們只需要在第一次調用的時候初始化,以后就可以很方便的調用這些顯示列表來繪制字符了。
            繪制字符的時候,可以先用glColor*等指定顏色,然后用glRasterPos*指定位置,最后調用顯示列表來繪制。

            void display(void) {
                glClear(GL_COLOR_BUFFER_BIT);

                glColor3f(1.0f, 0.0f, 0.0f);
                glRasterPos2f(0.0f, 0.0f);
                drawString("Hello, World!");

                glutSwapBuffers();
            }

            效果如圖:



            指定字體
            在產生顯示列表前,Windows允許選擇字體。
            我做了一個selectFont函數來實現它,大家可以看看代碼。

            void selectFont(int size, int charset, const char* face) {
                HFONT hFont CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
                    charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                    DEFAULT_QUALITY, DEFAULT_PITCH FF_SWISS, face);
                HFONT hOldFont (HFONT)SelectObject(wglGetCurrentDC(), hFont);
                DeleteObject(hOldFont);
            }

            void display(void) {
                selectFont(48, ANSI_CHARSET, "Comic Sans MS");

                glClear(GL_COLOR_BUFFER_BIT);

                glColor3f(1.0f, 0.0f, 0.0f);
                glRasterPos2f(0.0f, 0.0f);
                drawString("Hello, World!");

                glutSwapBuffers();
            }


            最主要的部分就在于那個參數超多的CreateFont函數,學過Windows GDI的朋友應該不會陌生。沒有學過GDI的朋友,有興趣的話可以自己翻翻MSDN文檔。這里我并不準備仔細講這些參數了,下面的內容還多著呢:(
            如果需要在自己的程序中選擇字體的話,把selectFont函數抄下來,在調用glutCreateWindow之后、在調用wglUseFontBitmaps之前使用selectFont函數即可指定字體。函數的三個參數分別表示了字體大小、字符集(英文字體可以用ANSI_CHARSET,簡體中文字體可以用GB2312_CHARSET,繁體中文字體可以用CHINESEBIG5_CHARSET,對于中文的Windows系統,也可以直接用DEFAULT_CHARSET表示默認字符集)、字體名稱。
            效果如圖:



             

            posted @ 2010-11-14 21:36 未央 閱讀(718) | 評論 (0)編輯 收藏
             

            轉載:http://blog.csdn.net/xie_zi/archive/2007/12/09/1925778.aspx
            GLUT教程              鼠標
            在前幾節,我們看了怎么使用GLUT的keyboard函數,來增加一個OpenGL程序的交互性。現在,是時候研究下鼠標了。GLUT的鼠標接口提供一些列的選項來增加鼠標的交互性。也就是檢測鼠標單擊,和鼠標移動。
             
            檢測鼠標Clicks
            和鍵盤處理一樣,GLUT為你的注冊函數(也就是處理鼠標clicks事件的函數)提供了一個方法。函數glutMouseFunc,這個函數一般在程序初始化階段被調用。函數原型如下:
            void glutMouseFunc(void(*func)(int button,int state,int x,int y));
            參數:
            func:處理鼠標click事件的函數的函數名。
            從上面可以看到到,處理鼠標click事件的函數,一定有4個參數。第一個參數表明哪個鼠標鍵被按下或松開,這個變量可以是下面的三個值中的一個:
            GLUT_LEFT_BUTTON
            GLUT_MIDDLE_BUTTON
            GLUT_RIGHT_BUTTON
            第二個參數表明,函數被調用發生時,鼠標的狀態,也就是是被按下,或松開,可能取值如下:
            GLUT_DOWN
            GLUT_UP
            當函數被調用時,state的值是GLUT_DOWN,那么程序可能會假定將會有個GLUT_UP事件,甚至鼠標移動到窗口外面,也如此。然而,如果程序調用glutMouseFunc傳遞NULL作為參數,那么GLUT將不會改變鼠標的狀態。
             
            剩下的兩個參數(x,y)提供了鼠標當前的窗口坐標(以左上角為原點)。
             
            檢測動作(motion)
            GLUT提供鼠標motion檢測能力。有兩種GLUT處理的motion:active motion和passive motion。Active motion是指鼠標移動并且有一個鼠標鍵被按下。Passive motion是指當鼠標移動時,并有沒鼠標鍵按下。如果一個程序正在追蹤鼠標,那么鼠標移動期間,沒一幀將產生一個結果。
             
            和以前一樣,你必須注冊將處理鼠標事件的函數(定義函數)。GLUT讓我們可以指定兩個不同的函數,一個追蹤passive motion,另一個追蹤active motion
             
            它們的函數原型,如下:
            void glutMotionFunc(void(*func)(int x,int y));
            void glutPassiveMotionFunc(void (*func)(int x,int y));
            參數:
            Func:處理各自類型motion的函數名。
            處理motion的參數函數的參數(x,y)是鼠標在窗口的坐標。以左上角為原點。
             
            檢測鼠標進入或離開窗口
            GLUT還能檢測鼠標鼠標離開,進入窗口區域。一個回調函數可以被定義去處理這兩個事件。GLUT里,調用這個函數的是glutEntryFunc,函數原型如下:
            void glutEntryFunc(void(*func)(int state));
            參數:
            Func:處理這些事件的函數名。
            上面函數的參數中,state有兩個值:
            GLUT_LEFT
            GLUT_ENTERED
            表明,是離開,還是進入窗口。
             
            把它們放一起
            首先我們要做的是在GLUT里定義哪些函數將負責處理鼠標事件。因此我們將重寫我們的main函數,讓它包含所有必須的回調注冊函數。我們將在程序里描述其他一些教程里沒說清楚的地方。
            void main(int argc, char **argv) {         glutInit(&argc, argv);         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);         glutInitWindowPosition(100,100);         glutInitWindowSize(320,320);         glutCreateWindow("SnowMen");         glutDisplayFunc(renderScene);         glutIdleFunc(renderScene);         glutReshapeFunc(changeSize);          //adding here the mouse processing callbacks         glutMouseFunc(processMouse);         glutMotionFunc(processMouseActiveMotion);         glutPassiveMotionFunc(processMousePassiveMotion);         glutEntryFunc(processMouseEntry);                  glutMainLoop();}OK,現在做點有趣的。我們將定義那些將做一些不可思議事件的回調函數。當一個鼠標鍵和alt鍵都被按下,我們將改變三角形的顏色。鼠標左鍵使三角形變成紅色,中間的將三角形變成綠色,鼠標右鍵將三角形變成藍色。函數如下:
            void processMouse(int button, int state, int x, int y) {           specialKey = glutGetModifiers();         // 當鼠標鍵和alt鍵都被按下         if ((state == GLUT_DOWN) &&                           (specialKey == GLUT_ACTIVE_ALT)) {                  // set the color to pure red for the left button                 if (button == GLUT_LEFT_BUTTON) {                          red = 1.0; green = 0.0; blue = 0.0;                 }                 // set the color to pure green for the middle button                 else if (button == GLUT_MIDDLE_BUTTON) {                          red = 0.0; green = 1.0; blue = 0.0;                 }                 // set the color to pure blue for the right button                 else {                          red = 0.0; green = 0.0; blue = 1.0;                 }         }}接下來有一個精細的顏色拾取方法。當一個鼠標鍵被按下,但alt鍵被被按下。我們把blue設為0.0,并且讓red和green分量的值取決于鼠標在窗口中的位置。。函數如下:
            void processMouseActiveMotion(int x, int y) {          // the ALT key was used in the previous function         if (specialKey != GLUT_ACTIVE_ALT) {                 // setting red to be relative to the mouse                  // position inside the window                 if (x < 0)                          red = 0.0;                 else if (x > width)                          red = 1.0;                 else                          red = ((float) x)/height;                 // setting green to be relative to the mouse                  // position inside the window                 if (y < 0)                          green = 0.0;                 else if (y > width)                          green = 1.0;                 else                          green = ((float) y)/height;                 // removing the blue component.                 blue = 0.0;         }}下面給passive motion添加一些動作。當shift鍵被按下,鼠標將在x軸上有一個旋轉。我們不得不修改renderScene函數。函數如下:
            float angleX = 0.0;...void renderScene(void) {         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         glPushMatrix();         glRotatef(angle,0.0,1.0,0.0);                  // This is the line we added for the         // rotation on the X axis;         glRotatef(angleX,1.0,0.0,0.0);                  glColor3f(red,green,blue);          glBegin(GL_TRIANGLES);                 glVertex3f(-0.5,-0.5,0.0);                 glVertex3f(0.5,0.0,0.0);                 glVertex3f(0.0,0.5,0.0);         glEnd();         glPopMatrix();         angle++;         glutSwapBuffers();}現在我們的有個函數處理passive motion事件。函數將改變angleX的值。void processMousePassiveMotion(int x, int y) {          // User must press the SHIFT key to change the          // rotation in the X axis         if (specialKey != GLUT_ACTIVE_SHIFT) {                  // setting the angle to be relative to the mouse                  // position inside the window                 if (x < 0)                          angleX = 0.0;                 else if (x > width)                          angleX = 180.0;                 else                          angleX = 180.0 * ((float) x)/height;         }}最后鼠標離開窗口將使動畫停止,為了做到這,我們也需要改變函數renderScene。// initially define the increase of the angle by 1.0;float deltaAngle = 1.0;...void renderScene(void) {         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         glPushMatrix();         glRotatef(angle,0.0,1.0,0.0);         glRotatef(angleX,1.0,0.0,0.0);         glColor3f(red,green,blue);          glBegin(GL_TRIANGLES);                 glVertex3f(-0.5,-0.5,0.0);                 glVertex3f(0.5,0.0,0.0);                 glVertex3f(0.0,0.5,0.0);         glEnd();         glPopMatrix();         // this is the new line         // previously it was: angle++;         angle+=deltaAngle;         glutSwapBuffers();}processMouseEntry是最后一個函數。注意,這個在微軟操作系統下可能工作的不是很好。void processMouseEntry(int state) {         if (state == GLUT_LEFT)                 deltaAngle = 0.0;         else                 deltaAngle = 1.0;}VC6.0工程可以在這里下載(glut8.zip)。 (到這里位置,鍵盤,鼠標方面的控制講完了,下面就是菜單了。)(原文地址:http://www.lighthouse3d.com/opengl/glut/index.php?9

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xie_zi/archive/2007/12/09/1925778.aspx

            posted @ 2010-11-08 12:26 未央 閱讀(9138) | 評論 (1)編輯 收藏
             
            【轉】http://dacuisworld.spaces.live.com/blog/cns!5194FC8976D233A0!1121.entry
            重裝電腦之后按照以上方法可順利配置OpenGL編程環境!重裝了真好!
            posted @ 2010-11-02 14:52 未央 閱讀(311) | 評論 (0)編輯 收藏
             

            在VISUAL C++ 2008上配置OPENGL開發環境

            這篇文章寫的太有用了!我想配VC2008的OpenGL,添加了5個文件后仍然找不到glaux.h,很是著急啊,直到這篇文章解救了我。  !!!非常感謝!

            -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            應該在
            VISUAL C++ 2005/VC 6.0/VC7.0同樣都適用

            首先感謝網上寫VC6.0配置OPENGL開發環境的作者,我是先在你那里學習了如何配置,只是做了一點小的延伸,主要內容還是你的。

            第一步:下載OpenGLGLUT

            Windows環境下的GLUT下載地址:(蘋果機不需要安裝,自帶)  

            http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip

            第二步:OpenGL庫和配置文件

            OpenGL庫配置用到的文件分為下面三類:

            ■ 動態鏈接庫文件(.dll

            glaux.dll, glu32.dll, glut32.dll, OPENGL32.DLL, glut.dll

            ■ 頭文件(.h

            GL.H, GLAUX.H, GLU.H, glut.h

            ■ 庫文件(.lib

            GLAUX.LIBGlu32.libglut32.libOpengl32.libglut.lib

             

            其中opengl32.dll, glaux.dll,glu32.dll是安裝顯卡驅動自帶,應該每個系統里面都有,如果沒有重新安裝顯卡驅動。

            其中glut32.dll, glut.dll, glut.h, glut32.lib, glut.lib 是在剛才那個地址下載的,打開壓縮包后會有5個文件

            下面就是區別了,VC++ 2008不帶GL.H, GLAUX.h, glu.h, glaux.lib, glu32.lib, opengl32.lib這些文件要在網上下載或者在VC6.0里面拷貝出來,

            如果想要全套的文件,給我發郵件我給你發xudongcui@gmail.com

             

            第三步:Windows下配置OpenGL

            glut32.dll, glut.dll拷貝到C:\WINDOWS\system32目錄下,system32目錄下應該已經有 opengl32.dll, glu32.dll了。

            GL.H, GLAUX.h, glu.h, glut.h  拷貝到 C:\Program Files\Microsoft Visual Studio 9.0\VC\include\gl

            GLAUX.LIBGlu32.libglut32.libOpengl32.libglut.lib拷貝到 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib

            第四步:建立VC++2008工程

            打開VC++2008,選擇新建工程,Win32Win32控制臺應用程序。刪除默認的所有代碼,用如下代碼替換。

            #include "stdafx.h"

            #include <windows.h>

            #include <GL/glu.h>

            #include <GL/gl.h>

            #include <GL/glut.h>

            #include <GL/glaux.h>

             

            void background(void)

            {

            //設置背景顏色為黑色

            glClearColor(0.0,0.0,0.0,0.0);

            }

             

            void myDisplay(void)

            {

            //buffer設置為顏色可寫

            glClear(GL_COLOR_BUFFER_BIT);

            //開始畫三角形

            glBegin(GL_TRIANGLES);

            //設置為光滑明暗模式

            glShadeModel(GL_SMOOTH);

            //設置第一個頂點為紅色

            glColor3f(1.0,0.0,0.0);

            //設置第一個頂點的坐標為(-1.0-1.0

            glVertex2f(-1.0,-1.0);

            //設置第二個頂點為綠色

            glColor3f(0.0,1.0,0.0);

            //設置第二個頂點的坐標為(0.0-1.0

            glVertex2f(0.0,-1.0);

            //設置第三個頂點為藍色

            glColor3f(0.0,0.0,1.0);

            //設置第三個頂點的坐標為(-0.51.0

            glVertex2f(-0.5,1.0);

            //三角形結束

            glEnd();

            //強制OpenGL函數在有限時間內運行

            glFlush();

            }

             

            void myReshape(GLsizei w,GLsizei h)

            {

            glViewport(0,0,w,h);

            //設置視口

             

            glMatrixMode(GL_PROJECTION);

            //指明當前矩陣為GL_PROJECTION

            glLoadIdentity();

            //將當前矩陣置換為單位陣

             

            if(w <= h)

            gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);

            //定義二維正視投影矩陣

            else

            gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);

            glMatrixMode(GL_MODELVIEW);

            //指明當前矩陣為GL_MODELVIEW

            }

            int main(int argc, char* argv[])

            {

            // 初始化

            glutInit(&argc,argv);

            glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

            glutInitWindowSize(400,400);

            glutInitWindowPosition(200,200);

             

            //創建窗口

            glutCreateWindow("Triangle");

             

            //繪制與顯示

            background();

            glutReshapeFunc(myReshape);

            glutDisplayFunc(myDisplay);

             

            glutMainLoop();

            return(0);

            }

            posted @ 2010-09-30 13:11 未央 閱讀(7569) | 評論 (1)編輯 收藏
             
            pku 1050 最大子矩陣和

            題目大意:
            給定一個N*N的矩陣,求其中一個子矩陣所有元素的和最大,輸出最大值。

            題解:
                這道題很早就見過了,一直不會做,學了最大連續和,但是沒能成功遷移,看別人的解題報告也是很久才理解。
            主要思想就是把二維的矩陣轉化成一位的數字串,然后求最大子串和。轉換的時候,為了保證最大子串構成的是完整的矩形,所以串里的每一個元素都得是一列的和。枚舉子矩陣的起始行和高度,如從第i行開始,到第j行結束,每一對 i 和 j,對每一列(1~n)求和,然后求1~n串的最大子串和。
            #include<stdio.h>
            #include
            <string.h>
            const int N = 110;
            int g[N][N], f[N];
            int main(){
                
            int n;
                
            while(scanf("%d"&n)!=EOF){
                    memset(f, 
            0sizeof(f));
                    
            for(int i=1; i<=n; i++)
                        
            for(int j=1; j<=n; j++)
                            scanf(
            "%d"&g[i][j]);
                    
            int mx=-100000000;
                    
            for(int i=1; i<=n; i++)
                        
            for(int j=i ; j<=n; j++){
                            memset(f, 
            0sizeof(f));
                            
            for(int s=1; s<=n; s++)
                                
            for(int k=i; k<=j; k++)
                                    f[s]
            +=g[k][s];
                            
            int tmp=0;
                            
            for(int s=1; s<=n; s++){
                                
            if(tmp>0)
                                    tmp
            +=f[s];
                                
            else
                                    tmp
            =f[s];
                                mx
            =mx>tmp?mx:tmp;
                            }

                        }

                    printf(
            "%d\n",mx);

                }

                
            return 0;
            }



            posted @ 2010-09-03 22:58 未央 閱讀(215) | 評論 (0)編輯 收藏
             
                     最近被逼的不行了,所以動真格的學動規!先是把《程序設計導引及在線實踐》這本書里動規的例題都看過、做過,本來想一道一道的做習題的,結果poj掛了。于是轉戰hdu,昨天做了一道三維樹狀數組,比較理解了,今天又繼續hdu的動規,感覺做過的題型,換個背景再做能夠想到并且實現了,細節上還需注意。
            hdu 1160 FatMouse's Speed
            題目大意:
            給定n只老鼠的體重w和速度s,求一個最長的排列,使得這個排列中的老鼠體重嚴格遞增,速度嚴格遞減。題目看上去很像最長上升子序列,只是這里的序列是可以打亂順序按體重排序的。

            解題思路:
            整體思路同最長上升子序列。
            1、按老鼠的體重遞增排序,當老鼠的體重相等時按速度遞減排序。
            2、f[j]表示前j只老鼠中最長序列的長度,狀態轉移方程為
                  f[N]初始值為0;
                  f[j]=max{ f[i] : 0<=i<j 且 s[j]<s[i] }+1;
                  也就是說,如果第j只老鼠是最長序列中的話,那么它肯定比上一個在最長序列中老鼠體重更大 ( j>i ) 且速度更小 ( s[j] < s[i] )。

            代碼如下:
            #include<stdio.h>
            #include
            <string.h>
            #include
            <algorithm>
            #include
            <stdlib.h>
            using namespace std;
            const int N = 1010;
            struct Mouse{
                
            int w, s, num;
            }
            m[N];
            int f[N], pre[N];
            bool cmp(Mouse a, Mouse b){
                
            if(a.w<b.w)
                    
            return true;
                
            else if (a.w==b.w)
                    
            return a.s>b.s;
                
            return false;
            }

            int main(){
                
            int i=0,n=0;
                
            while(scanf("%d %d"&m[n].w, &m[n].s)!=EOF){
                    m[n].num
            =n+1;
                    n
            ++;
                }

                sort(m, m
            +n, cmp);
                memset(f, 
            0sizeof(f));
                memset(pre, 
            -1sizeof(pre));
                
            int mx=0,end=0;
                
            for(i=1; i<n; i++){
                    
            for(int j=0; j<i; j++){
                        
            if(m[i].s<m[j].s && m[i].w>m[j].w){
                            
            if(f[j]+1>f[i]){
                                f[i]
            =f[j]+1;
                                pre[i]
            =j;
                            }

                        }

                    }

                    
            if(f[i]>mx){
                        mx
            =f[i];
                        end
            =i;
                    }

                }

                printf(
            "%d\n", mx+1);
                
            int ans[N], len=0, x;
                x
            =end; ans[0]=x;
                
            while(pre[x]>=0){
                    ans[
            ++len]=pre[x];
                    x
            =pre[x];
                    
            if(x<0break;
                }

                
            for(i=len; i>=0; i--)
                    printf(
            "%d\n", m[ans[i]].num);
                
            return 0;
            }

            posted @ 2010-09-01 17:39 未央 閱讀(192) | 評論 (0)編輯 收藏
             
            Java課留作業,要求實現“在Frame窗口中設計一個文本框和一個文本區域,文本框內容改變時,將文本框中的內容顯示在文本區域中”,這個問題可害苦了我,查了好多方法都不行,還是對Java里面的類不了解啊。
            解決辦法:
            創建文本框時不要用JTextField, 因為這個類里面沒有addTextListener的方法,所以聲明文本框的時候應該這樣寫:
                java.awt.TextField textField=new java.awt.TextField();  
            然后再給 textField 加一個監聽器
                textField.addTextListener(new TextListener(){
                        public void textValueChanged(TextEvent e){
                            ta.setText(textField.getText());
                        }
                    });
            就可以實時在文本域里顯示文本框的改變了。
            ⊙﹏⊙b汗,這個問題糾結了好久
            感謝koy師兄的鼎力支持和耐心講解,好人啊!

            posted @ 2010-05-23 17:27 未央 閱讀(3458) | 評論 (1)編輯 收藏
             
                    現在才做這個決定其實已經有些晚了,但是人就是這樣,可以早作打算的時候往往不知道該怎么打算,好在我習慣了很多事情都在最后時刻奮力爭取。過年這些天很多人都對我媽說,該讓孩子出去見識見識,別攔著。媽媽也想開了,有了她的支持比任何利益誘惑都更能堅定我。于是我想給自己找一個不得不出國的理由,然后堅定信念去拼最后半年,但是我發現這個理由好難找,后來我知道了,很多事情之所以這樣做并不一定是出于必然,而是個人的喜好和性格,這樣的話,選擇就無所謂對錯,只有喜歡與否。就像選專業一樣,選到喜歡的就是對的。好吧,那就讓自己離開家吧,像去杭州和哈爾濱一樣,下了火車沒感覺有多遠,照樣是人們生活的地方。
                    我的學分也漸漸上來了,競賽也有了一些成果,接下來該做的事情就是考英語的G、T和完成實驗室Vuze的項目,最好能發一篇論文,保持成績和競賽。時間緊,任務重,沒有心思想別的了,努力吧:)
                   新年新愿望:明年的這個時候希望有好的offer圓了我的留學夢^-^
            posted @ 2010-02-25 10:28 未央 閱讀(353) | 評論 (1)編輯 收藏
             
            包含點集所有點的最小圓的算法最小圓覆蓋 http://acm.zju.edu.cn/show_problem.php?pid=1450 相關題目最小球包含 http://acm.pku.edu.cn/JudgeOnline/problem?id=2069 平面上有n個點,給定n個點的坐標,試找一個半徑最小的圓,將n 個點全部包圍,點可以在圓上。 1. 在點集中任取3點A,B,C。 2. 作一個包含A,B,C三點的最小圓,圓周可能通過這3點,也可能只通過其中兩點,但包含第3點.后一種情況圓周上的兩點一定是位于圓的一條直徑的兩端。 3. 在點集中找出距離第2步所建圓圓心最遠的D點,若D點已在圓內或圓周上,則該圓即為所求的圓,算法結束.則,執行第4步。 4. 在A,B,C,D中選3個點,使由它們生成的一個包含這4個點的圓為最小,這3 點成為新的A,B,C,返回執行第2步。若在第4步生成的圓的圓周只通過A,B,C,D 中的兩點,則圓周上的兩點取成新的A和B,從另兩點中任取一點作為新的C。 程序設計題解上的解題報告:對于一個給定的點集A,記MinCircle(A)為點集A的最小外接圓,顯然,對于所有的點集情況A,MinCircle(A)都是存在且惟一的。需要特別說明的是,當A為空集時,MinCircle(A)為空集,當A={a}時,MinCircle(A)圓心坐標為a,半徑為0; 顯然,MinCircle(A)可以有A邊界上最多三個點確定(當點集A中點的個數大于 1時,有可能兩個點確定了MinCircle(A)),也就是說存在著一個點集B,|B|<=3 且B包含與A,有MinCircle(B)=MinCircle(A).所以,如果a不屬于B,則 MinCircle(A-{a})=MinCircle(A);如果MinCircle(A-{a})不等于MinCircle(A),則 a屬于B。 所以我們可以從一個空集R開始,不斷的把題目中給定的點集中的點加入R,同時維護R的外接圓最小,這樣就可以得到解決該題的算法。
            zju 1450
            題目描述:給定n個點,求覆蓋所有點的圓的圓心和半徑
            #include<stdio.h>
            #include
            <math.h>
            #include
            <string.h>
            #define MAXN 20
            struct pointset{
                
            double x, y;
            };
            const double precison=1.0e-8;
            pointset maxcic, point[MAXN];
            double radius;
            int curset[MAXN], posset[3];
            int set_cnt, pos_cnt;
            inline 
            double dis_2(pointset &from, pointset& to){
                
            return ((from.x-to.x)*(from.x-to.x)+(from.y-to.y)*(from.y-to.y));
            }
            int in_cic(int pt){
                
            if(sqrt(dis_2(maxcic, point[pt]))<radius+precison) return 1;
                
            return 0;
            }
            int cal_mincic(){
                
            if(pos_cnt==1 || pos_cnt==0)
                    
            return 0;
                
            else if(pos_cnt==3){
                    
            double A1, B1, C1, A2, B2, C2;
                    
            int t0=posset[0], t1=posset[1], t2=posset[2];
                    A1
            =2*(point[t1].x-point[t0].x);
                    B1
            =2*(point[t1].y-point[t0].y);
                    C1
            =point[t1].x*point[t1].x-point[t0].x*point[t0].x+
                        point[t1].y
            *point[t1].y-point[t0].y*point[t0].y;
                    A2
            =2*(point[t2].x-point[t0].x);
                    B2
            =2*(point[t2].y-point[t0].y);
                    C2
            =point[t2].x*point[t2].x-point[t0].x*point[t0].x+
                        point[t2].y
            *point[t2].y-point[t0].y*point[t0].y;
                    maxcic.y
            =(C1*A2-C2*A1)/(A2*B1-A1*B2);
                    maxcic.x
            =(C1*B2-C2*B1)/(A1*B2-A2*B1);
                    radius
            =sqrt(dis_2(maxcic, point[t0]));
                }
                
            else if(pos_cnt==2){
                    maxcic.x
            =(point[posset[0]].x+point[posset[1]].x)/2;
                    maxcic.y
            =(point[posset[0]].y+point[posset[1]].y)/2;
                    radius
            =sqrt(dis_2(point[posset[0]], point[posset[1]]))/2;
                }
                
            return 1;
            }
            int mindisk(){
                
            if(set_cnt==0 || pos_cnt==3){
                    
            return cal_mincic();
                }
                
            int tt=curset[--set_cnt];
                
            int res=mindisk();
                set_cnt
            ++;
                
            if(!res || !in_cic(tt)){
                    set_cnt
            --;
                    posset[pos_cnt
            ++]=curset[set_cnt];
                    res
            =mindisk();
                    pos_cnt
            --;
                    curset[set_cnt
            ++]=curset[0];
                    curset[
            0]=tt;
                }
                
            return res;
            }
            int main(){
                freopen(
            "in2.txt""r", stdin);
                freopen(
            "radius.txt""w", stdout);
                
            int n;
                
            while(scanf("%d"&n)!=EOF){
                    
            if(n==0break;
                    
            int i;
                    
            for(i=0; i<n; i++)
                        scanf(
            "%lf %lf"&point[i].x, &point[i].y);
                        
            if(n==1){
                            maxcic.x
            =point[0].x;
                            maxcic.y
            =point[0].y;
                            radius
            =0;
                            printf(
            "%.2lf %.2lf %.2lf\n", maxcic.x, maxcic.y, radius);
                            
            continue;
                        }
                        set_cnt
            =n; pos_cnt=0;
                        
            for(i=0 ;i<n ;i++)  curset[i]=i;
                        mindisk();
                        printf(
            "%.2lf %.2lf %.2lf\n", maxcic.x, maxcic.y, radius);
                }

                
            return 0;
            }
            posted @ 2010-02-21 12:03 未央 閱讀(4249) | 評論 (5)編輯 收藏
             

            一個標準的Joseph問題,n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數。求勝利者的編號。
            我們知道第一個人(編號一定是m%n-1) 出列之后,剩下的n-1個人組成了一個新的約瑟夫環(以編號為k=m%n的人開始):
               k   k+1   k+2   ... n-2, n-1, 0, 1, 2, ... k-2
            并且從k開始報0。

            現在我們把他們的編號做一下轉換:
            k      --> 0
            k+1    --> 1
            k+2    --> 2
            ...
            ...
            k-2    --> n-2
            k-1    --> n-1

            變換后就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是最終的勝利者,那么根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎?!!變回去的公式很簡單,相信大家都可以推出來:x'=(x+k)%n

            如何知道(n-1)個人報數的問題的解?對,只要知道(n-2)個人的解就行了。(n-2)個人的解呢?當然是先求(n-3)的情況 ---- 這顯然就是一個倒推問題!好了,思路出來了,下面寫遞推公式:

            令f表示i個人玩游戲報m退出最后勝利者的編號,最后的結果自然是f[n]

            遞推公式
            f[1]=0;
            f[i]=(f[i-1]+m)%i;   (i>1)


            有了這個公式,我們要做的就是從1-n順序算出f的數值,最后結果是f[n]。因為實際生活中編號總是從1開始,我們輸出f[n]+1

            由于是逐級遞推,不需要保存每個f,程序也比較簡單:

             

            #include <stdio.h>
            int main ()
            {
            int n,m,i,s;
            while (scanf("%d %d",&n,&m)!=EOF)
            {
               
            if (n==0 && m==0return 0;
               s
            =0;
               
            for (i=2;i<=n;i++)
                s
            =(s+m)%i;
               printf (
            "%d %d %d\n",n,m,s+1);
            }
            return 0;
            }



             

            posted @ 2009-10-10 19:11 未央 閱讀(886) | 評論 (0)編輯 收藏
            僅列出標題
            共8頁: 1 2 3 4 5 6 7 8 
            CALENDER
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(6)

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜


            Powered By: 博客園
            模板提供滬江博客

            一本色道久久99一综合| 精品国产青草久久久久福利| 伊人热热久久原色播放www| 伊人色综合久久天天网| 无码国内精品久久人妻蜜桃| 波多野结衣中文字幕久久| 久久av高潮av无码av喷吹| 人妻久久久一区二区三区| 久久久久免费精品国产| 久久久久精品国产亚洲AV无码| 国产精品久久久久久久久| 午夜精品久久久久| 国产精品99久久精品| 久久婷婷色综合一区二区| 2020最新久久久视精品爱| 久久久久亚洲av综合波多野结衣 | 久久精品a亚洲国产v高清不卡| 亚洲伊人久久大香线蕉苏妲己| 麻豆精品久久久久久久99蜜桃| 亚洲精品国产成人99久久| 无码久久精品国产亚洲Av影片| 久久综合久久性久99毛片| 99久久精品久久久久久清纯| 国产成人精品综合久久久| 久久久久人妻精品一区三寸蜜桃 | 日韩精品久久久久久久电影蜜臀| 99热精品久久只有精品| 精品一区二区久久| 久久国产精品成人片免费| 亚洲AV无码久久精品成人 | 久久亚洲国产精品一区二区| 无码人妻久久一区二区三区免费丨| 伊人精品久久久久7777| 久久久久女教师免费一区| 国产激情久久久久影院| 99久久国产亚洲高清观看2024 | 成人久久综合网| 91精品国产综合久久婷婷| 狠狠久久亚洲欧美专区| 好久久免费视频高清| 日韩精品久久久久久|