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

            The Fourth Dimension Space

            枯葉北風(fēng)寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢(mèng)令

            #

            Qt學(xué)習(xí)之路(28): 坐標(biāo)變換

            經(jīng)過前面的章節(jié),我們已經(jīng)能夠畫出一些東西來,主要就是使用QPainter的相關(guān)函數(shù)。今天,我們要看的是QPainter的坐標(biāo)系統(tǒng)。
            同很多坐標(biāo)系統(tǒng)一樣,QPainter的默認(rèn)坐標(biāo)的原點(diǎn)(0, 0)位于屏幕的左上角,X軸正方向是水平向右,Y軸正方向是豎直向下。在這個(gè)坐標(biāo)系統(tǒng)中,每個(gè)像素占據(jù)1 x 1的空間。你可以把它想象成是一張坐標(biāo)值,其中的每個(gè)小格都是1個(gè)像素。這么說來,一個(gè)像素的中心實(shí)際上是一個(gè)“半像素坐標(biāo)系”,也就是說,像素(x, y)的中心位置其實(shí)是在(x + 0.5, y + 0.5)的位置上。因此,如果我們使用QPainter在(100, 100)處繪制一個(gè)像素,那么,這個(gè)像素的中心坐標(biāo)是(100.5, 100.5)。
             
            這種細(xì)微的差別在實(shí)際應(yīng)用中,特別是對(duì)坐標(biāo)要求精確的系統(tǒng)中是很重要的。首先,只有在禁止反走樣,也就是默認(rèn)狀態(tài)下,才會(huì)有這0.5像素的偏移;如果使用了反走樣,那么,我們畫(100, 100)位置的像素時(shí),QPainter會(huì)在(99.5, 99.5),(99.5, 100.5),(100.5, 99.5)和(100.5, 100.5)四個(gè)位置繪制一個(gè)亮色的像素,這么產(chǎn)生的效果就是在這四個(gè)像素的焦點(diǎn)處(100, 100)產(chǎn)生了一個(gè)像素。如果不需要這個(gè)特性,就需要將QPainter的坐標(biāo)系平移(0.5, 0.5)。
             
            這一特性在繪制直線、矩形等圖形的時(shí)候都會(huì)用到。下圖給出了在沒有反走樣技術(shù)時(shí),使用drawRect(2, 2, 6, 5)繪制一個(gè)矩形的示例。在No Pen的情況下,請(qǐng)注意矩形左上角的像素是在(2, 2),其中心位置是在(2.5, 2.5)的位置。然后注意下有不同的Pen的值的繪制樣式,在Pen寬為1時(shí),實(shí)際畫出的矩形的面積是7 x 6的(圖出自C++ GUI Programming with Qt4, 2nd Edition):
            在具有反走樣時(shí),使用drawRect(2, 2, 6, 5)的效果如下(圖出自C++ GUI Programming with Qt4, 2nd Edition):
            注意我們前面說過,通過平移QPainter的坐標(biāo)系來消除著0.5像素的差異。下面給出了使用drawRect(2.5, 2.5, 6, 5)在反走樣情況下繪制的矩形(圖出自C++ GUI Programming with Qt4, 2nd Edition):
            請(qǐng)對(duì)比與上圖的區(qū)別。
             
            在上述的QPainter的默認(rèn)坐標(biāo)系下,QPainter提供了視口(viewport)窗口(window)機(jī)制,用于繪制與繪制設(shè)備的大小和分辨率無關(guān)的圖形。視口和窗口是緊密的聯(lián)系在一起的,它們一般都是矩形。視口是由物理坐標(biāo)確定其大小,而窗口則是由邏輯坐標(biāo)決定。我們?cè)谑褂肣Painter進(jìn)行繪制時(shí),傳給QPainter的是邏輯坐標(biāo),然后,Qt的繪圖機(jī)制會(huì)使用坐標(biāo)變換將邏輯坐標(biāo)轉(zhuǎn)換成物理坐標(biāo)后進(jìn)行繪制。
             
            通常,視口和窗口的坐標(biāo)是一致的。比如一個(gè)600 x 800的widget(這是一個(gè)widget,或許是一個(gè)對(duì)話框,或許是一個(gè)面板等等),默認(rèn)情況下,視口和窗口都是一個(gè)320 x 200的矩形,原點(diǎn)都在(0, 0),此時(shí),視口和窗口的坐標(biāo)是相同的。
             
            注意到QPainter提供了setWindow()和setViewport()函數(shù),用來設(shè)置視口和窗口的矩形大小。比如,在上面所述的320 x 200的widget中,我們要設(shè)置一個(gè)從(-50, -50)到(+50, +50),原點(diǎn)在中心的矩形窗口,就可以使用
             
            painter.setWindow(-50, -50, 100, 100);
             
            其中,(-50, -50)指明了原點(diǎn),100, 100指明了窗口的長(zhǎng)和寬。這里的“指明原點(diǎn)”意思是,邏輯坐標(biāo)的(-50, -50)對(duì)應(yīng)著物理坐標(biāo)的(0, 0);“長(zhǎng)和寬”說明,邏輯坐標(biāo)系下的長(zhǎng)100,寬100實(shí)際上對(duì)應(yīng)物理坐標(biāo)系的長(zhǎng)320,寬200。
             
            或許你已經(jīng)發(fā)現(xiàn)這么一個(gè)好處,我們可以隨時(shí)改變window的范圍,而不改變底層物理坐標(biāo)系。這就是前面所說的,視口與窗口的作用:“繪制與繪制設(shè)備的大小和分辨率無關(guān)的圖形”,如下圖所示(圖出自C++ GUI Programming with Qt4, 2nd Edition):
             
             
            除了視口與窗口的變化,QPainter還提供了一個(gè)“世界坐標(biāo)系”,同樣也可以變換圖形。所不同的是,視口與窗口實(shí)際上是統(tǒng)一圖形在兩個(gè)坐標(biāo)系下的表達(dá),而世界坐標(biāo)系的變換是通過改變坐標(biāo)系來平移、縮放、旋轉(zhuǎn)、剪切圖形。為了清楚起見,我們來看下面一個(gè)例子:
             
            void PaintedWidget::paintEvent(QPaintEvent *event)
            {
                    QPainter painter(this);
                    QFont font("Courier", 24);
                    painter.setFont(font);
                    painter.drawText(50, 50, "Hello, world!");
                    QTransform transform;
                    transform.rotate(+45.0);
                    painter.setWorldTransform(transform);
                    painter.drawText(60, 60, "Hello, world!");
            }
             
            為了顯示方便,我在這里使用了QFont改變了字體。QPainter的drawText()函數(shù)提供了繪制文本的功能。它有幾種重載形式,我們使用了其中的一種,即制定文本的坐標(biāo)然后繪制。需要注意的是,這里的坐標(biāo)是文字左下角的坐標(biāo)(特別提醒這一點(diǎn),因?yàn)楹芏嗬L圖系統(tǒng),比如Java2D都是把左上角作為坐標(biāo)點(diǎn)的)!下面是運(yùn)行結(jié)果:
             
            我們使用QTransform做了一個(gè)rotate變換。這個(gè)變換就是旋轉(zhuǎn),而且是順時(shí)針旋轉(zhuǎn)45度。然后我們使用這個(gè)變換設(shè)置了QPainter的世界坐標(biāo)系,注意到QPainter是一個(gè)狀態(tài)機(jī),所以這種變換并不會(huì)改變之前的狀態(tài),因此只有第二個(gè)Hello, world!被旋轉(zhuǎn)了。確切的說,被旋轉(zhuǎn)的是坐標(biāo)系而不是這個(gè)文字!請(qǐng)注意體會(huì)這兩種說法的不同。

            本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處http://devbean.blog.51cto.com/448512/239585

            posted @ 2010-12-27 16:24 abilitytao 閱讀(851) | 評(píng)論 (0)編輯 收藏

            VS2010+QT4.7開發(fā)環(huán)境搭建

            雖然按照網(wǎng)上的教程安裝并編譯了QT4.7,但是安裝過QT插件之后還是無法正常配置。
            在option配置路徑的時(shí)候,2010顯示
            QT in the given path was built using minGW
            一個(gè)莫名其妙的錯(cuò)誤,都來查詢了一些國(guó)外的論壇發(fā)現(xiàn),這是插件的一個(gè)bug...我勒個(gè)去..
            解決方法如下:

            1.修改注冊(cè)表:
            HKEY_CURRENT_USER\Software\Trolltech\Versions\
            下增加一個(gè)子項(xiàng)
            qt201005(需要的名稱)
            子項(xiàng)下面增加一個(gè)數(shù)值 InstallDir,值就是你要配置的Qt路徑

            2.刪除文件
            刪除lib目錄下的
            libqtmain.a and libqtmaind.a 兩個(gè)文件。

            運(yùn)行第一個(gè)示例程序如下:



            使用QT建了個(gè)簡(jiǎn)單的項(xiàng)目,發(fā)現(xiàn)無法通過編譯,崩潰。。。后來發(fā)現(xiàn)路徑名中不能用中文!

            開發(fā)環(huán)境總算是搭建完成。

            posted @ 2010-12-25 22:59 abilitytao 閱讀(10631) | 評(píng)論 (8)編輯 收藏

            VS2010中集成 QT 遇到的一些問題

            在編譯QT代碼時(shí),會(huì)遇到一些問題,我遇到了兩個(gè)問題。
            然后繼續(xù)編譯N久之后,又出現(xiàn)了問題。。。

            編譯大概1個(gè)小時(shí)之后,出現(xiàn):

            01.api\qscriptextensionplugin.h(43): Error: Undefined interface 
            02.NMAKE : fatal error U1077: 'C:\Qt\2009.05\qt\bin\moc.exe' : return code '0x1' 
            03.Stop.  
            04.NMAKE : fatal error U1077: '"d:\Program Files\Microsoft Visual Studio 9.0\VC\BIN  
            05.\nmake.exe"' : return code '0x2'  
            06.Stop.  
            07.NMAKE : fatal error U1077: 'cd' : return code '0x2' 
            08.Stop. 
            api\qscriptextensionplugin.h(43): Error: Undefined interface
            NMAKE : fatal error U1077: 'C:\Qt\2009.05\qt\bin\moc.exe' : return code '0x1'
            Stop.
            NMAKE : fatal error U1077: '"d:\Program Files\Microsoft Visual Studio 9.0\VC\BIN
            \nmake.exe"' : return code '0x2'
            Stop.
            NMAKE : fatal error U1077: 'cd' : return code '0x2'
            Stop.

            以上是出錯(cuò)代碼,解決方法是將

            qt/src/script/tmp/moc/debug_shared/mocinclude.tmp
            qt/src/script/tmp/moc/release_shared/mocinclude.tmp

            刪除,然后繼續(xù)編譯。

            過了很長(zhǎng)時(shí)間之后,在編譯webkit部分的代碼時(shí),會(huì)發(fā)生錯(cuò)誤,系統(tǒng)會(huì)停止編譯
            D:\tools\Qt\2010.05\qt\src\3rdparty\webkit\WebCore\tmp\moc\debug_shared\moc_Sock
            etStreamHandlePrivate.cpp(97) : error C2065: “QSslError”: 未聲明的標(biāo)識(shí)符
            D:\tools\Qt\2010.05\qt\src\3rdparty\webkit\WebCore\tmp\moc\debug_shared\moc_Sock
            etStreamHandlePrivate.cpp(97) : error C3861: “socketSslErrors”: 找不到標(biāo)識(shí)符
            正在生成代碼...
            NMAKE : fatal error U1077: “"D:\tools\Microsoft Visual Studio 10.0\VC\BIN\cl.EX
            E"”: 返回代碼“0x2”
            Stop.
            NMAKE : fatal error U1077: “"D:\tools\Microsoft Visual Studio 10.0\VC\BIN\nmake
            .exe"”: 返回代碼“0x2”
            Stop.
            NMAKE : fatal error U1077: “cd”: 返回代碼“0x2”
            Stop.

            解決方法是將

            qt\src\3rdparty\webkit\WebCore\tmp\moc\debug_shared\mocinclude.tmp
            qt\src\3rdparty\webkit\WebCore\tmp\moc\release_shared\mocinclude.tmp
            刪除之后可以繼續(xù)編譯(重新執(zhí)行nmake命令)

            posted @ 2010-12-25 08:03 abilitytao 閱讀(3524) | 評(píng)論 (3)編輯 收藏

            詳解如何配置Qt使用VS2010進(jìn)行開發(fā)

            Qt – 一個(gè)跨平臺(tái)應(yīng)用程序和UI開發(fā)框架

              它包括跨平臺(tái)類庫、集成開發(fā)工具和跨平臺(tái) IDE。使用 Qt 您只需一次性開發(fā)應(yīng)用程序,無須重新編寫源代碼,便可跨不同桌面和嵌入式操作系統(tǒng)部署這些應(yīng)用程序。

            Qt是什么東西?
             

              Qt 主要是由 諾基亞 開發(fā)和維護(hù)的。Qt通過開源授權(quán)(LGPL 和 GPL)以及商業(yè)授權(quán)的方式對(duì) Qt 進(jìn)行授權(quán)。在Linux下Qt可是大名鼎鼎,Linux的KDE圖形界面就是基于Qt開發(fā)的。

              Qt的最大好處是跨平臺(tái),可以看到上圖,Qt可以支持windows,Mac os,linux,embedded linux, wince/mobile,symbian,諾基亞最新的Megoo那也是不在話下了,由于公司最近有些項(xiàng)目要求跨平臺(tái)的支持,原來的GIS引擎是基于Windows開發(fā)的,雖然沒有用MFC,但是由于繪圖引擎這塊使用的GDI+,所以跨平臺(tái)是非常困難的。所以為了支持跨平臺(tái)以及在可預(yù)見的將來的跨平臺(tái)的需求,決定將繪圖引擎這塊在Qt的基礎(chǔ)上進(jìn)行重構(gòu),并使用Qt開發(fā)一套基于QtGis引擎的地圖項(xiàng)目管理應(yīng)用程序。

              我在博客中將會(huì)同步將開發(fā)這個(gè)應(yīng)用程序的步驟展示出來,希望能通過這個(gè)系列的博客,來展示Qt開發(fā)應(yīng)用程序的便利性以及展示我們公司GIS引擎的強(qiáng)大能力。應(yīng)用程序的源代碼將會(huì)同步放在每篇教程內(nèi)提供下載。Gis引擎將通過提供SDK的方式方便大家學(xué)習(xí)及開發(fā)。

              第一篇. 配置Qt的windows開發(fā)環(huán)境,并通過Visual Studio 2010進(jìn)行開發(fā)。

              1. 下載Qt的安裝包和Visual Studio 2010的Qt插件,大家可以到下面的地址進(jìn)行下載(下面的下載都是基于Windows的,如果是其他環(huán)境的操作系統(tǒng)可以到這里下載).

              Qt SDK: http://qt.nokia.com/downloads/sdk-windows-cpp

              Visual Studio 2010開發(fā)插件: http://qt.nokia.com/downloads/visual-studio-add-in

              2. 安裝Qt SDK

              安裝其實(shí)很簡(jiǎn)單了,基本上一路回車即可,主要是要注意下Qt的安裝路徑最好安裝在全英文路徑而且中間沒有空格, 安裝好后,可以運(yùn)行開始菜單里面的Qt Demo,直觀感受下Qt的強(qiáng)大功能!

            Qt是什么東西?  

            界面非常炫酷

            1
             

              3. 安裝Qt的VS開發(fā)插件

              同安裝Qt SDK一樣,一路上回車即可,安裝后在Visual Studio 2010上新增一菜單Qt,如圖所示

            安裝Qt的VS開發(fā)插件
             

              4. 編譯Qt

              Qt默認(rèn)使用mingw進(jìn)行編譯,如果要使用Visual Studio 2010開發(fā),需要將Qt重新編譯。

              進(jìn)入開始菜單Microsoft Visual Studio 2010,Visual Studio Tools,Visual Studio Command Prompt (2010),需要注意的是,這里面必須是使用Visual Studio Command Prompt (2010),不能使用CMD的Dos窗口

            安裝Qt的VS開發(fā)插件
             

              進(jìn)入Qt的安裝目錄后,執(zhí)行CD Qt,進(jìn)入Qt的根目錄

            安裝Qt的VS開發(fā)插件
             

              運(yùn)行命令 configure -platform win32-msvc2010,o(選擇opensource模式)回車,Y(同意license)回車

            安裝Qt的VS開發(fā)插件 
            接著就會(huì)自動(dòng)配置Qt的編譯環(huán)境,等配置結(jié)束后,運(yùn)行nmake,回車,Qt就會(huì)開始漫長(zhǎng)的編譯過程,這段時(shí)間非常長(zhǎng),需要4個(gè)小時(shí)以上,大家可以在晚上睡覺的時(shí)候進(jìn)行編譯。

            1
             

              5.配置Visual Studio 2010的Qt開發(fā)環(huán)境(Visual Studio 2010最好是英文版本,Qt對(duì)Visual Studio 2010中文版本可能支持的不好)

              等Qt編譯好后就可以配置Visual Studio 2010的開發(fā)環(huán)境了,進(jìn)入Visual Studio 2010,選擇Qt菜單,Qt Option,進(jìn)入下圖界面

            1
             

              點(diǎn)擊Add,添加Qt的安裝目錄,并取名字,我這里使用Qt的發(fā)現(xiàn)版本最為名稱,選擇OK后即可。

              6.新建或者導(dǎo)入Qt項(xiàng)目

              可以通過在Visual Studio 2010新建一個(gè)Qt項(xiàng)目

            1
             

              導(dǎo)入Qt的Pro項(xiàng)目Pro是Qt自帶編譯器Qt Creator的項(xiàng)目工程文件,如果想使用Visual Studio 2010開發(fā)則需要將原有項(xiàng)目的Pro導(dǎo)入到Visual Studio 2010的項(xiàng)目文件中,可以使用菜單Qt-Open

            1
             

              這樣我們的Qt開發(fā)環(huán)境就搭建好了,大家可以將Qt目錄下的Example和Demo下的例子的運(yùn)行看一遍,體驗(yàn)下Qt的強(qiáng)大和便捷,Enjoy!

            文章轉(zhuǎn)自:http://tech.it168.com/a2010/1217/1139/000001139431.shtml

            posted @ 2010-12-24 11:53 abilitytao 閱讀(2244) | 評(píng)論 (0)編輯 收藏

            Qt 深入淺出

            Qt 深入淺出

            經(jīng)常有人問哪里有學(xué)習(xí)Qt的資料,Qt的教程,怎么才能入門等等,或者抱怨說中文的信息太少。其實(shí)網(wǎng)上有很多關(guān)于Qt的學(xué)習(xí)資料,今天在這里總結(jié)一下,希望各位想學(xué)習(xí)Qt的同學(xué),各取所需,早日從入門到精通!

            Part 1: 新手上路

            Qt 官方學(xué)習(xí)教程

            Qt 官方學(xué)習(xí)教程包含了3部分,包括如何學(xué)習(xí)Qt,如何逐步創(chuàng)建一個(gè)地址簿應(yīng)用以及如何編寫Qt Widget。教程由淺入深,Qt初學(xué)者必讀
            如何學(xué)習(xí) Qt
            我們假定您已了解 C++, 并將用于 Qt 開發(fā)。有關(guān)將 Qt 與其他編程語言一起使用的更多信息,請(qǐng)參見 Qt 網(wǎng)站。。。。。
            地址簿教程
            本教程介紹了使用 Qt 跨平臺(tái)框架的 GUI 編程。在學(xué)習(xí)過程中,我們將了解部分 Qt 基本技術(shù),如Widget 和布局管理器,容器類,信號(hào)和槽,輸入和輸出設(shè)備等。。
            Widgets 教程
            Widget 是使用 Qt 編寫的圖形用戶界面 (GUI) 應(yīng)用程序的基本生成塊。每個(gè) GUI 組件,如按鈕、標(biāo)簽或文本編輯器,都是一個(gè) widget ,并可以放置在現(xiàn)有的用戶界面中或作為單獨(dú)的窗口顯示。每種類型的組件都是由 QWidget 的特殊子類提供的,而 QWidget 自身又是 QObject 的子類。

            Qt 學(xué)習(xí)之路:

            來自于FinderCheng的Qt 學(xué)習(xí)之路。簡(jiǎn)介:在本系列文章中,F(xiàn)inderCheng使用Qt4進(jìn)行C++ GUI的開發(fā)。我是參照著《C++ GUI Programming with Qt4》一書進(jìn)行學(xué)習(xí)的。其實(shí),我也只是初學(xué)Qt4,在這里將這個(gè)學(xué)習(xí)筆記記下來,希望能夠方便更多的朋友學(xué)習(xí)Qt4。我是一個(gè)Java程序員,感覺 Qt4的一些命名規(guī)范以及約束同Java有異曲同工之妙,因而從Java遷移到Qt4似乎困難不大。不過,這也主要是因?yàn)镼t4良好的設(shè)計(jì)等等。
            Qt學(xué)習(xí)之路(1):前言
            Qt是一個(gè)著名的C++庫——或許并不能說這只是一個(gè)GUI庫,因?yàn)镼t十分龐大,并不僅僅是GUI。使用Qt,在一定程序上你獲得的是一個(gè)“一站式”的服務(wù):不再需要研究STL,不再需要C++的 ,因?yàn)镼t有它自己的QString等等。或許這樣說很偏激,但Qt確實(shí)是一個(gè) “偉大的C++庫”。
            Qt學(xué)習(xí)之路(2):Hello, world!
            任何編程技術(shù)的學(xué)習(xí)第一課基本上都會(huì)是Hello, world!,我也不想故意打破這個(gè)慣例——照理說,應(yīng)該首先回顧一下Qt的歷史,不過即使不說這些也并無大礙。
            Qt學(xué)習(xí)之路(3):Hello, world!(續(xù))
            下面來逐行解釋一下前面的那個(gè)Hello, world!程序,盡管很簡(jiǎn)單,但卻可以對(duì)Qt程序的結(jié)構(gòu)有一個(gè)清楚的認(rèn)識(shí)。現(xiàn)在再把代碼貼過來:
            Qt學(xué)習(xí)之路(4):初探信號(hào)槽
            所謂信號(hào)槽,簡(jiǎn)單來說,就像是插銷一樣:一個(gè)插頭和一個(gè)插座。怎么說呢?當(dāng)某種事件發(fā)生之后,比如,點(diǎn)擊了一下鼠標(biāo),或者按了某個(gè)按鍵,這時(shí),這個(gè)組件就 會(huì)發(fā)出一個(gè)信號(hào)。就像是廣播一樣,如果有了事件,它就漫天發(fā)聲。這時(shí),如果有一個(gè)槽,正好對(duì)應(yīng)上這個(gè)信號(hào),那么,這個(gè)槽的函數(shù)就會(huì)執(zhí)行,也就是回調(diào)。就像 廣播發(fā)出了,如果你感興趣,那么你就會(huì)對(duì)這個(gè)廣播有反應(yīng)。干巴巴的解釋很無力,還是看代碼:
            Qt學(xué)習(xí)之路(5):組件布局
            顧名思義,絕對(duì)定位就是使用最原始的定位方法,給出這個(gè)組件的坐標(biāo)和長(zhǎng)寬值。這樣,Qt就知道該把組件放在哪里,以及怎么設(shè)置組件的大小了。但是這樣做的 一個(gè)問題是,如果用戶改變了窗口大小,比如點(diǎn)擊了最大化或者拖動(dòng)窗口邊緣,這時(shí),你就要自己編寫相應(yīng)的函數(shù)來響應(yīng)這些變化,以避免那些組件還只是靜靜地呆 在一個(gè)角落。或者,更簡(jiǎn)單的方法是直接禁止用戶改變大小。
            Qt學(xué)習(xí)之路(6): API文檔的使用
            今天來說一下有關(guān)Qt API文檔的使用。因?yàn)镼t有一個(gè)商業(yè)版本,因此它的文檔十分健全,而且編寫良好。對(duì)于開發(fā)者來說,查看文檔時(shí)開發(fā)必修課之一——沒有人能夠記住那么多API的使用!
            Qt學(xué)習(xí)之路(7): 創(chuàng)建一個(gè)對(duì)話框(上)
            首先說明一點(diǎn),在C++ GUI Programming with Qt4, 2nd中,這一章連同以后的若干章一起,完成了一個(gè)比較完整的程序——一個(gè)模仿Excel的電子表格。不過這個(gè)程序挺大的,而且書中也沒有給出完整的源代 碼,只是分段分段的——我不喜歡這個(gè)樣子,我想要看到我寫出來的是什么東西,這是最主要的,而不是慢慢的過上幾章的內(nèi)容才能看到自己的作品。
            Qt學(xué)習(xí)之路(8): 創(chuàng)建一個(gè)對(duì)話框(下)
            Qt是分模塊的,記得我們建工程的時(shí)候就會(huì)問你,使用哪些模塊?QtCore?QtGui?QtXml?等等。這里,我們引入QtGui,它包括了 QtCore和QtGui模塊。不過,這并不是最好的做法,因?yàn)镼tGui文件很大,包括了GUI的所有組件,但是很多組件我們根本是用不到的——就像 Swing的import,
            Qt學(xué)習(xí)之路(9):深入了解信號(hào)槽
            函數(shù)和 普通的C++成員函數(shù)沒有很大的區(qū)別。它們也可以使virtual的;可以被重寫;可以使public、protected或者private 的;可以由其它的C++函數(shù)調(diào)用;參數(shù)可以是任何類型的。如果要說區(qū)別,就是,槽函數(shù)可以和一個(gè)信號(hào)相連接,當(dāng)這個(gè)信號(hào)發(fā)生時(shí),它可以被自動(dòng)調(diào)用。
            Qt學(xué)習(xí)之路(10): Meta-Object系統(tǒng)
            前面說過,Qt使用的是自己的預(yù)編譯器,它提供了對(duì)C++的一種擴(kuò)展。利用Qt的信號(hào)槽機(jī)制,就可以把彼此獨(dú)立的模塊相互連接起來,不需要實(shí)現(xiàn)知道模塊的任何細(xì)節(jié)。為了達(dá)到這個(gè)目的,Qt提出了一個(gè)Meta-Object系統(tǒng)。它提供了兩個(gè)關(guān)鍵的作用:信號(hào)槽和內(nèi)省。
            Qt學(xué)習(xí)之路(11): MainWindow
            盡管Qt提供了很方便的快速開發(fā)工具QtDesigner用來拖放界面元素,但是現(xiàn)在我并不打算去介紹這個(gè)工具,原因之一在于我們的學(xué)習(xí)大體上是依靠手工編寫代碼,過早的接觸設(shè)計(jì)工具并不能讓我們對(duì)Qt的概念突飛猛進(jìn)
            Qt學(xué)習(xí)之路(12): 菜單和工具條
            在前面的QMainWindow的基礎(chǔ)之上,我們開始著手建造我們的應(yīng)用程序。雖然現(xiàn)在已經(jīng)有一個(gè)框架,但是,確切地說我們還一行代碼沒有寫呢!下面的工作就不那么簡(jiǎn)單了!在這一節(jié)里面,我們要為我們的框架添加菜單和工具條。
            Qt學(xué)習(xí)之路(13): 菜單和工具條(續(xù))
            前面一節(jié)我們已經(jīng)把QAction添加到菜單和工具條上面。現(xiàn)在我們要添加一些圖片美化一下,然后把信號(hào)槽加上,這樣,我們的action就可以相應(yīng)啦!
            Qt學(xué)習(xí)之路(14): 狀態(tài)欄
            今天的內(nèi)容主要還是繼續(xù)完善前面的那個(gè)程序。我們要為我們的程序加上一個(gè)狀態(tài)欄。
            Qt學(xué)習(xí)之路(15): Qt標(biāo)準(zhǔn)對(duì)話框之QFileDialog
            下面還是按照我們的進(jìn)度,從Qt的標(biāo)準(zhǔn)對(duì)話框開始說起。所謂標(biāo)準(zhǔn)對(duì)話框,其實(shí)就是Qt內(nèi)置的一些對(duì)話框,比如文件選擇、顏色選擇等等。今天首先介紹一下QFileDialog。
            Qt學(xué)習(xí)之路(16): Qt標(biāo)準(zhǔn)對(duì)話框之QColorDialog
            繼續(xù)來說Qt的標(biāo)準(zhǔn)對(duì)話框,這次說說QColorDialog。這是Qt提供的顏色選擇對(duì)話框。
            Qt學(xué)習(xí)之路(tip): parent參數(shù)
            程序?qū)懙亩嗔耍銜?huì)發(fā)現(xiàn)幾乎所有的Qt類的構(gòu)造函數(shù)都會(huì)有一個(gè)parent參數(shù)。這個(gè)參數(shù)通常是QObject* 或者是 QWidget* 類型的。
            Qt學(xué)習(xí)之路(17): Qt標(biāo)準(zhǔn)對(duì)話框之QMessageBox
            這次來說一下QMessageBox以及類似的幾種對(duì)話框。其實(shí),我們已經(jīng)用過QMessageBox了,就在之前的幾個(gè)程序中。
            Qt學(xué)習(xí)之路(18): Qt標(biāo)準(zhǔn)對(duì)話框之QInputDialog
            這是Qt標(biāo)準(zhǔn)對(duì)話框的最后一部分。正如同其名字顯示的一樣,QInputDialog用于接收用戶的輸入。

            Part 2: 進(jìn)階學(xué)習(xí)

            Qt4 學(xué)習(xí)筆記

            Qt4 學(xué)習(xí)筆記(繁體中文) 簡(jiǎn)體中文(Google 翻譯)
            來自臺(tái)灣的caterpillar,Qt4 學(xué)習(xí)筆記由淺入深,分門別類的介紹了Qt4 中的許多特性,如事件處理,常用圖型元件,常用 API,檔案處理,拖放(Drag & Drop)與剪貼,多執(zhí)行緒(Multithreading)很多內(nèi)容,是進(jìn)一步學(xué)習(xí)Qt的極好教程

            Qt 開發(fā)實(shí)例

            Code Project:創(chuàng)建一個(gè)媒體播放器
            這里我們將會(huì)構(gòu)建所能想到的最簡(jiǎn)單和最直觀的音樂播放器,給用戶提供另一個(gè)選擇。 從蘋果的新款iPod Shuffle吸取一些靈感,只提供最基本的控制功能。
            Code Project:創(chuàng)建一個(gè)FFMPEG前端
            如果說有一種工具非常需要GUI,那就是FFMPEG。FFMPEG是一個(gè)十分優(yōu)秀的命令行應(yīng)用程序,它可以將視頻和電影文件從一種格式轉(zhuǎn)換為另一種格式。
            Code Project:創(chuàng)建一個(gè)Qt RSS閱讀器
            這個(gè)應(yīng)用程序就是一個(gè)RSS閱讀器,它允許用戶添加自己的種子,列出該種子上的內(nèi)容,然后讓用戶在主應(yīng)用程序自帶的一個(gè)瀏覽器窗口中閱讀這些內(nèi)容。

            Qt Graphics View詳解

            來自清源游民的Qt筆記,詳解介紹了Qt Graphics View中各個(gè)對(duì)象的概念和使用方法。對(duì)于Graphics View的學(xué)習(xí)大有裨益。
            Qt 的 Graphics View 框架(一)
            Graphics View提供了一個(gè)界面,它既可以管理大數(shù)量的定制2D graphical items,又可與它們交互,有一個(gè)view widget可以把這些項(xiàng)繪制出來,并支持旋轉(zhuǎn)與縮放。
            Qt 的 Graphics View 框架(二)
            Graphics View基于笛卡爾坐標(biāo)系。item在場(chǎng)景中的位置與幾何形狀通過x,y坐標(biāo)表示。當(dāng)使用未經(jīng)變形的視圖來觀察場(chǎng)景時(shí),場(chǎng)景中的一個(gè)單位等于屏幕上的一個(gè)像素。
            Qt 的 Graphics View 框架(三)
            QGraphicsView通過QGraphicsView::setMatrix()支持同QPainter一樣的仿射變換,通過對(duì)一個(gè)視圖應(yīng)用變換,你可以很容易地支持普通的導(dǎo)航特性如縮放與旋轉(zhuǎn)。

            關(guān)于Qt編程的書籍

            接下來當(dāng)你學(xué)習(xí)了上面的相關(guān)內(nèi)容后,就可以開始閱讀Qt編程的書籍進(jìn)行系統(tǒng)的學(xué)習(xí)了。當(dāng)然,書也不一定要從頭到尾閱讀一遍,用時(shí)拿出來學(xué)習(xí)和參考也很不錯(cuò)
            C++ GUI Programming with Qt 4 (2nd Edition) (英文版)
            C++ GUI Qt4 編程中文版China-pub購(gòu)買地址

             

            本書詳細(xì)講述了用最新的Qt版本進(jìn)行圖形用戶界面應(yīng)用程序開發(fā)的各個(gè)方面。前5章主要涉及Qt基礎(chǔ)知識(shí),后兩個(gè)部分主要講解Qt的中高級(jí)編程,包括布局管 理、事件處理、二維/三維圖形、拖放、項(xiàng)視圖類、容器類、輸入/輸出、數(shù)據(jù)庫、多線程、網(wǎng)絡(luò)、XML、國(guó)際化、嵌入式編程等內(nèi)容。對(duì)于本書講授的大量 Qt4編程原理和實(shí)踐,都可以輕易將其應(yīng)用于Qt4.4、Qt4.5以及后續(xù)版本的Qt程序開發(fā)過程中。

            C++ GUI Programming with Qt 4 (英文第一版)
            The Book of Qt 4 - The Art of Building Qt Applications

            Part3:深入理解

            Inside Qt 系列

            QKevin所著,通過剖析Qt源代碼,深入淺出的解釋了Qt中的許多機(jī)制,了解Qt內(nèi)部是如何 work 的。著實(shí)為想深入了解Qt的開發(fā)者提供了很好的學(xué)習(xí)機(jī)會(huì)。如果你已經(jīng)學(xué)習(xí)了上面的內(nèi)容并且熟練掌握Qt編程,那么大力推薦這一系列文章!
            Inside Qt Series: 序
            寫了這么多年的程序,除了留下很多 code (其中有很多是garbage)之外,再?zèng)]有其它東西,或許我該寫點(diǎn)兒什么了,寫一些關(guān)于我的工作的東西,自己所了解的技術(shù),也把自己在工作過程中新學(xué)習(xí)的一些東西放在這兒,就算是為了以后做一個(gè)參考。
            Inside Qt Series (一):Let’s go, Starting From the QObject
            QObject 這個(gè) class 是 QT 對(duì)象模型的核心,絕大部分的 QT 類都是從這個(gè)類繼承而來。這個(gè)模型的中心特征就是一個(gè)叫做信號(hào)和槽(signal and slot)的機(jī)制來實(shí)現(xiàn)對(duì)象間的通訊,
            Inside Qt Series (二):對(duì)象數(shù)據(jù)存儲(chǔ)(A)
            我們知道,在C++中,幾乎每一個(gè)類(class)中都需要有一些類的成員變量(class member variable),在通常情況下的做法如下:
            Inside Qt Series (三):對(duì)象數(shù)據(jù)存儲(chǔ)(B)
            在 QT 4.4 中,類成員變量定義方法的出發(fā)點(diǎn)沒有變化,只是在具體的實(shí)現(xiàn)手段上發(fā)生了非常大的變化,下面具體來看。
            Inside Qt Series (四):對(duì)象數(shù)據(jù)存儲(chǔ)(C)
            接上節(jié),讓我們來看看這個(gè) QObjectPrivate 和 QObject 是如何關(guān)聯(lián)在一起的。
            Inside Qt Series (五):元對(duì)象系統(tǒng)(Meta-Object System)
            從本節(jié)開始,我們講解 QT Meta-Object System 的功能,以及實(shí)現(xiàn)。在使用 Qt 開發(fā)的過程中,大量的使用了 signal 和 slot. 比如,響應(yīng)一個(gè) button 的 click 事件,我們一般都寫如下的代碼:
            Inside Qt Series (六):元對(duì)象編譯器 – Meta Object Compiler (moc)
            元對(duì)象編譯器用來處理QT 的C++擴(kuò)展,moc 分析C++源文件,如果它發(fā)現(xiàn)在一個(gè)頭文件(header file)中包含Q_OBJECT 宏定義,然后動(dòng)態(tài)的生成另外一個(gè)C++源文件
            Inside Qt Series (七):Signal & Slot
            信號(hào)和 槽是用來在對(duì)象間通訊的方法,當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,signal會(huì)被 emit 出來,slot 調(diào)用是用來響應(yīng)相應(yīng)的 signal 的。
            Inside Qt Series (八):Meta Object Class overview
            前面我們介紹了 Meta Object 的基本功能,和它支持的最重要的特性之一:Signal & Slot的基本功能。現(xiàn)在讓我們來進(jìn)入 Meta Object 的內(nèi)部,看看它是如何支持這些能力的。
            Inside Qt Series (九):QMetaObject class data members
            我們來看一下QMetaObject的定義,我們先看一下QMetaObject對(duì)象中包含的成員數(shù)據(jù)。
            Inside Qt Series (十):connect,幕后的故事
            我們都知道,把一個(gè)signal和slot連接起來,需要使用QObject類的connect方法,它的作用就是把一個(gè)object的signal和另外一個(gè)object的slot連接起來,以達(dá)到對(duì)象間通訊的目的。
            Inside Qt Series (十一):emit,幕后的故事
            當(dāng)我們寫下一下emit signal代碼的時(shí)候,與這個(gè)signal相連接的slot就會(huì)被調(diào)用,那么這個(gè)調(diào)用是如何發(fā)生的呢?讓我們來逐一解開其中的謎團(tuán)。
            Inside Qt Series (十二):Qt對(duì)象之間的父子關(guān)系
            很多C/C++初學(xué)者常犯的一個(gè)錯(cuò)誤就是,使用malloc、new分配了一塊內(nèi)存卻忘記釋放,導(dǎo)致內(nèi)存泄漏。Qt的對(duì)象模型提供了一種Qt對(duì)象之間的父 子關(guān)系..
            Inside Qt Series (十三):Qt/e體系結(jié)構(gòu)概述
            首先,讓我們來看看Qt/e的系統(tǒng)結(jié)構(gòu)介紹:Qt for destop Linux 和 Qt for Embedded Linux 最大的區(qū)別就在于他們所依賴的底層顯示基礎(chǔ)的不同,這也就導(dǎo)致了他們?cè)隗w系結(jié)構(gòu)上的差異。
            Inside Qt Series (十四):Qt/e輸入法程序設(shè)計(jì)指南
            本輸入法設(shè)計(jì)指南針對(duì)Qt for Embedded Linux 4.5.1,并且以中文輸入法為例做說明,并且本文只是側(cè)重于說明Qt/Embedded對(duì)輸入法的支持接口,
            Inside Qt Series (十五):Qt/e 輸入法,How it works?
            前面我們介紹了Qte輸入法的基本設(shè)計(jì)思路,以及一個(gè)最簡(jiǎn)單的例子,那么,Qte的輸入法是如何工作的呢?本節(jié)我們就來看一下Qte的源代碼,一起來解開這個(gè)謎團(tuán)。

            Part 4:移動(dòng)平臺(tái)開發(fā)

            Symbian S60

            Forum Nokia Qt for Mobile Developers training
            09年10月21至23號(hào),某人參加了諾基亞在北航舉辦的Qt開發(fā)培訓(xùn)。培訓(xùn)師是來自于芬蘭的Niemi Petri,英語比好多芬蘭人要好,課程講得深入淺出,很好理解。課程內(nèi)容涉及Qt的基本知識(shí),以及Qt在S60和Maemo上的開發(fā)。下面是培訓(xùn)的PPT和作業(yè)以及演示代碼。
            第一天培訓(xùn)ppt:Qt for mobile – Day 1
            第二天培訓(xùn)ppt:Qt for mobile – Day 2
            第三天培訓(xùn)ppt:Qt for mobile – Day 3
            第一天練習(xí):Exercise – Day 1
            第二天演示:Demo – Day 2

            Maemo

            轉(zhuǎn)自:http://www.qteverywhere.com/learnqt

            posted @ 2010-12-21 23:11 abilitytao 閱讀(2167) | 評(píng)論 (0)編輯 收藏

            Qt 入門

            為了做畢設(shè),決定速學(xué)Qt.今天簡(jiǎn)單地實(shí)現(xiàn)了下Qt教程中的簡(jiǎn)單程序,Qt + c++ 才是王道啊。

            posted @ 2010-12-18 23:45 abilitytao 閱讀(369) | 評(píng)論 (0)編輯 收藏

            Levenberg-Marquardt 算法快速入門教程(轉(zhuǎn)載)

            什么是最優(yōu)化,可分為幾大類?
            答:Levenberg-Marquardt算法是最優(yōu)化算法中的一種。最優(yōu)化是尋找使得函數(shù)值最小的參數(shù)向量。它的應(yīng)用領(lǐng)域非常廣泛,如:經(jīng)濟(jì)學(xué)、管理優(yōu)化、網(wǎng)絡(luò)分析、最優(yōu)設(shè)計(jì)、機(jī)械或電子設(shè)計(jì)等等。
            根據(jù)求導(dǎo)數(shù)的方法,可分為2大類。第一類,若f具有解析函數(shù)形式,知道x后求導(dǎo)數(shù)速度快。第二類,使用數(shù)值差分來求導(dǎo)數(shù)。
            根據(jù) 使用模型不同,分為非約束最優(yōu)化、約束最優(yōu)化、最小二乘最優(yōu)化。

            什么是Levenberg-Marquardt算法?
            它是使用最廣泛的非線性最小二乘算法,中文為列文伯格-馬夸爾特法。它是利用梯度求最大(小)值的算法,形象的說,屬于爬山法的一種。它同時(shí)具有梯度 法和牛頓法的優(yōu)點(diǎn)。當(dāng)λ很小時(shí),步長(zhǎng)等于牛頓法步長(zhǎng),當(dāng)λ很大時(shí),步長(zhǎng)約等于梯度下降法的步長(zhǎng)。在作者的科研項(xiàng)目中曾經(jīng)使用過多次。圖1顯示了算法從起 點(diǎn),根據(jù)函數(shù)梯度信息,不斷爬升直到最高點(diǎn)(最大值)的迭代過程。共進(jìn)行了12步。(備注:圖1中綠色線條為迭代過程)。

            Levenberg-Marquardt教程


            1 LM算法迭代過程形象描述

            1中,算法從山腳開始不斷迭代。可以看到,它的尋優(yōu)速度是比較快的,在山腰部分直接利用梯度大幅度提升(參見后文例子程序中lamda較小時(shí)),快到山頂時(shí)經(jīng)過幾次嘗試(lamda較大時(shí)),最后達(dá)到頂峰(最大值點(diǎn)),算法終止。

             

            如何快速學(xué)習(xí)LM算法?

            學(xué) 習(xí)該算法的主要困難是入門難。 要么國(guó)內(nèi)中文教材太艱澀難懂,要么太抽象例子太少。目前,我看到的最好的英文入門教程是K. Madsen等人的《Methods for non-linear least squares problems》本來想把原文翻譯一下,貼到這里。請(qǐng)讓我偷個(gè)懶吧。能找到這里的讀者,應(yīng)該都是E文好手,我翻譯得不清不楚,反而事倍功半了。

            可在 下面的鏈接中找到
            http://www2.imm.dtu.dk/pubdb/public/publications.php? year=&pubtype=7&pubsubtype=&section=1&cmd=full_view&lastndays=&order=author
            或者直接下載pdf原文:
            http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf


            例子程序(MATLAB源程序)
            本程序不到100行,實(shí)現(xiàn)了 求雅克比矩陣的解析解,Levenberg-Marquardt最優(yōu)化迭代,演示了如何求解擬合問題。采用《數(shù)學(xué)試驗(yàn)》(第二版)中p1902來演示。在MATLAB中可直接運(yùn)行得到最優(yōu)解。

            % 計(jì)算函數(shù)f的雅克比矩陣,是解析式

            syms a b y x real;

            f=a*exp(-b*x);

            Jsym=jacobian(f,[a b])

             

             

            % 擬合用數(shù)據(jù)。參見《數(shù)學(xué)試驗(yàn)》,p190,例2

            data_1=[0.25 0.5 1 1.5 2 3 4 6 8];

            obs_1=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];

             

            % 2. LM算法

            % 初始猜測(cè)s

            a0=10; b0=0.5;

            y_init = a0*exp(-b0*data_1);

            % 數(shù)據(jù)個(gè)數(shù)

            Ndata=length(obs_1);

            % 參數(shù)維數(shù)

            Nparams=2;

            % 迭代最大次數(shù)

            n_iters=50;

            % LM算法的阻尼系數(shù)初值

            lamda=0.01;

             

            % step1: 變量賦值

            updateJ=1;

            a_est=a0;

            b_est=b0;

             

            % step2: 迭代

            for it=1:n_iters

                if updateJ==1

                    % 根據(jù)當(dāng)前估計(jì)值,計(jì)算雅克比矩陣

                    J=zeros(Ndata,Nparams);

                    for i=1:length(data_1)

                        J(i,:)=[exp(-b_est*data_1(i)) -a_est*data_1(i)*exp(-b_est*data_1(i))];

                    end

                    % 根據(jù)當(dāng)前參數(shù),得到函數(shù)值

                    y_est = a_est*exp(-b_est*data_1);

                    % 計(jì)算誤差

                    d=obs_1-y_est;

                    % 計(jì)算(擬)海塞矩陣

                    H=J'*J;

                    % 若是第一次迭代,計(jì)算誤差

                    if it==1

                        e=dot(d,d);

                    end

                end

             

                % 根據(jù)阻尼系數(shù)lamda混合得到H矩陣

                H_lm=H+(lamda*eye(Nparams,Nparams));

                % 計(jì)算步長(zhǎng)dp,并根據(jù)步長(zhǎng)計(jì)算新的可能的\參數(shù)估計(jì)值

                dp=inv(H_lm)*(J'*d(:));

                g = J'*d(:);

                a_lm=a_est+dp(1);

                b_lm=b_est+dp(2);

                % 計(jì)算新的可能估計(jì)值對(duì)應(yīng)的y和計(jì)算殘差e

                y_est_lm = a_lm*exp(-b_lm*data_1);

                d_lm=obs_1-y_est_lm;

                e_lm=dot(d_lm,d_lm);

                % 根據(jù)誤差,決定如何更新參數(shù)和阻尼系數(shù)

                if e_lm<e

                    lamda=lamda/10;

                    a_est=a_lm;

                    b_est=b_lm;

                    e=e_lm;

                    disp(e);

                    updateJ=1;

                else

                    updateJ=0;

                    lamda=lamda*10;

                end

            end

            %顯示優(yōu)化的結(jié)果

            a_est

            b_est

            本程序?qū)?yīng)的C++實(shí)現(xiàn),待整理后于近期公開。

            轉(zhuǎn)自:http://www.shenlejun.cn/my/article/show.asp?id=17&page=1

            posted @ 2010-12-10 14:58 abilitytao 閱讀(39246) | 評(píng)論 (5)編輯 收藏

            HDOJ 3592 World Exhibition——差分約束

            最短路中,求出源到各點(diǎn)的最短路。如果a->b有一條邊,那么dis[a]+w(a,b)>=dis[b].
            將所有的條件轉(zhuǎn)化成邊即可。

            #include<iostream>
            #include
            <algorithm>
            #include
            <cmath>
            #include
            <queue>
            using namespace std;
            const int maxn=1010;
            const int maxm=1000000;
            const int INF=1000000000;
            struct node
            {
                
            int t;
                
            int w;
                node 
            *next;
            }
            edge[maxm],*adj[maxn];

            int len=0;
            void init(int n)
            {
                
            for(int i=0;i<n;i++)
                    adj[i]
            =NULL;
                len
            =0;
            }


            void addedge(int u,int v,int w)
            {
                edge[len].t
            =v;edge[len].w=w;edge[len].next=adj[u];adj[u]=&edge[len++];
            }


            int dis[maxn];//[0,n-1]
            int use[maxn];
            int cnt[maxn];
            bool SPFA(int n,int s)
            {
                queue
            <int>Q;
                fill(dis,dis
            +n,INF);
                fill(use,use
            +n,0);
                fill(cnt,cnt
            +n,0);
                dis[s]
            =0;
                use[s]
            =1;
                Q.push(s);
                
            while(!Q.empty())
                
            {
                    
            int x=Q.front();Q.pop();
                    use[x]
            =0;
                    
            ++cnt[x];
                    
            if(cnt[x]>n)return false;
                    
            for(node *p=adj[x];p;p=p->next)
                    
            {
                        
            int t=p->t,w=p->w;
                        
            if(dis[x]+w<dis[t])
                        
            {
                            dis[t]
            =dis[x]+w;
                            
            if(!use[t])
                            
            {
                                Q.push(t);
                                use[t]
            =1;
                            }

                        }

                    }


                }

                
            return true;
            }


            int main()
            {
                
            int ca;
                scanf(
            "%d",&ca);
                
            while(ca--)
                
            {
                    
                    
            int n,x,y;
                    scanf(
            "%d%d%d",&n,&x,&y);
                    init(n);
                    
            for(int i=0;i<x;i++)
                    
            {
                        
            int a,b,c;
                        scanf(
            "%d%d%d",&a,&b,&c);
                        a
            --;b--;
                        addedge(a,b,c);
                    }

                    
            for(int i=0;i<y;i++)
                    
            {
                        
            int a,b,c;
                        scanf(
            "%d%d%d",&a,&b,&c);
                        a
            --;b--;
                        addedge(b,a,
            -c);
                    }

                    
            //for(int i=0;i<n-1;i++)
                    
            //    addedge(i+1,i,0);
                    if(!SPFA(n,0))printf("-1\n");
                    
            else if(dis[n-1]==INF)printf("-2\n");
                    
            else printf("%d\n",dis[n-1]);


                }



                
            return 0;
            }

            posted @ 2010-11-15 15:09 abilitytao 閱讀(288) | 評(píng)論 (0)編輯 收藏

            HDOJ 2466 Cryptography Reloaded (RSA算法)

            給出N,e,d,3<=e<31,求出p,q;


            二分給BigInteger開方很好用。
            另外就是枚舉(p-1)*(q-1)在比賽的時(shí)候也不失為一種很不錯(cuò)的方法。
            import java.math.*;
            import java.util.*;
            import java.io.*;


            public class Main
            {
                
            public static BigInteger Sqrt(BigInteger x)
                {
                    BigInteger l
            =new BigInteger("0");
                    BigInteger r
            =x;
                    
            while(l.compareTo(r)<0)
                    {
                        BigInteger mid
            =l.add(r).divide(BigInteger.valueOf(2));
                        
            if(mid.multiply(mid).compareTo(x)<0)
                            l
            =mid.add(BigInteger.ONE);
                        
            else if(mid.multiply(mid).compareTo(x)==0)
                            
            return mid;
                        
            else

                            r
            =mid.subtract(BigInteger.ONE);
                    }
                    
            return l;
                }
                
                
            public static boolean Judge(BigInteger x)
                {
                    BigInteger tem
            =new BigInteger("0");
                    tem
            =Sqrt(x);
                    
            if(tem.multiply(tem).compareTo(x)==0)
                        
            return true;
                    
            else
                        
            return false;
                }

                
            public static void main(String[] args)
                {
                    Scanner cin 
            = new Scanner (new BufferedInputStream(System.in));
                    String sn;
                    String se;
                    String sd;


                    
            int ca=0;
                    
            while(true)
                    {
                        ca
            ++;
                        sn
            =cin.next();
                        se
            =cin.next();
                        sd
            =cin.next();

                        BigInteger n
            =new BigInteger(sn);
                        BigInteger e
            =new BigInteger(se);
                        BigInteger d
            =new BigInteger(sd);

                        
            if(n.compareTo(BigInteger.ZERO)==0 && e.compareTo(BigInteger.ZERO)==0 &&d.compareTo(BigInteger.ZERO)==0)
                            
            break;

                        
            for(int i=1;i<=100;i++)
                        {
                            BigInteger t
            =e.multiply(d).subtract(BigInteger.ONE).divide(BigInteger.valueOf(i));
                            BigInteger t2
            = t.subtract(n).subtract(BigInteger.ONE).pow(2).subtract(BigInteger.valueOf(4).multiply(n));
                            
            if(Judge( t2 )==true)
                            {
                                t2
            =Sqrt(t2);
                               
            // System.out.println(t2);
                                BigInteger p=n.subtract(t).add(BigInteger.ONE).add(t2).divide(BigInteger.valueOf(2));
                                BigInteger q
            =n.subtract(t).add(BigInteger.ONE).subtract(t2).divide(BigInteger.valueOf(2));
                                
            if(q.compareTo(p)<0)
                                {
                                    BigInteger mm
            =q;
                                    q
            =p;
                                    p
            =mm;
                                }


                                System.out.println(
            "Case #"+ca+":"+" "+p+" "+q);
                                
            break;



                            }

                        }


                    }




                }
            }


            posted @ 2010-11-12 17:23 abilitytao 閱讀(448) | 評(píng)論 (0)編輯 收藏

            SGU 326 Perspective 網(wǎng)絡(luò)流(經(jīng)典競(jìng)賽問題)

                 摘要: 題意:有n(<=20)只隊(duì)伍比賽, 隊(duì)伍i初始得分w[i], 剩余比賽場(chǎng)數(shù)r[i](包括與這n只隊(duì)伍以外的隊(duì)伍比賽), mat[i][j]表示隊(duì)伍i與隊(duì)伍j剩余比賽場(chǎng)數(shù), 沒有平局, 問隊(duì)伍0有沒有可能獲得這n隊(duì)中的第一名(可以有并列第一). 做法1:其實(shí)第一個(gè)隊(duì)可以不用管它了,n支隊(duì)我們將它壓縮到n-1。//球隊(duì)編號(hào)[0,n-2]//比賽數(shù)[n-1,n-2+id]//超級(jí)源n-1+id//...  閱讀全文

            posted @ 2010-11-12 01:03 abilitytao 閱讀(625) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共42頁: First 3 4 5 6 7 8 9 10 11 Last 
            亚洲成色www久久网站夜月| 久久国产亚洲精品麻豆| 久久久精品人妻无码专区不卡| 大蕉久久伊人中文字幕| 三级韩国一区久久二区综合 | 亚洲国产精品无码久久久久久曰| 久久综合久久鬼色| 久久午夜无码鲁丝片| 国产成人久久777777| 亚洲香蕉网久久综合影视 | 久久这里有精品视频| 久久婷婷五月综合成人D啪| 97久久精品国产精品青草| 久久久久久久久久久免费精品| 久久精品国产亚洲AV香蕉| 久久美女网站免费| 国产成人精品综合久久久久 | 久久最近最新中文字幕大全 | 亚洲国产一成久久精品国产成人综合 | 亚洲AV乱码久久精品蜜桃| 久久久精品国产Sm最大网站| 国产麻豆精品久久一二三| 久久精品国产99国产精品亚洲| 久久久久亚洲AV综合波多野结衣 | 久久精品亚洲男人的天堂| 久久91亚洲人成电影网站| 无码AV中文字幕久久专区| 色妞色综合久久夜夜| 久久精品18| 国内精品久久久久影院网站| 潮喷大喷水系列无码久久精品| 久久人人爽人人爽人人爽| 亚洲中文字幕伊人久久无码| 99精品久久久久久久婷婷| 国产精品99久久免费观看| 人妻无码αv中文字幕久久琪琪布| 一级A毛片免费观看久久精品| 久久人人爽人人爽人人片AV东京热| 国内精品久久久久久不卡影院 | 久久天天躁狠狠躁夜夜不卡| 精品人妻伦九区久久AAA片69|