Java的List<Object>如何判断元素类别、输入流的回退,以及Autocad中参照块的坐标变换。

5 篇文章 0 订阅
2 篇文章 0 订阅

关于最近有关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度。


JavaList是一个泛型集合,它可以存储多种类型元素。如果你想判断List元素类型,可以通过以下方式: 1. 使用instanceof运算符判断元素类型 ```java List<Object> list = new ArrayList<>(); list.add("Hello"); list.add(123); list.add(true); for (Object obj : list) { if (obj instanceof String) { System.out.println("String: " + obj); } else if (obj instanceof Integer) { System.out.println("Integer: " + obj); } else if (obj instanceof Boolean) { System.out.println("Boolean: " + obj); } } ``` 在这个例子,我们通过instanceof运算符来判断List元素类型。如果元素是String类型,就打印出"String: "和元素值;如果元素是Integer类型,就打印出"Integer: "和元素值;如果元素是Boolean类型,就打印出"Boolean: "和元素值。 2. 使用Class对象判断元素类型 ```java List<Object> list = new ArrayList<>(); list.add("Hello"); list.add(123); list.add(true); for (Object obj : list) { if (String.class.isInstance(obj)) { System.out.println("String: " + obj); } else if (Integer.class.isInstance(obj)) { System.out.println("Integer: " + obj); } else if (Boolean.class.isInstance(obj)) { System.out.println("Boolean: " + obj); } } ``` 在这个例子,我们使用Class对象的isInstance方法来判断List元素类型。如果元素是String类型,就打印出"String: "和元素值;如果元素是Integer类型,就打印出"Integer: "和元素值;如果元素是Boolean类型,就打印出"Boolean: "和元素值。 总的来说,这两种方式都可以用来判断List元素类型,具体使用哪种方式取决于你的实际需求。如果你只需要判断元素类型,那么使用instanceof运算符更加简单;如果你需要进行更复杂的类型判断,可以使用Class对象的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值