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对每一个环进行扫描。这种扫描将把每个环分解成一个边集--有两个顶点的简单的线串集。
下面是用提取器把一个多重几何体分解为元素的一个例子:
- // Create new extractor
- ElementExtractor e = new ElementExtractor (
- geom3d, 0, ElementExtractor.MULTICOMP_TOSIMPLE);
- // Geometry to receive extracted element(s)
- J3D_Geometry g;
- // Used to receive the type of element (1=outer, 2=inner)
- int is_a_hole[] = {0};
- // Extract the elements
- while ((g = e.nextElement(is_a_hole)) != null) {
- // Process extracted element
- }
注意,nextElement()需要一个输出参数来表示其输出的元素是外部元素还是内部元素。这个参数必须以int[]的形式定义,其第一个元素被设置成1(表示外部元素)或2(表示内部元素)。这仅适用于LOWER_LEVEL扫描,但是所有的情况中都需要输出参数。
4. 递归分解
你不需要对extractionLevel参数进行指定。如果忽略了,提取器将自动选择最合适的级别用作对几何体的分析。这使得它很容易在其成分上对几何体进行递归地分解,直到独立的线段。这将在下面的例子中得到展示:
- void decomposeGeometry (J3D_Geometry geom, int level, int seq)
- throws Exception
- {
- System.out.println ("Level: "+ level+" Sequence: "+seq);
- if ((geom.getType() == geom.GTYPE_CURVE) ||
- (geom.getType() == geom.GTYPE_POINT))
- return;
- MyElementExtractor e = new MyElementExtractor (geom);
- int i = 0;
- J3D_Geometry g;
- int h[] = {0};
- while ((g = e.nextElement(h)) != null) {
- decomposeGeometry (g, level + 1, i+1);
- i++;
- }
- }