Java的List<Object>如何判斷元素類別、輸入流的回退,以及Autocad中參照塊的坐標變換。
關於最近有關CAD數據的項目的一點總結
1.關於Java中的List<Object>用法。
它可以存多種不同的元素,但在取元素時怎麼判斷該元素是哪一類呢?在取元素時,可以通過調用getclass方法與類.class比較,來判斷List中的元素是哪一類。然後再將該元素進行強制類型轉換即可。
2.關於AutoCAD中數據的參照塊坐標。
dxf 文件中塊參照會有一些坐標的定義,在實體段中可以通過INSERT來插入這些參照塊。但INSERT中只有插入點的坐標,那麼如何確定參照塊各圖元的坐標呢?以及插入點是什麼意思呢?
通過計算坐標摸索出來的規律:首先插入點是參照塊中坐標原點(0,0)在INSERT後的位置。這樣的話,通過計算各個點關於坐標原點的相對關系,即可確定插入後參照塊各圖元的坐標。具體地,有各坐標軸伸縮、旋轉等變換的代碼如下:
public void shift(double sx,double sy,double xz,double cx,double cy){//x、y進行縮放,關於原點選擇xz弧度,加上插入點(即原點變換後的位置)的橫縱坐標
x=x*sx; //注意xz是弧度
y=y*sy;
double r=Math.sqrt(x*x+y*y);//點(x,y)相對於原點的長度
double yhd=0;//點相對於原點的原始弧度
if(x!=0 || y!=0) yhd=Math.acos(x/r);//必須不是原點,即r不會0時,才能除。
if(y<0) yhd=-1*yhd;//由於a度和-a度的余弦值相同,所以要通過y坐標判斷一下。 sin和cos在360度內都不是一一對應的。
x=r*Math.cos(xz+yhd)+cx;//這裡應該用r乘,而不是x或y。。。
y=r*Math.sin(xz+yhd)+cy;
}
3.關於Java中BufferReader流的讀取。如果讀取之後,經檢查不是想要的數據,但並不能簡單地丟棄,因為可能緊接的代碼就需要用到。意思就是,讀出數據之後再將其放回。怎麼做?
通過調用mark()方法來標記之前的位置,然後通過調用reset()方法來回退到上一次mark標記的流的位置。(這裡要充分考慮各種情況,不要因為mark的地方不夠或不對,造成死循環。)這個應該是和文件的緩沖區數據結構中的標記流位置變量有關。
4.關於AutoCAD中圓弧的轉換。
dxf 文件中圓弧是按照圓心、起點角度、終點角度給出的。角度是把圓心作為坐標原點然後正常二維坐標裡相對於x軸的角度。這樣很容易計算出起點和終點的坐標。但確定該弧還需要第三點,這裡可以尋找平分弧的這個點。它相對於坐標軸的角度是起點和終點角度之和的一半。然後考慮對圓心的關系即可算出坐標。這裡主要注意的是,為了不產生一個180度的誤差,在終點角度小於起點角度時,要在終點角度上加360度。
Java 9 的新特性發布 http://www.linuxidc.com/Linux/2014-08/105707.htm
Java編程思想(第4版) 中文清晰PDF完整版 http://www.linuxidc.com/Linux/2014-08/105403.htm
編寫高質量代碼 改善Java程序的151個建議 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm
Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm
Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm
Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm