从3D几何体中提取元素

7.2.3  从3D几何体中提取元素:ElementExtractor类(2)

3. 提取级别

extractionLevel参数控制提取器的操作方式。以下面的值对其进行指定。名称为在类中所定义的常量。

Level 0 = MULTICOMP_TOSIMPLE:它返回一个在多重几何体中的连续元素。例如,它将返回多立方体中的每个立方体或多重多边形中的每个多边形。可以把它想象成对元素的水平扫描。

Level 1 = INNER_OUTER:如果存在,它将返回内部/外部元素。对于多边形,它先返回外环,接着返回内环。

Level 2 = LOWER_LEVEL:它返回子元素;也就是,它返回下一个层次中的元素(例如,对立方体而言它的下一级是表面,而对于多边形而言是边,以此类推)。

让我们来看看一个有多个孔的多重多边形的简单例子。我们首先用MULTICOMP_TOSIMPLE对其进行充分的扫描。这将把这个多重多边形分解为单个简单的多边形。

下一步是从这些多边形中提取环。首先要用INNER_OUTER扫描由第一步返回的多边形。

对于无孔的多边形,结果不会变。但是对于那些有孔的多边形,你首先得到的是表示外环的多边形,然后是一个或多个表示内环的多边形。

最后,为了进一步分解几何体,用LOWER_LEVEL对每一个环进行扫描。这种扫描将把每个环分解成一个边集--有两个顶点的简单的线串集。

下面是用提取器把一个多重几何体分解为元素的一个例子:

 
 
  1. // Create new extractor  
  2. ElementExtractor e = new ElementExtractor (  
  3. geom3d, 0, ElementExtractor.MULTICOMP_TOSIMPLE);  
  4. // Geometry to receive extracted element(s)  
  5. J3D_Geometry g;  
  6. // Used to receive the type of element (1=outer, 2=inner)  
  7. int is_a_hole[] = {0};  
  8. // Extract the elements  
  9. while ((g = e.nextElement(is_a_hole)) != null) {  
  10. // Process extracted element  
  11. }  

注意,nextElement()需要一个输出参数来表示其输出的元素是外部元素还是内部元素。这个参数必须以int[]的形式定义,其第一个元素被设置成1(表示外部元素)或2(表示内部元素)。这仅适用于LOWER_LEVEL扫描,但是所有的情况中都需要输出参数。

4. 递归分解

你不需要对extractionLevel参数进行指定。如果忽略了,提取器将自动选择最合适的级别用作对几何体的分析。这使得它很容易在其成分上对几何体进行递归地分解,直到独立的线段。这将在下面的例子中得到展示:

 
 
  1. void decomposeGeometry (J3D_Geometry geom, int levelint seq)  
  2. throws Exception  
  3. {  
  4. System.out.println ("Level: "level+" Sequence: "+seq);  
  5. if ((geom.getType() == geom.GTYPE_CURVE) ||  
  6. (geom.getType() == geom.GTYPE_POINT))  
  7. return;  
  8. MyElementExtractor e = new MyElementExtractor (geom);  
  9. int i = 0;  
  10. J3D_Geometry g;  
  11. int h[] = {0};  
  12. while ((g = e.nextElement(h)) != null) {  
  13. decomposeGeometry (g, level + 1, i+1);  
  14. i++;  
  15. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值