亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        熊忠招,陶彣君

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

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

        熊忠招1,陶彣君1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        圖3為圖4中的頂點(diǎn)C的局部圖,∠C是與90°最為接近的角,故對(duì)該圖形進(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)差值的一半(否則會(huì)導(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 ′,此時(shí)該頂點(diǎn)變?yōu)?0°,頂點(diǎn)C的位置更改為新位置C ′,即完成了對(duì)頂點(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是一個(gè)具有4個(gè)頂點(diǎn)的多邊形,要將該地物的各內(nèi)角直角化,需要對(duì)閉合多邊形進(jìn)行判斷。首先必須判斷該多邊形是否閉合,若該多邊形為閉合多邊形則繼續(xù)執(zhí)行后續(xù)步驟,否則不處理。

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

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

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

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

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

        1.4 程序流程圖

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

        圖5 直角糾正的流程圖

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

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

        本算法利用ObjectARX .NET編寫程序,并在AutoCAD下測(cè)試通過[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個(gè)點(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));

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

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

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

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

        圖7 地物直角化效果圖

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

        3 結(jié) 語

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

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

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

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

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

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

        [6] 龔子楨,花向紅,徐秀川,等.在CAD平臺(tái)下實(shí)現(xiàn)房屋屬性自動(dòng)修改的方法[J].測(cè)繪通報(bào),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。

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

        猜你喜歡
        直角二次開發(fā)多邊形
        緣起“一線三直角”
        多邊形中的“一個(gè)角”問題
        多邊形的藝術(shù)
        淺談基于Revit平臺(tái)的二次開發(fā)
        甘肅科技(2020年20期)2020-04-13 00:30:02
        解多邊形題的轉(zhuǎn)化思想
        多少個(gè)直角
        淺談Mastercam后處理器的二次開發(fā)
        模具制造(2019年3期)2019-06-06 02:11:02
        化歸矩形證直角
        多邊形的鑲嵌
        西門子Easy Screen對(duì)倒棱機(jī)床界面二次開發(fā)
        亚洲国产综合精品中久| 久久久久亚洲av片无码v| 色噜噜av亚洲色一区二区| 国产免费久久精品国产传媒| 日韩精品欧美激情国产一区| 亚洲福利av一区二区| 蜜桃视频第一区免费观看| 亚洲人成人无码www影院| 精品av天堂毛片久久久| 中国极品少妇videossexhd| 國产AV天堂| 国产在线h视频| 一区二区三区在线观看视频免费 | 亚洲 国产 韩国 欧美 在线| 亚洲精品中文字幕乱码人妻| 国产av剧情一区二区三区| 亚洲色偷偷偷综合网| 麻豆亚洲av永久无码精品久久| 国产高清在线精品免费| 日本高清一区二区不卡视频| 日本一极品久久99精品| 色噜噜亚洲精品中文字幕| 黄片视频免费在线播放观看 | 极品美女高潮喷白浆视频| 少妇高潮无码自拍| 亚洲一区二区三区免费av| 在线观看亚洲av每日更新影片 | 性久久久久久久| 一级呦女专区毛片| 久久91精品国产91久久麻豆| 亚洲一区二区三区99| 国产三级精品三级在线观看 | 少妇被爽到自拍高潮在线观看| 日本区一区二区三视频| 在线播放免费人成毛片乱码| 美女裸体自慰在线观看| 国产丝袜美腿诱惑在线观看| 尤物精品国产亚洲亚洲av麻豆| 体验区试看120秒啪啪免费| 成人性生交片无码免费看| 亚洲AV无码久久久久调教|