青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
    『啊,蔥爆羊肉真是香啊。』一邊回憶著這個(gè)令人感動(dòng)的美食,一邊心不在焉地寫(xiě)了個(gè)程序。這個(gè)小程序?qū)崿F(xiàn)了一個(gè)很簡(jiǎn)單的功能,將一棵樹(shù)轉(zhuǎn)換成bmp圖片并自動(dòng)排版。

    思路非常簡(jiǎn)單。我們將樹(shù)節(jié)點(diǎn)分為葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)。一個(gè)葉子節(jié)點(diǎn)可以簡(jiǎn)單的處理為一個(gè)加了矩形邊框的字符串,一個(gè)非葉子節(jié)點(diǎn)可以處理為一個(gè)加了矩形邊框的字符串下面連接一堆樹(shù)。先看看結(jié)果吧。下面有兩幅圖片,表示的都是使用這篇文章的程序產(chǎn)生的兩棵語(yǔ)法樹(shù)。如果由于圖片太大而看不清楚,就另存為到硬盤上慢慢觀賞吧。

    這個(gè)算法并沒(méi)有通過(guò)什么計(jì)算來(lái)得到一個(gè)緊湊的圖片。

    1:(1+2)*(3+4)

    2:(1+sin(2))*(sin(log(2,3))+4)

    上圖可以將元素分為樹(shù)、文字以及線條。構(gòu)造這種圖的要領(lǐng)是每一個(gè)節(jié)點(diǎn)的坐標(biāo)信息都使用父節(jié)點(diǎn)的坐標(biāo)空間。這樣的話不僅可以很快計(jì)算出圖片所需要的尺寸,而且還可以很方便的繪制。繪制的時(shí)候遞歸一下,每加深一層就修改一下坐標(biāo)空間。

    下面給出代碼。首先是頭文件。其中類“GrammarSimulatorNode”是語(yǔ)法樹(shù)的數(shù)據(jù)結(jié)構(gòu),包含了字符串和子節(jié)點(diǎn)。
 1 #ifndef COMPRE_PAINTER
 2 #define COMPRE_PAINTER
 3 
 4 #include "GrammarAlgorithms.h"
 5 #include "..\..\..\Library\Windows\VL_WinGDI.h"
 6 
 7 using namespace vl::windows;
 8 
 9 namespace compiler
10 {
11 
12 /*********************************************************************************************************
13 GrammarSimulateNodePainter
14 *********************************************************************************************************/
15 
16     class GrammarSimulateNodePainter : public VL_Base
17     {
18     public:
19         class Line
20         {
21         public:
22             typedef VL_List<Line , true>            List;
23 
24             VInt                StartX;
25             VInt                StartY;
26             VInt                EndX;
27             VInt                EndY;
28         };
29 
30         class Rect
31         {
32         public:
33             typedef VL_List<Rect , false>            List;
34 
35             VInt                Left;
36             VInt                Top;
37             VInt                Width;
38             VInt                Height;
39             VInt                TextOffsetX;
40             VInt                TextOffsetY;
41             VUnicodeString        Text;
42         };
43 
44         class Graph
45         {
46         public:
47             typedef VL_AutoPtr<Graph>                Ptr;
48             typedef VL_List<Ptr , false , Graph*>    List;
49 
50             VInt                OffsetX;
51             VInt                OffsetY;
52             VInt                Width;
53             VInt                Height;
54             VInt                LineReceiverX;
55             Line::List            Lines;
56             Rect::List            Rects;
57             Graph::List            Children;
58         };
59     public:
60         VL_WinBitmap::Ptr        Bitmap;
61         VL_WinDC*                BitmapDC;
62 
63         GrammarSimulateNodePainter();
64 
65         void                    InitBitmap();
66         Graph::Ptr                Build(GrammarSimulatorNode::Ptr Node);
67         void                    ResizeBitmap(VInt Width , VInt Height);
68         void                    ResizeBitmap(Graph::Ptr g);
69         void                    Paint(Graph::Ptr g , VInt OffsetX , VInt OffsetY);
70         void                    Paint(GrammarSimulatorNode::Ptr Node);
71     };
72 }
73 
74 #endif

    然后是實(shí)現(xiàn):
  1 #include "Painter.h"
  2 
  3 namespace compiler
  4 {
  5 
  6 /*********************************************************************************************************
  7 GrammarSimulateNodePainter
  8 *********************************************************************************************************/
  9 
 10     const VInt GraphTextPadding=5;
 11     const VInt GraphPadding=10;
 12     const VInt GraphLevelPadding=24;
 13 
 14     GrammarSimulateNodePainter::GrammarSimulateNodePainter()
 15     {
 16         Bitmap=new VL_WinBitmap(32,32,VL_WinBitmap::vbb32Bits,true);
 17         InitBitmap();
 18     }
 19 
 20     void GrammarSimulateNodePainter::InitBitmap()
 21     {
 22         BitmapDC=Bitmap->GetWinDC();
 23         BitmapDC->SetBackTransparent(true);
 24         BitmapDC->FillRect(0,0,Bitmap->GetWidth(),Bitmap->GetHeight());
 25     }
 26 
 27     GrammarSimulateNodePainter::Graph::Ptr GrammarSimulateNodePainter::Build(GrammarSimulatorNode::Ptr Node)
 28     {
 29         VUnicodeString Text;
 30         if(Node->SubExpressions.GetCount())
 31         {
 32             Text=Node->TerminatorName;
 33         }
 34         else
 35         {
 36             Text=Node->TerminatorName+L" : "+Node->Value;
 37         }
 38 
 39         SIZE TextSize=BitmapDC->MeasureString(Text);
 40         Graph::Ptr g=new Graph;
 41 
 42         VInt TotalWidth=0;
 43         VInt TotalHeight=0;
 44         for(VInt i=0;i<Node->SubExpressions.GetCount();i++)
 45         {
 46             Graph::Ptr sg=Build(Node->SubExpressions[i]);
 47             sg->OffsetX=TotalWidth;
 48             TotalWidth+=sg->Width;
 49             if(i!=Node->SubExpressions.GetCount()-1)
 50             {
 51                 TotalWidth+=GraphPadding;
 52             }
 53             if(sg->Height>TotalHeight)
 54             {
 55                 TotalHeight=sg->Height;
 56             }
 57             g->Children.Add(sg);
 58         }
 59 
 60         Rect r;
 61         r.Left=0;
 62         r.Top=0;
 63         r.Width=TextSize.cx+GraphTextPadding*2;
 64         r.Height=TextSize.cy+GraphTextPadding*2;
 65         r.TextOffsetX=GraphTextPadding;
 66         r.TextOffsetY=GraphTextPadding;
 67         r.Text=Text;
 68 
 69         g->OffsetX=0;
 70         g->OffsetY=0;
 71         g->Width=r.Width;
 72         g->Height=r.Height;
 73 
 74         if(g->Width<TotalWidth)
 75         {
 76             r.Left=(TotalWidth-g->Width)/2;
 77             g->Width=TotalWidth;
 78         }
 79         g->LineReceiverX=r.Left+r.Width/2;
 80         g->Rects.Add(r);
 81 
 82         if(g->Children.GetCount())
 83         {
 84             for(VInt i=0;i<g->Children.GetCount();i++)
 85             {
 86                 Graph::Ptr sg=g->Children[i];
 87 
 88                 Line l;
 89                 l.StartX=g->LineReceiverX;
 90                 l.StartY=r.Height;
 91                 l.EndX=sg->LineReceiverX+sg->OffsetX;
 92                 l.EndY=l.StartY+GraphLevelPadding;
 93                 sg->OffsetY=l.EndY;
 94                 g->Lines.Add(l);
 95             }
 96             g->Height+=GraphLevelPadding+TotalHeight;
 97         }
 98 
 99         return g;
100     }
101 
102     void GrammarSimulateNodePainter::ResizeBitmap(VInt Width , VInt Height)
103     {
104         VL_WinBitmap::Ptr NewBitmap=new VL_WinBitmap(Width,Height,VL_WinBitmap::vbb32Bits,true);
105         NewBitmap->GetWinDC()->SetFont(BitmapDC->GetFont());
106         NewBitmap->GetWinDC()->SetBrush(BitmapDC->GetBrush());
107         NewBitmap->GetWinDC()->SetPen(BitmapDC->GetPen());
108         Bitmap=NewBitmap;
109         InitBitmap();
110     }
111 
112     void GrammarSimulateNodePainter::ResizeBitmap(Graph::Ptr g)
113     {
114         ResizeBitmap(g->Width+2*GraphPadding,g->Height+2*GraphPadding);
115     }
116 
117     void GrammarSimulateNodePainter::Paint(Graph::Ptr g , VInt OffsetX , VInt OffsetY)
118     {
119         OffsetX+=g->OffsetX;
120         OffsetY+=g->OffsetY;
121         for(VInt i=0;i<g->Lines.GetCount();i++)
122         {
123             Line l=g->Lines[i];
124             BitmapDC->MoveTo(l.StartX+OffsetX,l.StartY+OffsetY);
125             BitmapDC->LineTo(l.EndX+OffsetX,l.EndY+OffsetY);
126         }
127         for(VInt i=0;i<g->Rects.GetCount();i++)
128         {
129             Rect r=g->Rects[i];
130             BitmapDC->Rectangle(
131                 r.Left+OffsetX,
132                 r.Top+OffsetY,
133                 r.Left+r.Width+OffsetX,
134                 r.Top+r.Height+OffsetY);
135             BitmapDC->DrawString(
136                 r.Left+r.TextOffsetX+OffsetX,
137                 r.Top+r.TextOffsetY+OffsetY,
138                 r.Text);
139         }
140         for(VInt i=0;i<g->Children.GetCount();i++)
141         {
142             Paint(g->Children[i],OffsetX,OffsetY);
143         }
144     }
145 
146     void GrammarSimulateNodePainter::Paint(GrammarSimulatorNode::Ptr Node)
147     {
148         Graph::Ptr g=Build(Node);
149         ResizeBitmap(g);
150         Paint(g,GraphPadding,GraphPadding);
151     }
152 }
posted on 2008-09-07 04:18 陳梓瀚(vczh) 閱讀(2903) 評(píng)論(3)  編輯 收藏 引用 所屬分類: 2D

評(píng)論:
# re: 將樹(shù)型數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為圖片并自動(dòng)排版 2008-09-07 05:18 | Lnn
送你一個(gè)詭異的笑。。。嘿嘿!  回復(fù)  更多評(píng)論
  
# re: 將樹(shù)型數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為圖片并自動(dòng)排版 2010-07-28 18:42 | roy
來(lái)學(xué)習(xí)一下思路先~  回復(fù)  更多評(píng)論
  
# re: 將樹(shù)型數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為圖片并自動(dòng)排版 2011-05-30 09:31 | ArthasLee
暑假的數(shù)據(jù)結(jié)構(gòu)大作業(yè)想fxck這個(gè)哇。。。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品日韩在线观看| 亚洲国产精品va在线看黑人动漫| 欧美大尺度在线观看| 亚洲一区精品电影| 亚洲欧美www| 西西人体一区二区| 欧美一区2区三区4区公司二百| 在线亚洲+欧美+日本专区| 久久免费视频这里只有精品| 在线视频亚洲| 亚洲综合色网站| 亚洲欧美激情视频| 久久精品一区二区三区四区| 久久亚洲一区二区三区四区| 欧美激情精品| 在线中文字幕日韩| 久久久久久69| 欧美三级第一页| 国产日韩精品视频一区| 在线观看视频欧美| 99精品欧美一区二区蜜桃免费| 亚洲一区二区高清| 久久天天躁狠狠躁夜夜av| 欧美激情一区二区三区在线视频 | 国产一区二区三区在线观看免费| 黄色欧美成人| 亚洲影视综合| 免费一级欧美在线大片| 亚洲美女黄网| 久久精品国产99国产精品澳门| 欧美国产精品中文字幕| 国产毛片一区二区| 亚洲毛片一区二区| 久久视频在线视频| 亚洲午夜精品视频| 欧美精品久久久久a| 国产性天天综合网| 亚洲一区二区三区四区五区午夜| 久久香蕉国产线看观看av| 日韩一区二区精品| 嫩草影视亚洲| 欲色影视综合吧| 欧美影院精品一区| 99在线精品视频在线观看| 久久亚洲精品中文字幕冲田杏梨 | 西瓜成人精品人成网站| 欧美日韩亚洲综合一区| 亚洲精品女av网站| 欧美国产一区在线| 久久国产精品久久久久久电车| 欧美日韩和欧美的一区二区| 一色屋精品亚洲香蕉网站| 香蕉成人久久| 国产精品99久久久久久久女警| 欧美激情无毛| 亚洲乱码国产乱码精品精天堂 | 夜夜夜精品看看| 欧美激情精品久久久久久黑人 | 精品成人一区二区| 午夜精品久久久99热福利| 亚洲精品久久久久久久久| 久久综合综合久久综合| 一区二区视频欧美| 久久一综合视频| 久久久久久久一区二区三区| 好看的日韩av电影| 久久青青草原一区二区| 欧美一区二区三区免费看| 国产日韩欧美在线播放不卡| 久久国产欧美精品| 久久se精品一区精品二区| 欧美成人有码| 欧美成ee人免费视频| 亚洲人成网站999久久久综合| 欧美成人午夜激情视频| 欧美激情一区二区三区全黄| 这里只有精品在线播放| 日韩午夜剧场| 国产精品永久入口久久久| 久久精品视频网| 欧美有码视频| 亚洲盗摄视频| 夜夜嗨av一区二区三区| 国产伦一区二区三区色一情| 久久久五月天| 欧美国产极速在线| 中国av一区| 欧美一区二区三区视频免费播放| 国内久久视频| 亚洲精品免费看| 国产欧美日韩不卡| 亚洲电影欧美电影有声小说| 欧美日韩国产小视频| 小辣椒精品导航| 美国成人直播| 亚洲欧美日韩一区二区| 久久国产精品网站| 这里只有精品视频在线| 欧美一区二区三区四区视频| 亚洲韩国精品一区| 亚洲一级黄色片| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美国产日韩一区| 亚洲欧美日本另类| 另类专区欧美制服同性| 亚洲欧美综合v| 久久精品一二三| 亚洲一区二区三区免费在线观看 | 亚久久调教视频| av成人免费在线| 小处雏高清一区二区三区| 在线观看日韩精品| 99热在线精品观看| 在线播放不卡| 午夜天堂精品久久久久| 亚洲精品人人| 久久九九免费视频| 欧美影院一区| 国产精品国产精品| 亚洲国产欧美国产综合一区| 国产视频不卡| 这里是久久伊人| 在线综合亚洲欧美在线视频| 久热这里只精品99re8久| 久久国产欧美| 国产日韩欧美在线看| 亚洲视频你懂的| 亚洲视屏在线播放| 欧美日韩精品综合| 欧美黄色免费网站| 亚洲第一精品夜夜躁人人爽| 欧美一区二区精品| 欧美在线看片| 国产精品s色| 一区二区三区视频观看| 一区二区三区视频免费在线观看 | 欧美啪啪一区| 亚洲国产日韩欧美在线99 | 在线观看日韩| 久久人人爽人人| 免费试看一区| 影音先锋另类| 久久久一区二区三区| 老司机亚洲精品| 在线精品国产成人综合| 久久成人这里只有精品| 久久婷婷亚洲| 激情婷婷久久| 久久亚洲综合色| 欧美韩国日本一区| 99视频在线精品国自产拍免费观看| 欧美国产专区| av不卡在线看| 久久精品国产精品亚洲| 国内成+人亚洲| 老色批av在线精品| 亚洲美女在线国产| 亚洲欧美日韩精品综合在线观看| 欧美日韩亚洲成人| 欧美一区成人| 亚洲国产va精品久久久不卡综合| 亚洲毛片在线看| 国产精品国产a| 久久国产精品久久久久久电车| 久久视频精品在线| 亚洲人成网站在线播| 欧美日韩综合在线| 久久成人精品电影| 亚洲精品国产日韩| 久久精品国产99国产精品澳门| 18成人免费观看视频| 欧美超级免费视 在线| 在线一区欧美| 欧美.www| 亚洲一区在线视频| 国精品一区二区三区| 99国产精品久久久久久久久久 | 亚洲国产精品视频| 中文在线一区| 国产在线播精品第三| 欧美黑人一区二区三区| 亚洲图色在线| 欧美激情精品久久久| 欧美亚洲专区| 一本综合精品| 国产一区二区久久久| 欧美国产日本在线| 亚洲欧美中日韩| 亚洲国产精品久久久久久女王| 亚洲欧美日韩精品| 一本色道久久88综合亚洲精品ⅰ | 亚洲激情在线观看| 久久成人免费日本黄色| 一本到12不卡视频在线dvd| 国产一区视频网站| 国产精品r级在线| 欧美xxx成人| 久久婷婷综合激情| 欧美一区二区三区在线免费观看| 亚洲乱亚洲高清|