Application module:
Tessellated geometry |
ISO/TS 10303-1819:2021(E) © ISO |

This clause specifies the information requirements for the
**Tessellated geometry**
application module. The information requirements are specified as the
Application Reference Model (ARM) of this application module.

NOTE 1 A graphical representation of the information requirements is given in Annex C.

NOTE 2 The mapping specification is specified in 5.1. It shows how the information requirements are met by using common resources and constructs defined or imported in the MIM schema of this application module.

This clause defines the information requirements to which implementations shall
conform using the EXPRESS language as defined in ISO 10303-11.
The following begins the
**Tessellated_geometry_arm**
schema and identifies the necessary external references.

*)

SCHEMA Tessellated_geometry_arm;

(*

The following EXPRESS interface statements specify the elements imported from the ARMs of other application modules.

__EXPRESS specification:__

`*)`

USE FROM
Advanced_boundary_representation_arm;
--
ISO/TS 10303-1514

```
USE FROM
Basic_curve_arm;
--
ISO/TS 10303-1651
```

```
USE FROM
Basic_geometry_arm;
--
ISO/TS 10303-1652
```

```
USE FROM
Basic_geometric_topology_arm;
--
ISO/TS 10303-1323
```

```
USE FROM
Draughting_element_arm;
--
ISO/TS 10303-1310
```

```
USE FROM
Elemental_geometric_shape_arm;
--
ISO/TS 10303-1004
```

```
USE FROM
Elemental_topology_arm;
--
ISO/TS 10303-1005
```

```
REFERENCE FROM
Foundation_representation_arm
--
ISO/TS 10303-1006
```

(using_representations);

(*

NOTE 1 The schemas referenced above are specified in the following part of ISO 10303:

Advanced_boundary_representation_armISO/TS 10303-1514 Basic_curve_armISO/TS 10303-1651 Basic_geometry_armISO/TS 10303-1652 Basic_geometric_topology_armISO/TS 10303-1323 Draughting_element_armISO/TS 10303-1310 Elemental_geometric_shape_armISO/TS 10303-1004 Elemental_topology_armISO/TS 10303-1005 Foundation_representation_armISO/TS 10303-1006

NOTE 2 See Annex C, Figures C.1, C.2, C.3, C.4and C.5 for a graphical representation of this schema.

This subclause specifies the ARM types for this application module. The ARM types and definitions are specified below.

An **angular_deviation** type specifies the maximum angular deviation of any facet in a tessellated shape model. Angular deviation is a measure of
the angle between the normal vectors at two points on a shape. The angular deviation for a given facet is the maximum angular
deviation for all pairs of points on the shape in the region being approximated by the facet.

NOTE The angular deviation of a facet may be approximated by the maximum angular deviation between the pairs of vertex normals.

__EXPRESS specification:__

```
*)
```

TYPE
angular_deviation =
plane_angle_measure;

END_TYPE;

(*

__EXPRESS specification:__

```
*)
```

TYPE
chordal_deviation =
positive_length_measure;

END_TYPE;

(*

The **edge_or_curve** type allows for the designation of the data
types
**Edge_curve** and **Curve**.

__EXPRESS specification:__

```
*)
```

TYPE
edge_or_curve =
SELECT

(Edge_curve,

Curve);

END_TYPE;

(*

The **face_or_surface** type allows for the designation of the data
types
**Face_surface** and **Surface**.

__EXPRESS specification:__

```
*)
```

TYPE
face_or_surface =
SELECT

(Face_surface,

Surface);

END_TYPE;

(*

NOTE
**length_to_height_ratio** is a criterion used
to ensure reasonable proportions of the facets and thus, ensure the regularity of a set of facets in a tessellated geometry.

__EXPRESS specification:__

```
*)
```

TYPE
length_to_height_ratio =
ratio_measure;

END_TYPE;

(*

__EXPRESS specification:__

```
*)
```

TYPE
maximum_edge_length =
positive_length_measure;

END_TYPE;

(*

The **path_or_composite_curve** type allows for the designation of the data
types
**Path** and **Composite_curve**.

__EXPRESS specification:__

```
*)
```

TYPE
path_or_composite_curve =
SELECT

(Path,

Composite_curve);

END_TYPE;

(*

NOTE
**tessellated_facet_long_short_edge_ratio** is an easily calculated
criterion used to verify that the individual facets in a tessellated geometry have edges of similar lengths.

__EXPRESS specification:__

```
*)
```

TYPE
tessellated_facet_long_short_edge_ratio =
ratio_measure;

END_TYPE;

(*

The **tessellated_edge_or_vertex** type allows for the designation of the data
types
**Tessellated_edge** and **Tessellated_vertex**.

__EXPRESS specification:__

```
*)
```

TYPE
tessellated_edge_or_vertex =
SELECT

(Tessellated_edge,

Tessellated_vertex);

END_TYPE;

(*

The **tessellation_accuracy_parameter_item** type is an
extensible list of alternate data types
that allows for the designation of the data
types **angular_deviation**, **tessellated_facet_long_short_edge_ratio**, **chordal_deviation**, **length_to_height_ratio**, and **maximum_edge_length**.

NOTE The list of entity data types may be extended in application modules that use the constructs of this module.

A **tessellation_accuracy_parameter_item**
select type identifies the entities that are used as items
in the definition of **tessellation_accuracy_parameters** of a
**Tessellated_shape_representation_with_accuracy_parameters**.

__EXPRESS specification:__

```
*)
```

TYPE
tessellation_accuracy_parameter_item =
EXTENSIBLE
SELECT

(angular_deviation,

tessellated_facet_long_short_edge_ratio,

chordal_deviation,

length_to_height_ratio,

maximum_edge_length);

END_TYPE;

(*

The **tg_draughting_callout_content_select** type is an extension
of the
**draughting_callout_content_select** type.
It adds the data
type
**Tessellated_annotation**
to the list of alternate data types.

__EXPRESS specification:__

```
*)
```

TYPE
tg_draughting_callout_content_select =
SELECT
BASED_ON
draughting_callout_content_select
WITH

(Tessellated_annotation);

END_TYPE;

(*

This subclause specifies the ARM entities for this module. Each ARM application entity is an atomic element that embodies a unique application concept and contains attributes specifying the data elements of the entity. The ARM entities and definitions are specified below.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_annotation

SUBTYPE OF (Annotation_element);

SELF\Styled_element.element : Tessellated_item;

END_ENTITY;

(*

__Attribute definitions:__

**element:
**
the
**Tessellated_item**
that is styled by the **Tessellated_annotation**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_shape_representation

SUBTYPE OF (Geometric_model);

WHERE

WR1: 'ELEMENTAL_GEOMETRIC_SHAPE_ARM.GEOMETRIC_COORDINATE_SPACE' IN TYPEOF(SELF\Representation.context_of_items);

WR2: NOT (SIZEOF(QUERY(it <* SELF.items | 'TESSELLATED_GEOMETRY_ARM.TESSELLATED_ITEM' IN TYPEOF(it))) = 0);

END_ENTITY;

(*

__Formal propositions:__

**WR1:
**
The context of the **Tessellated_shape_representation** shall be a
**Geometric_coordinate_space**.
This ensures that the coordinates used to define the points of the tessellated geometry have defined units.

**WR2:
**
The **Tessellated_shape_representation** shall shall contain at least 1 **Tessellated_item** in the **items** set.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_shape_representation_with_accuracy_parameters

SUBTYPE OF (Tessellated_shape_representation);

tessellation_accuracy_parameters : SET[1:?] OF tessellation_accuracy_parameter_item;

END_ENTITY;

(*

__Attribute definitions:__

**tessellation_accuracy_parameters:
**
the set of parameters defining the accuracy of the **Tessellated_shape_representation_with_accuracy_parameters**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_item

ABSTRACT SUPERTYPE
OF (ONEOF (Coordinates_list,

Tessellated_solid,

Tessellated_shell,

Tessellated_wire,

Tessellated_geometric_set,

Tessellated_curve_set,

Tessellated_point_set,

Tessellated_surface_set,

Tessellated_structured_item))

SUBTYPE OF (Detailed_geometric_model_element);

WHERE

WR1: SIZEOF(QUERY(using_rep <* using_representations(SELF) | NOT ('TESSELLATED_GEOMETRY_ARM.TESSELLATED_SHAPE_REPRESENTATION'
IN TYPEOF(using_rep)))) = 0;

END_ENTITY;

(*

__Formal propositions:__

**WR1:
**
A **Tessellated_item** shall only be used in a
**Tessellated_shape_representation**.

__EXPRESS specification:__

```
*)
```

ENTITY Repositioned_tessellated_item

SUBTYPE OF (Tessellated_item);

location : Axis_placement_3d;

WHERE

WR1: NOT (SIZEOF(['TESSELLATED_GEOMETRY_ARM.TESSELLATED_CURVE_SET', 'TESSELLATED_GEOMETRY_ARM.TESSELLATED_GEOMETRIC_SET',
'TESSELLATED_GEOMETRY_ARM.TESSELLATED_POINT_SET', 'TESSELLATED_GEOMETRY_ARM.TESSELLATED_SURFACE_SET',
'TESSELLATED_GEOMETRY_ARM.TESSELLATED_SHELL', 'TESSELLATED_GEOMETRY_ARM.TESSELLATED_SOLID',
'TESSELLATED_GEOMETRY_ARM.TESSELLATED_WIRE'] * TYPEOF(SELF)) = 0);

END_ENTITY;

(*

__Attribute definitions:__

**location:
**
an
**Axis_placement_3d**
defining the origin and axis direction for the coordinates of the referenced points in the **Repositioned_tessellated_item**.

__Formal propositions:__

**WR1:
**
A **Repositioned_tessellated_item** shall only be used as a complex subtype with one of the following types of
**Tessellated_item**:
a **Tessellated_curve_set**,
a **Tessellated_geometric_set**,
a **Tessellated_point_set**,
a **Tessellated_surface_set**,
a **Tessellated_shell**,
a **Tessellated_solid**,
or a
**Tessellated_wire**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_geometric_set

SUBTYPE OF (Tessellated_item);

children : SET[1:?] OF Tessellated_item;

END_ENTITY;

(*

__Attribute definitions:__

**children:
**
the individual items of tessellated geometry.

A **Tessellated_solid** is a type of
**Tessellated_item**
that is a tessellated representation of a solid model.
Its geometry is defined as a set of
**Tessellated_structured_items**.

NOTE
The
**Tessellated_structured_items**
defining the geometry may be relocated in a local coordinate system by defining a complex instance of this entity with a
**Repositioned_tessellated_item**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_solid

SUBTYPE OF (Tessellated_item);

items : SET[1:?] OF Tessellated_structured_item;

geometric_link :
OPTIONAL
Manifold_solid_brep;

END_ENTITY;

(*

__Attribute definitions:__

**items:
**
the set of
**Tessellated_structured_items**
defining the faces of the solid.

**geometric_link:
**
a corresponding exact model of the solid.
The value of this attribute need not be specified.

A **Tessellated_shell** is a type of
**Tessellated_item**
that is a tessellated representation of a shell.
Its geometry is defined as a set of
**Tessellated_structured_items**.

NOTE
The
**Tessellated_structured_items**
defining the geometry may be relocated in a local coordinate system by defining a complex instance of this entity with a
**Repositioned_tessellated_item**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_shell

SUBTYPE OF (Tessellated_item);

items : SET[1:?] OF Tessellated_structured_item;

topological_link :
OPTIONAL
Connected_face_set;

END_ENTITY;

(*

__Attribute definitions:__

**items:
**
the set of
**Tessellated_structured_items**
defining the faces of the shell.

**topological_link:
**
a
**Connected_face_set**
representing the exact geometry of the shell.
The value of this attribute need not be specified.

A **Tessellated_wire** is a type of
**Tessellated_item**
that is a tessellated representation of a collection of bounded curves joined end to end.
Its geometry is defined as a set of tessellated edges and vertices.

NOTE
The edges and vertices defining the geometry may be relocated in a local coordinate system by defining
a complex instance of this entity with a
**Repositioned_tessellated_item**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_wire

SUBTYPE OF (Tessellated_item);

items : SET[1:?] OF tessellated_edge_or_vertex;

geometric_model_link :
OPTIONAL
path_or_composite_curve;

END_ENTITY;

(*

__Attribute definitions:__

**items:
**
the set of
**tessellated_edge_or_vertexs**
defining the geometry of the wire.

**geometric_model_link:
**
the corresponding exact geometry which may be a
**path_or_composite_curve**.
The value of this attribute need not be specified.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_curve_set

SUBTYPE OF (Tessellated_item);

coordinates : Coordinates_list;

line_strips : LIST[1:?] OF LIST[2:?] OF INTEGER;

END_ENTITY;

(*

__Attribute definitions:__

**coordinates:
**
the
**Coordinates_list**
giving the coordinate values for points of the curves.

**line_strips:
**
the list of lists of integers defining the locations in the **coordinates** list of the consecutive points for each curve.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_structured_item

SUPERTYPE OF (ONEOF (Tessellated_face,

Tessellated_edge,

Tessellated_vertex))

SUBTYPE OF (Tessellated_item);

END_ENTITY;

(*

A **Tessellated_edge** is a type of
**Tessellated_structured_item**.
The geometry of the **Tessellated_edge** is approximated by straight line segments joining the points listed.

NOTE 1
A **Tessellated_edge** may be used as the boundary between two
**Tessellated_faces**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_edge

SUPERTYPE OF (ONEOF (Tessellated_connecting_edge,

Cubic_bezier_tessellated_edge))

SUBTYPE OF (Tessellated_structured_item);

coordinates : Coordinates_list;

geometric_link :
OPTIONAL
edge_or_curve;

line_strip : LIST[2:?] OF INTEGER;

END_ENTITY;

(*

__Attribute definitions:__

**coordinates:
**
the
**Coordinates_list**
giving the coordinate values for points of the **Tessellated_edge**.

**geometric_link:
**
the
**edge_or_curve**
of an exact model to which this **Tessellated_edge** corresponds.
The value of this attribute need not be specified.

**line_strip:
**
the list of integers giving the locations in the **coordinates** list of consecutive points of this edge.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_connecting_edge

SUBTYPE OF (Tessellated_edge);

smooth : LOGICAL;

face1 : Tessellated_face;

face2 : Tessellated_face;

line_strip_face1 : LIST[2:?] OF INTEGER;

line_strip_face2 : LIST[2:?] OF INTEGER;

WHERE

WR1: SIZEOF(line_strip_face1) = SIZEOF(line_strip_face2);

WR2: SIZEOF(line_strip_face1) = SIZEOF(SELF\Tessellated_edge.line_strip);

END_ENTITY;

(*

__Attribute definitions:__

**smooth:
**
a LOGICAL variable; if TRUE, there is tangent continuity where two faces join along this edge.

**face1:
**
the first
**Tessellated_face**
using this edge.

**face2:
**
the second
**Tessellated_face**
using this edge.

**line_strip_face1:
**
the list of integers giving the locations in the normals list of **face1** of the normals on the **face1** side at consecutive points of this edge, and, for connection checking, if required, the locations in the **face1** coordinates list or **face1** pnindex of consecutive points of this edge; in cases where normals are not defined for **face1**
the locations in the coordinates list are given.

**line_strip_face2:
**
the list of integers giving the locations in the normals list of **face2** of the normals on the **face2** side at consecutive points of this edge, and, for connection checking, if required, the locations in the **face2** coordinates list or **face2** pnindex of consecutive points of this edge; in cases where normals are not defined for **face2**
the locations in the coordinates list are given.

__Formal propositions:__

**WR1:
**
The **line_strip_face1** and **line_strip_face2** shall be of the same size.

**WR2:
**
The **line_strip_face1** shall be of the same size as the inherited
**line_strip**
attribute.

A **Cubic_bezier_tessellated_edge** is a type of
**Tessellated_edge** which takes the form of a piecewise cubic bezier curve. The **Cubic_bezier_tessellated_edge** has its geometry defined by a list of control points, referenced by the inherited **line_strip** attribute; in this list only the points corresponding to ends of segments lie on the edge and the list of pointers is of
length 3n +1, where n is the number of segments.

__EXPRESS specification:__

```
*)
```

ENTITY Cubic_bezier_tessellated_edge

SUBTYPE OF (Tessellated_edge);

SELF\Tessellated_edge.line_strip : LIST[4:?] OF INTEGER;

END_ENTITY;

(*

__Attribute definitions:__

**line_strip:
**
the list of 3n + 1 integers, where n is the number of cubic segments, giving the locations in the **coordinates** list of consecutive control points points of this edge.

A **Cubic_tessellated_connecting_edge** is a type of
**Cubic_bezier_tessellated_edge** which takes the form of a cubic curve and connects two **Cubic_bezier_triangulated_face**s. The **Cubic_tessellated_connecting_edge** has its geometry defined by a list of control points contained in the inherited **line_strip** attribute; in this list only the points corresponding to vertices of the cubic triangles of the adjacent faces lie on the
edge and the list of pointers is of length 3n +1, where n is the number of triangles with adjacent edges on each side of
the connecting edge.

__EXPRESS specification:__

```
*)
```

ENTITY Cubic_tessellated_connecting_edge

SUBTYPE OF (Cubic_bezier_tessellated_edge);

smooth : LOGICAL;

face1 : Cubic_bezier_triangulated_face;

face2 : Cubic_bezier_triangulated_face;

END_ENTITY;

(*

__Attribute definitions:__

**smooth:
**
a LOGICAL variable; if TRUE, there is tangent continuity where two faces join along this edge;

**face1:
**
the **Cubic_bezier_triangulated_face** to the left of this edge.

**face2:
**
the **Cubic_bezier_triangulated_face** to the right of this edge.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_point_set

SUBTYPE OF (Tessellated_item);

coordinates : Coordinates_list;

point_list : LIST[1:?] OF INTEGER;

END_ENTITY;

(*

__Attribute definitions:__

**coordinates:
**
the
**Coordinates_list**
giving the coordinate values for points of the set.

**point_list:
**
the list of locations in the **coordinates** list of the individual points of this set.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_vertex

SUBTYPE OF (Tessellated_structured_item);

coordinates : Coordinates_list;

topological_link :
OPTIONAL
Vertex_point;

point_index : INTEGER;

END_ENTITY;

(*

__Attribute definitions:__

**coordinates:
**
the
**Coordinates_list**
giving the vertex coordinate values.

**topological_link:
**
an optional link to a topological
**Vertex_point**
entity.
The value of this attribute need not be specified.

**point_index:
**
the location in the **coordinates** list of the coordinates for this vertex.

A **Tessellated_surface_set** is a type of
**Tessellated_item**
that is a tessellated representation of a collection of surfaces.

NOTE 1 If the surfaces are triangulated the geometry of the surfaces is fully defined by creating an instance of one of the subtypes.

A **Tessellated_surface_set** is either a
**Triangulated_surface_set**
or a
**Complex_triangulated_surface_set**.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_surface_set

ABSTRACT SUPERTYPE
OF (ONEOF (Triangulated_surface_set,

Complex_triangulated_surface_set))

SUBTYPE OF (Tessellated_item);

coordinates : Coordinates_list;

pnmax : INTEGER;

normals : LIST[0:?] OF LIST[3:3] OF REAL;

WHERE

WR1: ((SIZEOF(normals) = 0) OR (SIZEOF(normals) = 1) OR (SIZEOF(normals) = pnmax));

END_ENTITY;

(*

__Attribute definitions:__

**coordinates:
**
the
**Coordinates_list**
for the vertices of the triangles.

**pnmax:
**
the larger of the number of points defined with the triangles or the number of unique point and
normal combinations in the set of triangles.

NOTE 2
In the case of a **Tessellated_surface_set** with a discontinuous boundary between faces it is possible to
have more than one normal defined at a point on the boundary.

**normals:
**
the list of REAL triples defining the normals at the vertices of the triangles.
If the size of this list is greater than one the ordering of the normals is the same as the ordering used for the
pnindex.

__Formal propositions:__

**WR1:
**
The size of **normals** shall be 0, 1 or equal to **pnmax**.

NOTE 3 If size = 0 normals are undefined at all vertices, if size = 1 the normal has the same value at each vertex and the underlying surface is planar, if size is greater than 1 each triangle vertex has an individual underlying surface normal defined.

__EXPRESS specification:__

```
*)
```

ENTITY Triangulated_surface_set

SUBTYPE OF (Tessellated_surface_set);

pnindex : LIST[0:?] OF INTEGER;

triangles : LIST[1:?] OF LIST[3:3] OF INTEGER;

WHERE

WR1: ((SIZEOF(pnindex) = 0) OR (SIZEOF(pnindex) = SELF\Tessellated_surface_set.pnmax));

WR2: NOT ((SIZEOF(pnindex) = 0) AND (SELF\Tessellated_surface_set.pnmax <> coordinates.npoints));

END_ENTITY;

(*

__Attribute definitions:__

**pnindex:
**
the list of integers defining the locations in the coordinates list of the points and normals of the triangles.

NOTE 1
See
Figure 2
for further details of use of **pnindex**.

**triangles:
**
the list of INTEGER triples, in the range 1 to pnmax, giving the locations of the coordinate values in the
**coordinates**
list or **pnindex** for each triangle.
The *i*th triple in the list defines the orders in the appropriate list of the 3 vertices of the *i*th triangle.

NOTE 2
In the simplest case where no point is associated with more than 1 normal and the size of
**coordinates**
is
**pnmax**
the triangles refer directly to the
**coordinates**
list and **pnindex** is empty.

__Formal propositions:__

**WR1:
**
The size of **pnindex**, if non-zero, shall be equal to
**pnmax**.

**WR2:
**
The **pnindex** shall not be empty unless
**pnmax**
is equal to the size of the
**coordinates**
list.

NOTE 3
This option can only be used in the simple case of a local
**Coordinates_list**
and 0 or 1 normals per point.

A **Complex_triangulated_surface_set** is a type of
**Tessellated_surface_set**
defining the geometry by a set of triangles arranged in strips and fans.

NOTE 1 The ordering of the points used to define the strips or fans of triangles is shown in Figure 1.

__EXPRESS specification:__

```
*)
```

ENTITY Complex_triangulated_surface_set

SUBTYPE OF (Tessellated_surface_set);

pnindex : LIST[0:?] OF INTEGER;

triangle_strips : LIST[0:?] OF LIST[3:?] OF INTEGER;

triangle_fans : LIST[0:?] OF LIST[3:?] OF INTEGER;

WHERE

WR1: ((SIZEOF(pnindex) = 0) OR (SIZEOF(pnindex) = SELF\Tessellated_surface_set.pnmax));

WR2: NOT ((SIZEOF(pnindex) = 0) AND (SELF\Tessellated_surface_set.pnmax <> coordinates.npoints));

WR3: NOT ((SIZEOF(triangle_strips) = 0) AND (SIZEOF(triangle_fans) = 0));

END_ENTITY;

(*

__Attribute definitions:__

**pnindex:
**
the list of integers defining the locations in the
**coordinates**
list of the points and normals of the triangles.

**triangle_strips:
**
the list of lists of INTEGERs giving the locations of the coordinate values in the
**coordinates**
list for each strip of triangles.
Each sublist defines the orders in the
**coordinates**
list, via the **pnindex** if used, of the vertices of the *i*th strip of triangles.

NOTE 2 If required a single triangle can be included in this structure as a strip of one triangle, in which case the sublist will contain 3 INTEGERs.

**triangle_fans:
**
the list of lists of INTEGERs giving the locations of the coordinate values in the
**coordinates**
list for each fan of triangles.
Each sublist defines the orders in the
**coordinates**
list of the vertices of the *i*th fan of triangles.

NOTE 3
In the simplest case where no point is associated with more than 1 normal and the size of
**coordinates**
is
**pnmax**
the triangles defined by the strips and fans refer directly to the
**coordinates**
list and **pnindex** is empty.

__Formal propositions:__

**WR1:
**
The size of **pnindex**, if non-zero, shall be equal to
**pnmax**.

**WR2:
**
The **pnindex** shall not be empty unless
**pnmax**
is equal to the size of the
**coordinates**
list.

NOTE 4
This option can only be used in the simple case of a local
**Coordinates_list**
and 0 or 1 normals per point.

**WR3:
**
The **triangle_strips** list and the **triangle_fans** list shall not both be empty.

__EXPRESS specification:__

```
*)
```

ENTITY Tessellated_face

ABSTRACT SUPERTYPE
OF (ONEOF (Triangulated_face,

Complex_triangulated_face,

Cubic_bezier_triangulated_face))

SUBTYPE OF (Tessellated_structured_item);

coordinates : Coordinates_list;

pnmax : INTEGER;

normals : LIST[0:?] OF LIST[3:3] OF REAL;

geometric_link :
OPTIONAL
face_or_surface;

WHERE

WR1: ((SIZEOF(normals) = 0) OR (SIZEOF(normals) = 1) OR (SIZEOF(normals) = pnmax));

END_ENTITY;

(*

__Attribute definitions:__

**coordinates:
**
the
**Coordinates_list**
for the points of the face.

**pnmax:
**
the larger of the number of points defined with the face or the number of unique point and normal combinations in the face.

**normals:
**
the list of REAL triples defining the normals at the points of the face.
If the size of this list is greater than one the ordering of the normals is the same as the ordering used for the points
via
pnindex in one of the subtypes.

**geometric_link:
**
the face or surface of an exact model to which this **Tessellated_face** corresponds.
The value of this attribute need not be specified.

__Formal propositions:__

**WR1:
**
The size of normals shall be 0, 1 or equal to **pnmax**.

NOTE If size = 0 normals are undefined at all face points, if size = 1 the normal has the same value at each face point and the underlying surface is planar, if size is greater than 1 each point on the face has an individual underlying surface normal defined.

__EXPRESS specification:__

```
*)
```

ENTITY Triangulated_face

SUBTYPE OF (Tessellated_face);

pnindex : LIST[0:?] OF INTEGER;

triangles : LIST[1:?] OF LIST[3:3] OF INTEGER;

WHERE

WR1: ((SIZEOF(pnindex) = 0) OR (SIZEOF(pnindex) = SELF\Tessellated_face.pnmax));

WR2: NOT ((SIZEOF(pnindex) = 0) AND (SELF\Tessellated_face.pnmax <> coordinates.npoints));

END_ENTITY;

(*

__Attribute definitions:__

**pnindex:
**
the list of integers defining the locations in the
**coordinates**
list of the points and normals of the triangles of the face.

**triangles:
**
the list of INTEGER triples, in the range 1 to
**pnmax**,
giving the locations of the coordinate values in the
**coordinates**
list or in **pnindex** for each triangle.
The *i*th triple in the list defines the orders in the appropriate list of the 3 vertices of the *i*th triangle.

NOTE 1 See Figure 2 for further details of use of pnindex.

NOTE 2
In the simplest case where no point is associated with more than 1 normal and the size of
**coordinates**
is
**pnmax**
the triangles refer directly to the
**coordinates**
list and **pnindex** is empty.
In all other cases **pnindex** is required to identify points and normals for the triangles.

__Formal propositions:__

**WR1:
**
The size of **pnindex**, if non-zero, shall be equal to
**pnmax**.

**WR2:
**
The **pnindex** shall not be empty unless
**pnmax**
is equal to the size of the
**coordinates**
list.

NOTE 3
This option can only be used in the simple case of a local
**Coordinates_list**
and 0 or 1 normals per point.

A **Complex_triangulated_face** is a type of
**Tessellated_face**
defining the geometry as a set of triangles arranged in strips and fans.

NOTE 1 The ordering of the points used to define the strips or fans of triangles is shown in Figure 1.

__EXPRESS specification:__

```
*)
```

ENTITY Complex_triangulated_face

SUBTYPE OF (Tessellated_face);

pnindex : LIST[0:?] OF INTEGER;

triangle_strips : LIST[0:?] OF LIST[3:?] OF INTEGER;

triangle_fans : LIST[0:?] OF LIST[3:?] OF INTEGER;

WHERE

WR1: ((SIZEOF(pnindex) = 0) OR (SIZEOF(pnindex) = SELF\Tessellated_face.pnmax));

WR2: NOT ((SIZEOF(pnindex) = 0) AND (SELF\Tessellated_face.pnmax <> coordinates.npoints));

WR3: NOT ((SIZEOF(triangle_strips) = 0) AND (SIZEOF(triangle_fans) = 0));

END_ENTITY;

(*

__Attribute definitions:__

**pnindex:
**
the list of integers defining the locations in the
**coordinates**
list of the points and normals of the triangles.

**triangle_strips:
**
the list of lists of INTEGERs giving the locations of the coordinate values in the
**coordinates**
list for each strip of triangles.
Each sublist defines the orders in the
**coordinates**
list, via the pnindex if used, of the vertices of the *i*th strip of triangles.

NOTE 2 If required a single triangle can be included in this structure as a strip of one triangle, in which case the sublist will contain 3 INTEGERs.

**triangle_fans:
**
the list of lists of INTEGERs giving the locations of the coordinate values in the
**coordinates**
list for each fan of triangles.
Each sublist defines the orders in the
**coordinates**
list of the vertices of the *i*th fan of triangles.

NOTE 3
In the simplest case where no point is associated with more than 1 normal and the size of
**coordinates**
is
**pnmax**
the triangles defined by the strips and fans refer directly to the
**coordinates**
list and **pnindex** is empty.
In all other cases **pnindex** is required to identify points and normals for the triangles.

__Formal propositions:__

**WR1:
**
The size of **pnindex**, if non-zero, shall be equal to
**pnmax**.

**WR2:
**
The **pnindex** shall not be empty unless
**pnmax**
is equal to the size of the
**coordinates**
list.

NOTE 4
This option can only be used in the simple case of a local
**Coordinates_list**
and 0 or 1 normals per point.

**WR3:
**
The **triangle_strips** list and the **triangle_fans** list shall not both be empty.

A **Cubic_bezier_triangulated_face** is a type of
**Tessellated_face** that has its geometry defined by a set of curved triangles. Each of the triangles is a 3 sided Bezier cubic surface defined
by a list of 10 control points, 9 near the edges and one above the centre. The control points ** P _{1 }**,

**s**(u,v) = (1 - u -v)^{3}**P _{1}** + u

The parametric range for each triangle is *0 ≤ u ≤ 1; 0 ≤ v ≤ 1;* with * u + v ≤ 1. *

At each vertex the tangent along the edge of the triangle is in the direction of the next conrol point along this edge and
has a magnnitude equal to 3 times this distance. At vertex **P _{1}** the tangent vector along the edge u = 0 is

Continuity of geometry between adjacent triangles is assured provided the adjacent edges reference the same 4 control points.
Each edge of the triangle is a Bezier cubic curve of parametric length 1 defined by the 4 control points along that edge.
**P _{1}, P_{4}**,

NOTE 1 See Figure (3) for illustration of the numbering of the control points.

__EXPRESS specification:__

```
*)
```

ENTITY Cubic_bezier_triangulated_face

SUBTYPE OF (Tessellated_face);

ctriangles : LIST[1:?] OF LIST[10:10] OF INTEGER;

WHERE

WR1: SIZEOF(SELF\Tessellated_face.normals) = 0;

END_ENTITY;

(*

__Attribute definitions:__

**ctriangles:
** the list of list of 10 INTEGER pointers, giving the locations of the coordinate values of the control points for each triangle
in the **coordinates** list.

NOTE 2 The control points for each triangle are ordered as shown in Figure (3)

__Formal propositions:__

**WR1:
**
The size of **normals** list. shall be zero, the geometry of each triangle is completely defined by the control points.

__EXPRESS specification:__

```
*)
```

ENTITY Coordinates_list

SUBTYPE OF (Tessellated_item);

npoints : INTEGER;

position_coords : LIST[1:?] OF LIST[3:3] OF REAL;

WHERE

WR1: npoints = SIZEOF(position_coords);

WR2: SIZEOF(['TESSELLATED_GEOMETRY_ARM.REPOSITIONED_TESSELLATED_ITEM'] * TYPEOF(SELF)) = 0;

END_ENTITY;

(*

__Attribute definitions:__

**npoints:
**
the number of points with coordinates in the list.

**position_coords:
**
the list of real triples defining the coordinates of the points.

NOTE 1
These real triples have the semantics of
length measures,
but are not formally defined as such, the units for these are defined since a
**Tessellated_item**
is required to be used in a
**Tessellated_shape_representation**
having a
**Geometric_coordinate_space**.

__Formal propositions:__

**WR1:
**
The value of **npoints** shall be equal to the size of the **position_coords** list.

**WR2:
**
This entity shall not be instantiated as a complex subtype with
**Repositioned_tessellated_item**.

NOTE 2
This rule together with the ONEOF rule on the supertype
**Tessellated_item**
ensures that it is not instantiated with any subtype of
**Tessellated_item**.

*)

END_SCHEMA; -- Tessellated_geometry_arm

(*

© ISO 2021 — All rights reserved