999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于AutoCAD二次開發(fā)的CASS地物直角化算法改進(jìn)

2017-09-22 05:41:48熊忠招陶彣君
地理空間信息 2017年9期
關(guān)鍵詞:二次開發(fā)測繪

熊忠招,陶彣君

(1.湖北省國土測繪院,湖北 武漢 430010)

基于AutoCAD二次開發(fā)的CASS地物直角化算法改進(jìn)

熊忠招1,陶彣君1

(1.湖北省國土測繪院,湖北 武漢 430010)

針對因數(shù)字化誤差或策略誤差造成地物角點(diǎn)不是直角而需進(jìn)行修正的問題,提出了一種基于AutoCAD的,既能保證地物角點(diǎn)正確直角化,又能保證糾正后頂點(diǎn)偏離原始頂點(diǎn)的坐標(biāo)值盡可能小的高效算法。實(shí)踐表明,該算法能夠高效完成地物直角化的工作,簡單易行,可滿足實(shí)際生產(chǎn)需要。

AutoCAD;直角化;二次開發(fā);CASS

隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,GNSS﹑無人機(jī)等一 大批新興技術(shù)越來越多地融入到測繪數(shù)據(jù)采集中,在利用計(jì)算機(jī)進(jìn)行地形圖繪制或?qū)σ延屑堎|(zhì)地形圖進(jìn)行掃描矢量化時[1-6],常會出現(xiàn)某些地物所有或某些頂點(diǎn)需要直角化的情況。傳統(tǒng)做法是采用手工方法對需要直角化的頂點(diǎn)進(jìn)行糾正,或?qū)⒌匦螆D導(dǎo)入其他具有直角糾正功能的商業(yè)軟件中進(jìn)行糾正,不僅效率低下,且有可能得不到想要的直角糾正結(jié)果。圖1為使用CASS軟件自帶的直角糾正功能對地物進(jìn)行直角糾正的結(jié)果(虛線為糾正前的圖形,實(shí)線為糾正后的圖形)。對比糾正前后圖形可知,圖形發(fā)生了翻轉(zhuǎn),與原圖形偏差巨大,完全不滿足直角糾正的要求。

圖1 CASS軟件直角糾正功能糾正后效果圖

鑒于此,本文結(jié)合已有商業(yè)軟件和算法的優(yōu)勢,對這些算法進(jìn)行優(yōu)化,提出了一種以每條邊中點(diǎn)為旋轉(zhuǎn)基點(diǎn),結(jié)合頂點(diǎn)內(nèi)角判定方法進(jìn)行直角糾正的高效地物直角化算法,以滿足對地形圖地物直角化的需求。

1 算法設(shè)計(jì)

1.1 線段不同位置構(gòu)建直角效果對比

圖2中ABCD為一個四邊形,其中∠B和∠C不是直角,需對這兩個角進(jìn)行直角化。該圖形中可以AB邊為基準(zhǔn),將BC邊糾正為與AB邊垂直。

圖2 線段不同位置構(gòu)建直角效果對比圖

通過BC邊上的任意一點(diǎn)作AB邊的垂線,即可得到∠B糾正后的新位置。雖然可有任意多種作直角的方式,但存在3種特殊情況:

1)以頂點(diǎn)B為基準(zhǔn),過頂點(diǎn)B作AB邊的垂線,即BC″邊,此時頂點(diǎn)B相對于糾正前的偏離距離為0,頂點(diǎn)C相對于糾正前的偏離距離為CC″。

2)通過BC邊的中點(diǎn)M作AB邊的垂線,相交于B′點(diǎn),此時頂點(diǎn)B相對于糾正前的偏離距離為BB′,頂點(diǎn)C相對于糾正前的偏離距離為CC ′。

3)以頂點(diǎn)C作為基準(zhǔn),過頂點(diǎn)C作AB邊的垂線,此時頂點(diǎn)B相對于糾正前的偏離距離為CC″,頂點(diǎn)C相對于糾正前的偏離距離為0。

綜合上述3種情況可以看出,第二種方法最為合理,能使多邊形中各頂點(diǎn)的偏離距離基本保持一致,不會存在偏離過大或過小的情況,本文采用該方法。

1.2 以最接近90°頂點(diǎn)進(jìn)行直角構(gòu)建

圖3為圖4中的頂點(diǎn)C的局部圖,∠C是與90°最為接近的角,故對該圖形進(jìn)行直角化應(yīng)該從頂點(diǎn)C開始。建立初始邊的具體步驟為:①計(jì)算BC邊和CD邊的中點(diǎn),以各自邊的中點(diǎn)作為該條邊后續(xù)的旋轉(zhuǎn)基點(diǎn)。②將各頂點(diǎn)處的內(nèi)角值與90°進(jìn)行比較:若該頂點(diǎn)處的內(nèi)角值大于90°,則將該頂點(diǎn)相鄰兩條邊各自往多邊形的外部旋轉(zhuǎn)差值的一半(否則會導(dǎo)致該頂點(diǎn)新位置偏離原始位置過大,旋轉(zhuǎn)后得到的新位置是所有方法中偏離原始位置最小的);若小于90°,則向多邊形內(nèi)部旋轉(zhuǎn)差值的一半。如圖3所示,頂點(diǎn)C未處理前的內(nèi)角為89°,小于90°,故將頂點(diǎn)C相鄰兩條邊各自往多邊形內(nèi)部旋轉(zhuǎn)一半,得到新的交點(diǎn)C ′,此時該頂點(diǎn)變?yōu)?0°,頂點(diǎn)C的位置更改為新位置C ′,即完成了對頂點(diǎn)C的直角化,也為后續(xù)各頂點(diǎn)的直角化建立了基準(zhǔn)。

圖3 以最接近90°頂點(diǎn)進(jìn)行直角構(gòu)建示意圖

圖4 四邊形ABCD的各頂點(diǎn)內(nèi)角值

1.3 算法實(shí)現(xiàn)步驟

在考慮影響重構(gòu)閉合多邊形各條邊方向和各頂點(diǎn)位置等諸多因素的基礎(chǔ)上,本文設(shè)計(jì)算法實(shí)現(xiàn)的具體步驟為:

1)判斷多邊形是否閉合。如圖4所示,ABCD是一個具有4個頂點(diǎn)的多邊形,要將該地物的各內(nèi)角直角化,需要對閉合多邊形進(jìn)行判斷。首先必須判斷該多邊形是否閉合,若該多邊形為閉合多邊形則繼續(xù)執(zhí)行后續(xù)步驟,否則不處理。

2)判定多邊形的頂點(diǎn)個數(shù)。在繪圖軟件中,利用多段線進(jìn)行地物繪制時,當(dāng)頂點(diǎn)≥2個,即可讓該多段線閉合,而此時所繪制的地物是不能用于進(jìn)行直角糾正的,故需將頂點(diǎn)<4個的多邊形排除,不作處理。

3)判斷整個多邊形中是否有某一條邊平行于UCS的X軸或Y軸。具體方法為:①利用AutoCAD提供的方法獲取整體多段線的頂點(diǎn)坐標(biāo);②依次計(jì)算相鄰兩個點(diǎn)是否存在X坐標(biāo)或Y坐標(biāo)相等的情況,若存在,則表示該多邊形存在某一條邊平行于UCS的X軸或Y 軸,記錄該條邊并結(jié)束判斷,否則繼續(xù)判定其他頂點(diǎn)。

4)若步驟3)中判定出存在某一條邊平行于UCS的X軸或Y軸,則以該條邊為基準(zhǔn),以順指針或逆時針方向,依次從各條邊的中點(diǎn)作上一條計(jì)算結(jié)果邊的垂線,從而得到各頂點(diǎn)新的坐標(biāo)位置,待循環(huán)完成一 周則可將整個多邊形進(jìn)行直角化。

5)若步驟3)中判定為不存在某一條邊平行于UCS的X軸或Y軸,則需要計(jì)算各頂點(diǎn)處該多邊形的內(nèi)角值(圖4),并將所有內(nèi)角值與90°進(jìn)行比較,找出差值最小的一個頂點(diǎn)。

6)在與90°最接近的頂點(diǎn)處構(gòu)建一個直角,以便將該頂點(diǎn)直角化,待找出第一個頂點(diǎn)位置后,按照步驟4)循環(huán)處理每一條邊,即對整個多邊形進(jìn)行直角化。

1.4 程序流程圖

結(jié)合實(shí)際程序設(shè)計(jì),對地物進(jìn)行直角化的程序如圖5所示。

圖5 直角糾正的流程圖

2 算法實(shí)現(xiàn)與應(yīng)用效果

2.1 算法實(shí)現(xiàn)

本算法利用ObjectARX .NET編寫程序,并在AutoCAD下測試通過[7-12]。其具體的核心實(shí)現(xiàn)代碼為:

‘開始事務(wù)處理,也就是往CAD中加入東西

using (Transaction trans = tm.StartTransaction())

{

BlockTable bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);

BlockTableRecord btr = (BlockTableRecord)tm.GetObject(b t[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);

‘遍歷建立選擇實(shí)體的ObjectID集合

foreach (ObjectId obj in objs)

{

Entity ent = trans.GetObject(obj, OpenMode.ForWrite) as Entity;

if (!(ent is Polyline))

continue;

Polyline pl = ent as Polyline;

if (pl.Closed == false)

continue; ‘必須是閉合多邊形才進(jìn)行處理

Point3dCollection pts = new Point3dCollection();

pl.GetStretchPoints(pts);

for (int i = 0; i < pts.Count - 2; i++)

{

Point3d ptqian = pts[i];

Point3d pt = pts[i + 1];

Point3d pthou = pts[i + 2];

Point3d midqian = new Point3d((pt.X + ptqian.X) / 2, (pt.Y + ptqian.Y) / 2, (pt.Z + ptqian.Z) / 2);

Point3d midhou = new Point3d((pt.X + pthou.X) / 2, (pt.Y + pthou.Y) / 2, (pt.Z + pthou.Z) / 2);

Point3d pt1 = new Point3d(midqian.X, midhou.Y, pt.Z);

Point3d pt2 = new Point3d(midhou.X, midqian.Y, pt.Z);

double d1 = pt1.Convert2d(new Plane()).GetDistanceTo(pt. Convert2d(new Plane()));

double d2 = pt2.Convert2d(new Plane()).GetDistanceTo(pt. Convert2d(new Plane()));

Point3d newpt = d1 > d2 ? new Point3d(pt2.ToArray()) : new Point3d(pt1.ToArray());

‘使用新的點(diǎn)代替原始點(diǎn)

pl.RemoveVertexAt(i + 1);

pl.AddVertexAt(i + 1, newpt.Convert2d(new Plane()), pl.GetBulgeAt(i + 1), pl.GetStartWidthAt(i + 1), pl.GetEndWidthAt(i + 1));

}

‘倒數(shù)第1個點(diǎn)

Point3d ptqian1 = pts[pts.Count - 2];

Point3d pt01 = pts[pts.Count - 1];

Point3d pthou1 = pts[0];

Point3d midqian1 = new Point3d((pt01.X + ptqian1.X) / 2, (pt01.Y + ptqian1.Y) / 2, (pt01.Z + ptqian1.Z) / 2);

Point3d midhou1 = new Point3d((pt01.X + pthou1.X) / 2, (pt01.Y + pthou1.Y) / 2, (pt01.Z + pthou1.Z) / 2);

Point3d pt11 = new Point3d(midqian1.X, midhou1.Y, pt01.Z);

Point3d pt12 = new Point3d(midhou1.X, midqian1.Y, pt01.Z);

double d11 = pt11.Convert2d(new Plane()). GetDistanceTo(pt01.Convert2d(new Plane()));

double d12 = pt12.Convert2d(new Plane()). GetDistanceTo(pt01.Convert2d(new Plane()));

Point3d newpt1 = d11 > d12 ? new Point3d(pt12.ToArray()) : new Point3d(pt11.ToArray());

‘使用新的點(diǎn)代替原始點(diǎn)

pl.RemoveVertexAt(pts.Count - 1);

pl.AddVertexAt(pts.Count - 1, newpt1.Convert2d(new Plane()), pl.GetBulgeAt(pts.Count - 2), pl.GetStartWidthAt(pts. Count - 2), pl.GetEndWidthAt(pts.Count - 2));

‘第一個點(diǎn)

Point3d ptqian2 = pts[pts.Count - 1];

Point3d pt02 = pts[0];

Point3d pthou2 = pts[1];

Point3d midqian2 = new Point3d((pt02.X + ptqian2.X) / 2, (pt02.Y + ptqian2.Y) / 2, (pt02.Z + ptqian2.Z) / 2);

Point3d midhou2 = new Point3d((pt02.X + pthou2.X) / 2, (pt02.Y + pthou2.Y) / 2, (pt02.Z + pthou2.Z) / 2);

Point3d pt21 = new Point3d(midqian2.X, midhou2.Y, pt02. Z);

Point3d pt22 = new Point3d(midhou2.X, midqian2.Y, pt02. Z);

double d21 = pt21.Convert2d(new Plane()). GetDistanceTo(pt02.Convert2d(new Plane()));

double d22 = pt22.Convert2d(new Plane()). GetDistanceTo(pt02.Convert2d(new Plane()));

Point3d newpt2 = d21 > d22 ? new Point3d(pt22.ToArray()) : new Point3d(pt21.ToArray());

‘使用新的點(diǎn)代替原始點(diǎn)

pl.RemoveVertexAt(0);

pl.AddVertexAt(0, newpt2.Convert2d(new Plane()), pl.GetBulgeAt(0), pl.GetStartWidthAt(0), pl.GetEndWidthAt(0));

}

trans.Commit();

}

在AutoCAD中輸入地物直角化命令后便會出現(xiàn)如圖6所示的程序界面,在該界面中可設(shè)置多段線頂點(diǎn)偏離直角的最大允許角度,也可設(shè)置是否只處理多段線所有內(nèi)角偏離值均在限差之內(nèi)的多邊形。如果設(shè)置只處理所有內(nèi)角偏離值均在限差之內(nèi)的多邊形,則若某個多邊形的某個內(nèi)角與90°的差值大于程序界面所設(shè)值,則程序會跳過該多邊形,不作任何處理;如果未作該項(xiàng)設(shè)置,則程序會對所有多邊形進(jìn)行處理,且會對偏離值在程序設(shè)置的最大允許角度以內(nèi)的多邊形頂點(diǎn)進(jìn)行直角化,其余頂點(diǎn)保持不變。這些參數(shù)設(shè)置完成后,在AutoCAD命令行中還可選擇單個直角糾正或整體糾正,以及對全圖或單個多邊形進(jìn)行處理等。

圖6 程序運(yùn)行界面

2.2 應(yīng)用效果展示

目前,國內(nèi)生產(chǎn)單位普遍使用的數(shù)字化繪圖成圖軟件均采用AutoCAD作為平臺,所需要的地形圖數(shù)據(jù)格式也是AutoCAD的dwg格式。如果采用導(dǎo)入其他商業(yè)軟件中進(jìn)行直角糾正后再導(dǎo)入AutoCAD中的方法,不僅繁瑣,還會造成某些屬性的丟失,給客戶造成不必要的麻煩。南方CASS是基于AutoCAD開發(fā)的一款數(shù)字成圖軟件,也帶有直角糾正功能,但其直角糾正功能存在諸多問題,某些多邊形直角糾正后出現(xiàn)了嚴(yán)重錯誤,且其只能處理多段線所有內(nèi)角偏離值均在限差之內(nèi)的多邊形,不能完全滿足用戶的需要。圖7為利用本文算法編寫的程序模塊對地物進(jìn)行直角化處理后的效果圖(圖中實(shí)線為原始多邊形,虛線為直角化后的多邊形),可以看出,所有多邊形均已直角化,且每個頂點(diǎn)直角化后與原始位置偏離較小,保證了各頂點(diǎn)直角化后的位置精度。

圖7 地物直角化效果圖

利用該方法進(jìn)行地物的直角化糾正已應(yīng)用于實(shí)際生產(chǎn)中。實(shí)踐證明,該方法不僅能夠保證地物各頂點(diǎn)的精度,而且能夠滿足對于地物直角化的需求,非常高效。在筆記本電腦上做測試,對一幅包含有3 313個閉合多邊形的地形圖作直角糾正,利用該算法能夠在0.3 s內(nèi)完成直角化,這些多邊形中頂點(diǎn)最少為4個,頂點(diǎn)最多為200個。程序運(yùn)行時間隨多邊形頂點(diǎn)個數(shù)的變化而變化,且程序運(yùn)行時間均在能夠接受的范圍之內(nèi)。

3 結(jié) 語

本文對地物直角化的算法進(jìn)行了詳細(xì)介紹,并對如何選擇起始基準(zhǔn)邊和起始基準(zhǔn)頂點(diǎn)做了詳細(xì)分析和闡述。在此基礎(chǔ)上,本文對該算法進(jìn)行了具體實(shí)現(xiàn),并通過實(shí)際應(yīng)用證明了該算法能夠滿足實(shí)際生產(chǎn)需要,對地物的直角化效率高,直角化后對地物的頂點(diǎn)坐標(biāo)保持更小的偏移,大大提高了生產(chǎn)效率。但該算法仍存在一些不足,如對于邊長懸殊過大﹑某些特殊角度等情況仍可能會產(chǎn)生一定程度的問題,期望在對算法進(jìn)行改進(jìn)和優(yōu)化時,著重解決上述問題。

[1] 鐘業(yè)勛.數(shù)理地圖學(xué):地圖學(xué)及其數(shù)學(xué)原理[M].北京:測繪出版社,2007:29-68

[2] 祝國瑞.地圖學(xué)[M].武漢:武漢大學(xué)出版社,2004:36-95

[3] 何孝瑩,包紅巖,韓顏順.大比例尺掃描地形圖中房屋的識別[J].測繪與空間地理信息,2005,28(4):61-63

[4] 劉彥花,向南平.地圖掃描矢量化問題分析[J].四川測繪,2001,24(3):120-121,124

[5] 易輝偉,江資斌,周翠竹,等.地形圖矢量化的后處理[J].中國有色金屬學(xué)報,2002,12(4):808-811

[6] 龔子楨,花向紅,徐秀川,等.在CAD平臺下實(shí)現(xiàn)房屋屬性自動修改的方法[J].測繪通報,2011(9):80-82,94

[7] 蔡希林.AutoCAD2006中文版實(shí)用教程[M].北京:清華大學(xué)出版社,2006

[8] 李冠億.深居淺出AutoCAD二次開發(fā)基礎(chǔ)[M].北京:中國建筑工業(yè)出版社,2012

[9] 曾洪飛,張帆,盧擇臨.AutoCAD VBA & VB.NET開發(fā)基礎(chǔ)與實(shí)例教程[M].北京:中國電力出版社,2009

[10] 張帆,鄭立楷,王華杰,等.AutoCAD VBA 開發(fā)精彩實(shí)例教程[M].北京:清華大學(xué)出版社,2004

[11] John Sharp. Visual C#2010從入門到精通[M].周靖,譯.北京:清華大學(xué)出版社,2010

[12] 劉彬.基于.NET的AutoCAD二次開發(fā)實(shí)例[J].現(xiàn)代礦業(yè),2009(12):120-122

P283

B

1672-4623(2017)09-0041-04

10.3969/j.issn.1672-4623.2017.09.014

2017-03-07。

熊忠招,高級工程師,主要從事基礎(chǔ)測繪生產(chǎn)技術(shù)和管理工作。

猜你喜歡
二次開發(fā)測繪
淺談基于Revit平臺的二次開發(fā)
甘肅科技(2020年20期)2020-04-13 00:30:02
浙江省第一測繪院
工程測繪中GNSS測繪技術(shù)的應(yīng)用
西門子Operate高級編程的旋轉(zhuǎn)坐標(biāo)系二次開發(fā)
淺談Mastercam后處理器的二次開發(fā)
模具制造(2019年3期)2019-06-06 02:11:02
測繪新技術(shù)在測繪工程中的應(yīng)用
江西建材(2018年4期)2018-04-10 12:37:38
04 無人機(jī)測繪應(yīng)用創(chuàng)新受青睞
無人機(jī)在地形測繪中的應(yīng)用
電子制作(2017年9期)2017-04-17 03:01:00
測繪簡史
Micaps3.2 版本二次開發(fā)入門淺析
西藏科技(2015年12期)2015-09-26 12:13:51
主站蜘蛛池模板: 日韩精品无码一级毛片免费| 午夜精品久久久久久久无码软件| 亚洲第一区欧美国产综合| 人禽伦免费交视频网页播放| 精品国产www| 国产精品一区二区无码免费看片| 亚洲日韩精品无码专区97| 伊人色天堂| 婷婷色丁香综合激情| 国产精品夜夜嗨视频免费视频| 亚洲第一成人在线| 在线五月婷婷| 99久久亚洲综合精品TS| 天天躁夜夜躁狠狠躁图片| 手机在线看片不卡中文字幕| 欧美日韩精品在线播放| 在线一级毛片| 天天综合色网| 国产成人喷潮在线观看| 2022精品国偷自产免费观看| 欧美自慰一级看片免费| 国产成人精品18| 国产91在线|中文| 欧美a级在线| 乱人伦中文视频在线观看免费| 国产在线观看人成激情视频| 国产一区在线观看无码| 亚洲中文制服丝袜欧美精品| 日韩精品免费在线视频| 久久99国产精品成人欧美| 98超碰在线观看| 国产在线专区| 欧洲成人免费视频| 欧美日韩中文字幕在线| 精品国产成人三级在线观看| 亚洲va视频| 国产精品视频公开费视频| 日韩国产黄色网站| 日本尹人综合香蕉在线观看 | 国产麻豆另类AV| 日韩欧美中文| 国产精品手机在线播放| 国产精品尤物铁牛tv | 国产凹凸视频在线观看| 人妻精品久久无码区| 精品国产成人高清在线| 激情综合五月网| 亚洲成在人线av品善网好看| 青青青国产在线播放| 亚洲区第一页| 欧美日韩综合网| 亚洲欧美另类中文字幕| av尤物免费在线观看| 一级毛片在线免费视频| 亚洲精品无码久久毛片波多野吉| 色色中文字幕| 国产美女精品人人做人人爽| 9cao视频精品| 欧美综合成人| 国产成人一区二区| 久久狠狠色噜噜狠狠狠狠97视色 | 少妇精品在线| 久久一本日韩精品中文字幕屁孩| 毛片基地视频| 一本大道香蕉中文日本不卡高清二区| 999精品免费视频| 成人日韩精品| 五月天综合网亚洲综合天堂网| 日韩人妻少妇一区二区| 国产精品30p| 国产精品免费入口视频| 制服丝袜国产精品| 日韩第九页| 国产一区二区免费播放| 国产一区二区三区精品欧美日韩| 熟妇无码人妻| 在线看片免费人成视久网下载| 国产不卡国语在线| 国产日本一线在线观看免费| 114级毛片免费观看| 国产在线视频欧美亚综合| 97免费在线观看视频|