在數控系統中,我們常常會將dxf檔案轉換成g**,主要涉及到 直線、多段線、圓、圓弧、橢圓、樣條曲線、點,七大類,在轉換成g**過程中,其中樣條曲線和多段線中凸度問題是比較複雜一些,而樣條曲線的轉換網上有很多源**,而處理凸度問題的源**似乎少很多。最近剛好我也在解析dxf檔案,遇到了處理凸度的問題。我花了兩天時間集中完成這個難題。通過大量的測試**基本沒有什麼問題,凸度問題完美解決了。(其中主要的方法是運用了數學推導出來的方程計算的)
double dconvexitydegree=0; //凸度
long nsumlines = dxf_code.size();
double theta_arc;
double theta_degree ;//角度,包角
double dangle;//起點到終點的弦向量與x正方向之間的傾斜角
double dstarx=0,dstary=0;//圓弧起始點
double dendx=0,dendy=0; //圓弧終止點
double dstarc=0,dendc=0; //圓弧起始角度,終止角度
double dmiddlex=0,dmiddley=0;//起始點和終止點連線線的中點橫縱座標
double dcenterx=0,dcentery=0;//圓心座標
double dcenterx1=0,dcentery1=0;//圓心座標1
double dcenterx2=0,dcentery2=0;//圓心座標2
double dlength; //弦長
double dfr; //半徑
double dh; //圓心到弦的距離
//double k; //起始點和終止點連線的中垂線斜率
double damass; //弦向量與x軸正向單位向量的叉積
double ddirectionangel;//弦中點到圓心的直線向量的方向角(0-2pi之間)
double dd; //圓心到弦長的距離
double dnslope;弦的斜率
double dk; //弦中垂線的斜率
double dnangel;//中垂線的傾斜角
double dx,dy; //圓心相對於弦中心點的座標偏移量
double num1,num2; //x方向向量和圓心到弧線起點和終點的向量的叉乘的z
double k = 0.0;//弦的斜率
double k_verticle = 0.0;//弦的中垂線的斜率
double mid_x = 0.0,mid_y = 0.0;//弦的中點座標
double a = 1.0;
double b = 1.0;
double c = 1.0;
double anglechordx=0;//弦向量x正方向的角度
int direction=0;//判斷是g02還是g03
bool isminorarc=true;//圓弧半徑是否為較小的
double dstartvale=0; //起始角的cos(dstarc)值
double dendvale=0; //終止角的cos(dendc)值
dconvexitydegree=code.r1;
//當凸度dconvexitydegree不等於0時,表示為圓弧
if (0!=dconvexitydegree)
else
//凸度絕對值小於1表示圓弧包角小於180°,凸度絕對值大於1表示圓弧包角大於180°
if (fabs(dconvexitydegree)<=1)
isminorarc=true;
else
isminorarc=false;
//確定圓弧的順逆
if (0>dconvexitydegree)
direction=2;
else
direction=3;
//確定圓心
anglechordx=acos((1*(dendx-dstarx)+0*(dendy-dstary))/dlength)*180/pi;
if ((dendy-dstary)<0)
if ((anglechordx>0 && anglechordx<180)||anglechordx==180)
else
}else if (direction==3)//逆圓
else
}}
else
else
}else if (direction==3)//逆圓
else
}} //起始角度、終止角度
dstartvale=(dstarx-dcenterx)/dfr;
//在c++中,浮點型中的結果1可能是1.00000000000000001,避免這種情況出現。
if (dstartvale>1)
dstartvale=1;
if (dstartvale<-1)
dstartvale=-1;
dstarc = acos(dstartvale);
//x方向向量和圓心到弧線起點和終點的向量的叉乘的z
num1=dstary-dcentery;
if(num1<0)
dstarc=2*pi-dstarc;
//終止角度、終止角度
dendvale=(dendx-dcenterx)/dfr;
//在c++中,浮點型中的結果1可能是1.00000000000000001,避免這種情況出現。
if (dendvale>1)
dendvale=1;
if (dendvale<-1)
dendvale=-1;
dendc = acos(dendvale);
//x方向向量和圓心到弧線起點和終點的向量的叉乘的z
num2=dendy-dcentery;
if(num2<0)
dendc=2*pi-dendc;
//將dxf_lwpolyline轉換成arc
code.mstyle=dxf_arc;
//如果凸度小於0則為順時針,clockwise為true
if (0>dconvexitydegree)
code.bwise=true;
else
code.bwise=false;
code.x1 = dcenterx;
code.y1 = dcentery;
code.x2 = dstarc;
code.y2 = dendc;
code.r1 = dfr;
}
AutoCad 修改多段線
對於用 pline 命令建立多段線物件,使用者可使用 pedit 命令來進行修改。該命令呼叫方式為 工具欄 modify ii 修改 ii 選單 modify 修改 object 物件 polyline 多段線 命令列 pedit 或別名pe 呼叫該命令後,系統首先提示使用者選擇多段線 pedit ...
利用CAD VBA批量插入多段線
sub aa 定義乙個執行過程 dim arr as double 定義乙個空的動態陣列 m 4 隨便定乙個值 nn array 7,13,15,23 定義乙個陣列,有幾個代表最終生成幾條線,數字加1 表示線的節點 for mn 0 to ubound nn 動態定義陣列寬度 n nn mn 給數賦...
objectArx實現 點與閉合多段線的位置關係
點與閉合多段線的位置關係 射線法 從給定點出發,沿著x軸正方向或者負方向做一條射線 射線可能跟多邊形沒有交點 計算射線跟多邊形的交點數量,如果是奇數個交點,在內部 偶數個交點在外部。處理下點就在多邊形的頂點上的特例。參考objectarx vc 開發基礎與例項教程p254 author wangho...