摘 要:在批量多邊形凈面積計(jì)算中,按毛面積進(jìn)行排序,從毛面積最小多邊形開始處理計(jì)算,可以高效、準(zhǔn)確的計(jì)算多邊形的凈面積。
關(guān)鍵詞:毛面積 凈面積 面積排序
中圖分類號:P271 文獻(xiàn)標(biāo)識碼:A 文章編號:1672-3791(2012)11(a)-0033-02
在地籍調(diào)查、工程測量等工作中,經(jīng)常需要批量計(jì)算多邊形的凈面積(多邊形毛面積是指本多邊形拐點(diǎn)所圍成的面積;多邊形凈面積是指多邊形的毛面積扣除其內(nèi)部全部島的凈面積。多邊形內(nèi)部無島時毛面積和凈面積相等)。如果孤立的隨機(jī)的逐個多邊形的凈面積計(jì)算,即使采用編程方式進(jìn)行,編程過程也會變得較為復(fù)雜。如圖1,預(yù)計(jì)算多邊形A的凈面積,首先獲得多邊形A的毛面積,通過搜索可以獲取多邊形A內(nèi)有3個島,因?yàn)椴恢烂總€島的凈面積是否已計(jì)算,則需要計(jì)算每個島的凈面積,計(jì)算每個島的凈面積時還要考慮其內(nèi)部是否還有島,如此循環(huán)、遞歸下去,編程的難度偏大,程序的運(yùn)行效率也會較低。
1 多邊形毛面積排序法進(jìn)行凈面積計(jì)算的原理
在對多變形面積進(jìn)行計(jì)算前,多邊形是經(jīng)過拓?fù)錂z查的,即多邊形之間的關(guān)系只存在包含、鄰接和相離的關(guān)系,不存在多邊形相交或重復(fù)的情況。在多邊形凈面積計(jì)算前,計(jì)算每個多變形的毛面積,按毛面積的大小對多邊形進(jìn)行排序。在計(jì)算多邊形的凈面積時,從面積最小的多邊形開始計(jì)算,依次進(jìn)行。在計(jì)算一個多邊形時,搜索其內(nèi)部的多邊形,讀取每個內(nèi)部多邊形的凈面積,并求取內(nèi)部多邊形的凈面積之和,則本多邊形的凈面積為本多邊形毛面積減去其內(nèi)部多邊形的凈面積之和,然后將本多邊形的凈面積作為本多邊形的屬性,賦值在本多邊形上。采用本方法計(jì)算多邊形凈面積時,不用考慮其內(nèi)部多邊形是否還存在島,只要簡單讀取其內(nèi)部多邊形的凈面積即可,因?yàn)楸径噙呅蝺?nèi)部的多邊形,面積一定比本多邊形要小,所以其一定在本多邊形凈面積計(jì)算之前就已經(jīng)計(jì)算了凈面積,直接讀取,無需再計(jì)算,即使其內(nèi)部還用多層嵌套。如圖1中,預(yù)計(jì)算多邊形C的凈面積,首先計(jì)算多邊形C的毛面積,因其內(nèi)部沒有島,所以其毛面積即為凈面積,作為屬性賦值給其本身;預(yù)計(jì)算多邊形B的凈面積,首先計(jì)算多邊形B的毛面積,因多邊形B的毛面積比多邊形C的毛面積大,所以多邊形C的毛面積必然在多邊形B之前計(jì)算,所以直接扣除其內(nèi)部島多邊形C的凈面積,作為屬性賦值給其本身;預(yù)計(jì)算多邊形A的凈面積,首先計(jì)算多邊形C的毛面積,因多邊形B、C、D的凈面積已經(jīng)計(jì)算,所以直接扣除其內(nèi)部島多邊形B、C、D的凈面積之和,作為屬性賦值給其本身。
2 多邊形毛面積排序法進(jìn)行凈面積計(jì)算程序設(shè)計(jì)原理
根據(jù)這一原理,采用VB2010和AutoC AD2008設(shè)計(jì)了多邊形凈面積計(jì)算程序,主要步驟如下。
Dim Reg1 As RegAppTable = trans.GetObject(db.RegAppTableId, OpenMode.ForWrite)
Dim App1 As New RegApp TableRecord
If Not Reg1.Has("Area") Then
App1.Name="Area"
Reg1.Add(App1)
trans.AddNewlyCreatedDBObject(App1,True)
End If
Dim Val1 As TypedValue=New TypedValue(DxfCode.Start,"Polyline,Lwpolyline")
Dim Val() As TypedValue={Val1}
Dim Filter1 As New SelectionFilter(Val)
Dim Optsel As New PromptSelectionOptions
Dim Ss1,Ss2 As SelectionSet
Dim Res1 As PromptSelectionResult =Ed.GetSelection(Optsel,F(xiàn)ilter1)
If Res1.Status<>PromptStatus.OK Then
Exit Sub
End If
Ss1=Res1.Value
Dim I As Long
Poly2d=CType(trans.GetObject(PolyId1.Item(I),OpenMode.ForRead), Polyline2d)
Len1=Poly2d.Length
Catch
End Try
Try
Poly=CType(trans.GetObject(PolyId1.Item(I),OpenMode.ForRead), Polyline)
Len1=Poly.Length
Catch
End Try
Try
Cur1=CType(trans.GetObject(PolyId1.Item(I),OpenMode.ForWrite),Curve)
Catch
End Try
Area1=Cur1.Area
PtC1=SubFun.Ptc3DOfCollection(PolyId1.Item(I))
Pt1=Cur1.GeometricExtents.MinPoint
Pt2=Cur1.GeometricExtents.MaxPoint
Pt1=New Point3d(Pt1.X-1,Pt1.Y-1,0)
Pt2=New Point3d(Pt2.X+1,Pt2.Y+1,0)
Tools.ZoomWindow(Pt1,Pt2)
Res2=Ed.SelectWindowPolygon(PtC1,F(xiàn)ilter1)
If Res2.Status<>PromptStatus.OK Then
GoTo Skip1
End If
Ss2=Res2.Value
For J=0 To Ss2.Count-1
Area3=0
If Ss2.Item(J).ObjectId=PolyId1.Item(I) Then
Area2=Area2+Area3
Next
Area1=Area1-Area2
Dim DxfArea As New ResultBuffer
DxfArea.Add(New TypedValue(CInt(1001),"Area"))
DxfArea.Add(New TypedValue(CInt(1040),Area1))
Cur1.XData=DxfArea
3 多邊形毛面積排序法進(jìn)行凈面積計(jì)算的示例
如圖1所示,采用多邊形毛面積排序法進(jìn)行凈面積計(jì)算的結(jié)果如表1。
4 結(jié)語
多邊形毛面積排序法進(jìn)行凈面積計(jì)算,從面積最小的多邊形開始進(jìn)行,所以多邊形內(nèi)部島的凈面積計(jì)算一定在本多邊形之前進(jìn)行,所以在計(jì)算本多邊形時就無需考慮島的凈面積計(jì)算,而直接讀取所有島的凈面積即可,免去了原本復(fù)雜的循環(huán)、遞歸運(yùn)算,使得程序的原理簡單,設(shè)計(jì)方便,運(yùn)行高效。
參考文獻(xiàn)
[1](美)Bill Evjen,Rockford Lhotka,Billy Hollis等,著. Visual Basic2005高級編程[M].楊浩,吳雷譯.北京:清華大學(xué)出版社,2006.
[2] (美)David F,Rogers,著.計(jì)算機(jī)圖形學(xué)的算法基礎(chǔ)[M].北京:機(jī)械工業(yè)出版社,2002.
[3]曾洪飛,張帆,盧擇臨.AutoCAD VBA &VB.NET開發(fā)基礎(chǔ)教程與實(shí)例[M].北京:中國電力出版社,2008.