您的位置: 旅游網 > 影視 >> 票房

    中實現以復雜線條為基礎的圖形繪圖牛

    發布時間:2021-10-28 05:38:25

    摘要:本文介紹了一種使用LineDDA函數來實現以復雜線條為基礎的圖形繪圖方法。

    關鍵字:圖形繪圖、LineDDA、回調函數

    一、 引言

    在GIS(地理信息系統)類軟件設計中經常需要在繪圖時使用一些相對固定但又頻繁使用的一些用以代表地理狀態的符號如河流、鐵路、海岸線等等。每一種符號均有其各自的風格,但在不同的位置的具體表示卻不盡相同,比如代表鐵路的符號是一段黑白相間的細矩形,但有時是平直的,在拐彎時用彎曲的矩形來表示。因此對于上述符號的繪制一般不易用固定的圖標去實現,而多采用靈活多變的用函數來直接繪制的方法。顯然作為GIS基本符號的圖形一般都是相對比較復雜的線條,在MFC提供的基本類庫中并未提供可以直接使用的相關函數。即使是在繪圖功能比較強大的CDC中也僅僅提供了LineTo()、SetPixel()等一些通用的最基本的繪圖函數,雖然也可以使用這些基本函數來繪制GIS里的基本符號,但這是效率比較低下的一種辦法,這在大量的繪圖操作中將會表現的比較明顯,因此不宜提倡。本文下面將介紹一種使用Win32 API函數LineDDA來繪制復雜風格線條的方法來解決上述類似問題。

    二、 把復雜風格的線條作為基本繪圖操作

    在Windows NT 3.1中首次出現了Win32 API函數LineDDA,用以創建虛線或點劃線,以及其他一些更復雜的線條。因此可以從該函數入手來解決以復雜線條作為基本繪圖操作的問題。LineDDA函數主要是通過回調機制來實現其功能的,其繪制線條總是被使用當前顯示分辨率的缺省轉換和映射模式來計算的。如果不使用缺省方式,也可以向其回調函數LineDDAProc傳遞手工轉換的X和Y值。LineDDA是一個32位的圖形設備接口庫函數調用,從如下所示的函數原形中可以看出其入口參數是一組線條坐標、一個回調函數的地址以及一個指向應用程序定義數據的指針:

    BOOL LineDDA( int nXStart, // 線條起點的X坐標

    int nYStart, // 線條起點的Y坐標

    int nXEnd, // 線條終點的X坐標

    int nYEnd, // 線條終點的Y坐標

    LINEDDAPROC lpLineFunc, // 回調函數的指針

    LPARAM lpData // 應用程序定義數據的指針);

    由lpLineFunc指針指向的回調函數將在除終點外的線段的每個點上被調用,顯然這里是實現復雜線條算法的最佳地方。該回調函數一般可以定義如下:

    VOID CALLBACK LineDDAProc(int X, // 被求值點的X坐標

    int Y, // 被求值點的Y坐標

    LPARAM lpData // 應用程序定義數據的指針);

    在實際調用時一般選當前的設備環境句柄作為應用程序定義數據的指針,該指針會在調用LineDDA函數時將其傳送給回調函數LineDDAProc,在回調函數中通過CDC* pDC= (CDC*)lpData;強制轉換即可在其中使用當前的設備環境句柄,并通過該句柄進行繪圖等工作。下面通過一個具體實例來做進一步的介紹:

    類似于CDC類庫中的繪圖函數,當我們把某種較復雜線條作為一個整體元素進行繪圖操作時有以下幾個元素需要確定:起始點、終止點坐標,繪圖時用的顏色等。因此可以初步確定繪制復雜線條的函數采取如下形式:

    void CLineDDAView::DrawWave(CPoint ptFrom, CPoint ptTo, COLORREF crValue)

    {

    g_crValue=crValue; //繪制圖形用的顏色

    CDC* pDC=GetDC(); //獲取當前設備環境句柄

    //通過LineDDA函數調用回調函數Proc以完成復雜線條的繪圖工作

    LineDDA(ptFrom.x,ptFrom.y,ptTo.x,ptTo.y,(LINEDDAPROC)Proc,(long)pDC);

    ReleaseDC(pDC); //釋放申請到的設備環境句柄

    }

    具體的實質性工作一般都是放在回調函數中進行的,在這里只是象征性的實現一個波浪曲線的繪圖工作:

    viod CALLBACK Proc(int X, int Y, LPARAM lpData)

    {

    //使用lpData傳遞用于繪圖的CDC對象的引用

    CDC* pDC;

    pDC = (CDC*)lpData;

    //該回調函數將上每個點處被調用,因此隨著X坐標的變化,縱坐標Y+sin(X)

    //也就呈正弦波形波動,通過CDC類的SetPixel函數將計算出的波浪線上的每一點

    //都顯示出來。

    pDC-SetPixel(X,Y+sin(X),g_crValue);

    }

    “好好”和“星徽”將抵達同樣富有中國園林特色的比利時天堂動物園。天堂動物園占地55英畝 在應用時應當根據需求的不同采取不同的線條風格設計算法,甚至可以在回調函數中使用TextOut函數實現文本文字的曲線顯示等效果。在使用我們設計的DrawWave函數進行繪圖操作時,可以象是使用CDC提供的LineTo等函數一樣非常簡單的畫出一條在CDC類中并未提供的波浪線。

    小結:

    LineDDA函數為畫出復雜線條類型提供了一種解決辦法。雖然是一種Win32的解決辦法,在MFC中并不直接支持,但作為一個一般的解決辦法,它還是十分有用的,而且它能解決一些沒有直接解決辦法的比較獨特的問題。通過對LineDDA函數的挖掘可以設計出適合自己需要的可以作為繪圖基本單元的復雜線條。

    查看本文來源

    西安治療男科去哪里
    福州哪家醫院男科好
    太極集團
    猜你會喜歡的
    猜你會喜歡的
    主站蜘蛛池模板: 性欧美丰满熟妇XXXX性| 激情综合色综合久久综合| 国产精品区一区二区三| 一级毛片美国一级j毛片不卡| 极品尤物一区二区三区| 免费人成视频在线观看网站| 香蕉成人伊视频在线观看| 在线观着免费观看国产黄| 中文字幕日韩哦哦哦| 极品色αv影院| 亚洲精品无码国产| 绿巨人晚上彻底放飞自己| 狼友av永久网站免费观看| 欧美三级全部电影观看| 日韩a毛片免费观看| 性做久久久久久免费观看| 国产精品亚洲专一区二区三区| 国产悠悠视频在线播放| 六月婷婷综合网| 亚洲av日韩综合一区二区三区| 丰满亚洲大尺度无码无码专线| 91午夜精品亚洲一区二区三区| 两个人看的视频www在线高清| 亚洲一区二区三区高清| 超碰97人人做人人爱少妇| 女的和男的一起怼怼| 久久久久亚洲AV无码专区体验| 欧美一线不卡在线播放 | 一个人免费视频观看在线www| 日本成熟电影不卡www| 亚洲国产精品ⅴa在线观看| 狠狠色噜噜狠狠狠狠98| 向日葵app下载网址进入在线看免费网址大全| 成人午夜免费福利视频| 国产精品白浆在线播放| 一二三四日本视频中文| 2020求一个网站男人都懂| 91精品啪在线观看国产线免费| 欧美人与z0xxx另类| 人妻精品久久久久中文字幕| 6080午夜乱理伦片|