The geometric representation of a horizontal alignment is accomplished with an IfcCompositeCurve. The composite curve consists of a sequence of IfcCurveSegment entities whose geometry is defined by a parent curve. This section defines the mathematical relationships and equations for each parent curve type and the algorithm for evaluating points on those curves.
Table 2.0-1 maps each IfcAlignmentHorizontalSegment.PredefinedType to its corresponding parent curve type.
Business Logic (IfcAlignmentHorizontalSegment.PredefinedType) |
Geometric Representation (IfcCurveSegment.ParentCurve) |
|---|---|
| LINE | IfcLine |
| CIRCULARARC | IfcCircle |
| CLOTHOID | IfcClothoid |
| CUBIC | IfcPolynomialCurve |
| HELMERTCURVE | IfcSecondOrderPolynomialSpiral |
| BLOSSCURVE | IfcThirdOrderPolynomialSpiral |
| COSINECURVE | IfcCosineSpiral |
| SINECURVE | IfcSineSpiral |
| VIENNESEBEND | IfcSeventhOrderPolynomialSpiral |
Table 2.0-1 — Mapping of business logic to geometric representation for horizontal alignment
This chapter covers:
- The three-step evaluation algorithm for computing position and tangent direction at any point on a horizontal curve segment.
- Parametric equations and geometry mapping examples for all nine curve types in Table 2.0-1.
- The zero-length closing segment required at the end of every
IfcCompositeCurve.
Each curve is parameterized by arc-length IfcAlignmentHorizontalSegment.StartRadiusOfCurvature and EndRadiusOfCurvature; a value of zero indicates infinite radius (zero curvature, i.e. a straight line). Radii follow a positive-left sign convention: a positive value indicates curvature to the left of the direction of travel; a negative value indicates curvature to the right. The segment length IfcAlignmentHorizontalSegment.SegmentLength. The tangent angle RefDirection of the curve at
The
This algorithm evaluates the 2D position and tangent direction of a point on an IfcCurveSegment in the alignment coordinate system. Let SegmentStart and
IfcCurveSegment.Placement, where Location and RefDirection.
Compute the position
For the point at arc-length
Apply the normalization and placement in sequence:
The position of the point in the alignment coordinate system is the fourth column of
A tangent run is geometrically represented with a segment trimmed from an IfcLine parent curve.
The curve tangent angle and curvature are given by the following equations
The point on line equation can be parameterized with a unit parameterization where the parameter
It can also be parameterized with an arc length parameterization where the parameter
Other parent curve types can also be parameterized by unit value or arc length. However, the polynomial spirals do not have a well defined unit value parameterization. For this reason, the IFC specification mandates that all parameterization for alignment geometry be by arc length. For
IfcCurveSegment, the SegmentStart and SegmentLength attributes must
be of type IfcLengthMeasure. See Section 8.9.3.28 IfcCurveSegment, Informal Proposition 1.
This matters because IfcCurveSegment.SegmentStart and
IfcCurveSegment.SegmentLength are of type IfcCurveMeasureSelect, which
can be either IfcParameterValue (a dimensionless scalar based on unit value) or
IfcLengthMeasure (a physical length).
Mapping of the semantic definition of the linear segment to the geometric definition is described with the following example.
Given a horizontal alignment segment is a line segment starting at point (500,2500), bearing in the direction S 57 E (5.70829654085293 radian) and has a length of 1956.785654.
Figure 2.3.2-1 Tangent segment
The semantic definition of this segment is:
#31=IFCCARTESIANPOINT((500.,2500.));
#32=IFCALIGNMENTHORIZONTALSEGMENT($,$,#31,5.70829654085293,0.,0.,1956.785654,$,.LINE.);
The geometric representation is an IfcLine. The line can be defined in
different ways and is generally not important, as will be shown in the
example below. IfcLine is an infinitely long line that passes through a
specified point at some direction in the X-Y plane. A valid, but unnecessarily complex parent curve is shown in Figure 2.3.2-2. The IfcLine passes through point (1000,-800) and is directed at 135° from the x-axis. The IfcCurveSegment trim starts 100 m from (1000,-800) and the trimmed segment has a length of 1956.796 m.
Figure 2.3.2-2 IfcLine at arbitrary placement
Figure 2.3.2-2 represents a valid parent curve definition and implementations must be prepared to properly interpret this parent curve geometry. This guide defines general algorithms to accommodate this geometry.
In practice, it is far easier to define the parent curve passing through point (0,0) and in the direction of the X-axis. The trimming can begin at the origin as shown in Figure 2.3.2-3.
Figure 2.3.2-3 IfcLine parent curve at origin
The parent curve definition is:
#51=IFCCARTESIANPOINT((0.,0.));
#52=IFCDIRECTION((1.,0.));
#53=IFCVECTOR(#52,1.);
#54=IFCLINE(#51,#53);
IfcCurveSegment defines the portion of the line used and how it is
placed and oriented in the X-Y plane.
IfcCurveSegment.SegmentStart defines where the parent curve trimming
begins. It can be anywhere along the line. It is easiest to begin the
trimming at the origin but could be anywhere. The SegmentStart attribute
is 0.0 in this case.
IfcCurveSegment.SegmentLength defines where the parent curve trimming
ends relative to SegmentStart. This is the length of the curve we want
to trim. The SegmentLength attribute is 1956.785654 for this example.
The SegmentStart and SegmentLength attributes trim a portion of the
IfcLine parent curve, which is oriented in the direction (1,0) with
origin at (0,0).
The trimmed portion of the curve needs to be placed and oriented into the horizontal alignment. The tangent segment begins at (500,2500) and runs in the direction 5.70829654085293 radian.
From the segment direction,
The segment placement is
#31=IFCCARTESIANPOINT((500.,2500.));
#49=IFCDIRECTION((0.839252789970355,-0.54374144087698));
#50=IFCAXIS2PLACEMENT2D(#31,#49);
The IfcCurveSegment is defined as:
#55=IFCCURVESEGMENT(.CONTSAMEGRADIENT.,#50,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(1956.785654),#54);
Compute the position matrix for a point 1500 m from the start of the curve segment.
From the IfcCurveSegment.Placement:
Because the parent curve is located at (0,0) in the direction (1,0),
Since
Evaluate the parent curve at
Though it is much easier to use the following calculation
The resulting position matrix is
Circular alignment curves are geometrically represented by an arc trimmed from an IfcCircle parent curve.
The curve tangent angle, curvature, and point on the curve are given by the following equations
IfcCircle is defined by its center (IfcCircle.Position) and radius
(IfcCircle.Radius).
Consider a horizontal curve segment that starts at (0,0), has a radius of 300 m, and an arc length of 100 m. The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 300., 300., 100., $, .CIRCULARARC.);
The parent curve can be defined as follows:
#45 = IFCCIRCLE(#46, 300.);
#46 = IFCAXIS2PLACEMENT2D(#47, #48);
#47 = IFCCARTESIANPOINT((0., 300.));
#48 = IFCDIRECTION((0., -1.));
This is a circle centered at point (0,300) with the local X-axis aligned with the negative global Y-axis as shown in Figure 2.4.2-1.
Figure 2.4.2-1 — Curve segment trimmed from an IfcCircle parent curve
The parent curve is placed such that a trim starting at 0.0 is at (0,0) and the tangent is in the direction (1,0).
The curve segment is defined by its placement at a segment trimmed from the parent curve starting at 0.0 for a length of 100.0 along the curve.
#36 = IFCCURVESEGMENT(.CONTINUOUS., #42, IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(100.), #45);
#42 = IFCAXIS2PLACEMENT2D(#43, #44);
#43 = IFCCARTESIANPOINT((0., 0.));
#44 = IFCDIRECTION((1., 0.));
Compute the placement matrix for a point 50 m from the start of the curve segment.
The trim begins where the local x-axis of the circle intersects the circumference. The circle is centered at (0,300) with radius = 300 and the local x-axis is in the direction of the global y-axis. This puts the trim start point at
Since
Compute point on parent curve at
The resulting position matrix is
Spiral transition curves are geometrically represented by a segment trimmed from one of the many spiral types in IFC. IfcClothoid geometry is used for clothoid curves.
The curve tangent angle, curvature, and point on the curve are given by the following equations
IFC provides a unit parametrization of clothoid curve.
Care must be taken when evaluating clothoids because IfcCurveSegment.SegmentStart and IfcCurveSegment.SegmentLength are defined with arc length. The details are illustrated in the example calculations.
Consider a horizontal clothoid segment that starts at (0,0) with a start direction of (1.0,0.0). The radii at the start and end of the segment are 300 and 1000, respectively. The arc length of the segment is 100. The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 300., 1000., 100., $, .CLOTHOID.);
From the semantic definition, compute the clothoid constant,
Place the parent curve at (0,0) with a tangent direction of (1,0)
#45 = IFCCLOTHOID(#46, -207.019667802706);
#46 = IFCAXIS2PLACEMENT2D(#47, $);
#47 = IFCCARTESIANPOINT((0., 0.));
The curve segment starts where the radius is 300. A positive radius indicates a counter-clockwise curve which is a curve towards the left. The distance from the origin where this radius occurs can be computed from the curvature equation. The curvature at the start is 1/300 and the clothoid constant is -207.0196678. Solve for distance from origin.
Figure 2.5.2-1 shows the parent curve clothoid with the segment having IfcCurveSegment must trim from the parent curve. The negative clothoid constant results in the parent curve in quadrants 2 and 4. The curvature is positive in quadrant 2. For this reason, the SegmentStart attribute is negative. From this starting point, the trimming progresses to a larger radius, which is towards the origin. For this reason SegmentLength is a positive value. If the trimming were to progress to a smaller radius, SegmentLength would be a negative value. The SegmentStart and SegmentLength attributes can be positive and negative values in any combination. This is true for all parent curve types.
Figure 2.5.2-1 — IfcCurveSegment trimmed from an IfcClothoid parent curve
Place the curve segment at (0,0) with the tangent in the direction (1,0).
#42 = IFCAXIS2PLACEMENT2D(#43, #44);
#43 = IFCCARTESIANPOINT((0., 0.));
#44 = IFCDIRECTION((1., 0.));
Define the curve segment
#36 = IFCCURVESEGMENT(.CONTINUOUS., #42, IFCLENGTHMEASURE(-142.857142857143), IFCLENGTHMEASURE(100.), #45);
Compute the placement matrix for a point 50 m from the start of the curve segment.
Represent IfcCurveSegment.Placement in matrix form. In this example, the
placement is at (0,0) with RefDirection (1,0) which results in an
identity matrix. This is not true in all cases.
Start by computing the point and curve tangent at the start of the parent curve trim.
Recall that the clothoid equations are in terms of a unit parameterization. Compute the parametric position on the curve.
Compute the point on curve tangent direction
and compute the point on the curve
The terms of the normalization matrix are:
Compute point and curve tangent at 50 m from the start,
In matrix form
Apply the normalization and curve segment placement to the parent curve point
IfcPolynomialCurve is the geometric type for cubic transition spirals.
The approach for calculating the coordinates of a horizontal cubic curve
is unique compared to the other curve types. For a horizontal alignment,
the coordinate point and curve tangent angle is generally defined by
parametric equations where the parameter is the distance along the
curve. A cubic curve is represented with the IfcPolynomialCurve parent
curve type. When IfcPolynomialCurve is used as a cubic transition curve,
the
The distance along a curve is defined by
This equation is solved for
-
For a distance
$u$ along the curve, find$x$ for$d - u = 0$ , within a tolerance consistent with the modeled elements. See Chapter 11 for a discussion on tolerances. -
Compute
$y(x) = A_{3}x^{3}$ -
Compute curve tangent slope as
$\frac{dy}{dx} = 3A_{3}x^{2}$
Consider a horizontal cubic transition curve segment that starts at (0,0) with a start direction of 0.0. The radius at the start is infinite and the radius at the end is 300. The arc length of the segment is 100. The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 0., 300., 100., $,.CUBIC.);
Compute the polynomial curve coefficients
The geometric representation is
#36 = IFCCURVESEGMENT(.CONTINUOUS., #42, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(100.), #45);
#42 = IFCAXIS2PLACEMENT2D(#43, #44);
#43 = IFCCARTESIANPOINT((0., 0.));
#44 = IFCDIRECTION((1., 0.));
#45 = IFCPOLYNOMIALCURVE(#46, (0., 1.), (0., 0., 0., 5.55555555555556E-6), $);
#46 = IFCAXIS2PLACEMENT2D(#47, $);
#47 = IFCCARTESIANPOINT((0., 0.));
Warning: There is a flaw in the IFC Specification. IfcAlignmentHorizontalSegment indicates the cubic formula is
$y=\frac{x^3}{6RL}$ which means theIfcPolynomialCurve.CoefficentY[3]attribute must have unit of$Length^{-2}$ . This is a direct contradiction to IfcPolynomialCurve which clearly states the coefficients are real values (i.e. scalar values) withIfcReal.Why is this a problem? The calculation of a point on the polynomial curve is different depending on how the coefficients are defined.
The parametric form of the polynomial curve is
$\lambda(u) = ( x(u), y(u), z(u) )$ . The polynomial curve represents real geometry so the resulting values,$x$ ,$y$ , and$z$ must have units of$Length$ .When
$u$ is parametrized as a Length measure, as required by IfcCurveSegment, the parametric terms of the polynomial equation are:
$$x(u) = \sum\limits_{i=0}^{l} a_i u^i$$
$$y(u) = \sum\limits_{j=0}^{m} b_j u^j$$
$$z(u) = \sum\limits_{k=0}^{n} c_k u^k$$ For
$x$ ,$y$ , and$z$ to have values in$Length$ measure, the implicit unit of measure of the coefficients must be:
$Length^{(1-i)}$ for$a_i$ $Length^{(1-j)}$ for$b_j$ $Length^{(1-k)}$ for$c_k$ When
$u$ is parametrized as a scalar, as required by IfcPolynomialCurve, the parametric terms of the polynomial equation are:
$$x(u) = L\sum\limits_{i=0}^{l} a_i u^i$$
$$y(u) = L\sum\limits_{j=0}^{m} b_j u^j$$
$$z(u) = L\sum\limits_{k=0}^{n} c_k u^k$$ The parameter
$u$ and the coefficients are scalar so they must be multiplied with the curve length$L$ to result in values of Length.The equations for
$x$ ,$y$ , and$z$ differ depending on the parameterization.Concept Template 4.2.2.1.5 Cubic Transition Segment and IfcAlignmentHorizontalSegment provide clear direction (not withstanding typographical errors) that
IfcPolynomialCurveis to be evaluated as$y = CoefficientsY[3]x^3$ which dictates that$CoefficientsY[3]$ must be in units of$Length^{-2}$ and must be encoded in theIfcPolynomialCurve.CoefficientYattribute as anIfcReal.An official Implementation Agreement does not appear to exist; however, this interpretation is consistent with discussions on GitHub [4].
Compute the curve coordinates at a distance along the curve,
Represent IfcCurveSegment.Placement in matrix form. In this example, the
placement is at (0,0) with RefDirection (1,0) which results in an
identity matrix.
Because the parent curve is located at (0,0) in the direction (1,0),
Since
Compute point and curve tangent at 100 m from the start.
From the IfcPolynomialCurve definition,
X Coefficients = (
Y Coefficients = (
Find
Solve numerically
Check solution
Compute y
The tangent vector at
Normalizing the tangent vector
The resulting matrix is
Apply the normalization and curve segment placement to the parent curve point
The Helmert curve is unique in that it is semantically defined as a single layout segment (IfcAlignmentHorizontalSegment) but geometrically defined with two curve segments (IfcCurveSegment), each representing half of the transition curve. The parent curve for a helmert transition curve is IfcSecondOrderPolynomialSpiral.
The curve tangent angle and curvature are given by the following equations
The polynomial coefficients carry a second subscript to indicate first half,
First Half
Second Half
Consider a horizontal Helmert transition curve segment that starts at (0,0) with a start direction of (1,0). The radius at the start is infinite and the radius at the end is 300. The arc length of the segment is 100. The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 0., 300., 100., $, .HELMERTCURVE.);
Compute the curve parameters
First Half
The geometric representation of the first half is
#36 = IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE., #42, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(50.), #45);
#37 = IFCLOCALPLACEMENT($, #38);
#38 = IFCAXIS2PLACEMENT3D(#39, $, $);
#39 = IFCCARTESIANPOINT((0., 0., 0.));
#42 = IFCAXIS2PLACEMENT2D(#43, #44);
#43 = IFCCARTESIANPOINT((0., 0.));
#44 = IFCDIRECTION((1., 0.));
#45 = IFCSECONDORDERPOLYNOMIALSPIRAL(#46, 114.471424255333, $, $);
#46 = IFCAXIS2PLACEMENT2D(#47, $);
#47 = IFCCARTESIANPOINT((0., 0.));
Note: when a polynomial coefficient is zero, the correspond term is unused and coded as
$in the IFC entity
Second Half
Figure 2.7.2-1 shows the first and second half parent curves, without any adjustments.
Figure 2.7.2-1 First and second half of parent curves, without placement adjustments
IfcCurveSegment evaluation normalizes the parent curve at SegmentStart, then applies the curve segment Placement. For the second half, SegmentStart = L/2, so the second half parent curve's value at Position attribute is therefore set so that the point at
With this alignment the normalization cancels the offset, and the curve segment Placement supplies only the world-space join position.
| Level | Attribute | Purpose |
|---|---|---|
IfcSecondOrderPolynomialSpiral.Position |
Shift/rotate the raw spiral so its value at |
|
IfcCurveSegment.Placement |
World-space join point | Place the normalized second-half curve at the correct position in the composite curve |
Table 2.7.2-1 — Two-level placement for the second Helmert half
Finding the parent curve Position
Evaluate the raw second half spiral (with Position at origin) at
Figure 2.7.2-2 shows the same first and second half parent curves, with the origin of the second half curve translated
Figure 2.7.2-2 — First and second half parent curves with second half curve positioned
Finding the curve segment Placement
The Placement is the world-space position and direction at the join point, obtained by rotating
For the example with
The RefDirection of the curve segment Placement is
The geometric representation of the second half
#48 = IFCCURVESEGMENT(.CONTINUOUS., #49, IFCLENGTHMEASURE(50.), IFCLENGTHMEASURE(50.), #52);
#49 = IFCAXIS2PLACEMENT2D(#50, #51);
#50 = IFCCARTESIANPOINT((49.9972443634885, 0.347204361427475));
#51 = IFCDIRECTION((0.999614222337484, 0.0277742056705088));
#52 = IFCSECONDORDERPOLYNOMIALSPIRAL(#53, -114.471424255333, 86.6025403784439, -300.);
#53 = IFCAXIS2PLACEMENT2D(#54, #55);
#54 = IFCCARTESIANPOINT((0.0115725277555399, -0.694297741112199));
#55 = IFCDIRECTION((0.998457186998745, 0.0555269820047339));
Figure 2.7.2-3 shows the trimmed and positioned first and second half parent curves resulting in the full Helmert transition curve.
Figure 2.7.2-3 — Final Helmert transition curve
Compute the curve coordinates at a distance along the curve,
The point falls in the second half (
The curve segment Placement for the second half is at
Step 2 — Evaluate the second half parent curve at SegmentStart and form the normalization matrix $M_N$
The second half parent curve has Position at
Evaluate the second half parent curve at Position) uses
Apply the parent curve Position
Note:
$\theta_{pos}(100) = \frac{1}{6} = \frac{L}{2R_e} = \frac{100}{2 \times 300}$ , confirming the total tangent angle change matches a Clothoid with the same endpoints.
Form
Apply normalization and curve segment placement:
IfcThirdOrderPolynomialSpiral is the geometric type for Bloss transition spirals.
The curve tangent angle and curvature are given by the following equations
Consider a horizontal Bloss transition curve segment that starts at (0,0) with a start direction of 0.0. The radius at the start is infinite and the radius at the end is 300. The arc length of the segment is 100. The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 0., 300., 100., $, .BLOSSCURVE.);
Compute the polynomial spiral parameters
#36 = IFCCURVESEGMENT(.CONTINUOUS., #42, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(100.), #45);
#42 = IFCAXIS2PLACEMENT2D(#43, #44);
#43 = IFCCARTESIANPOINT((0., 0.));
#44 = IFCDIRECTION((1., 0.));
#45 = IFCTHIRDORDERPOLYNOMIALSPIRAL(#46, -110.668191970032, 100., $, $);
#46 = IFCAXIS2PLACEMENT2D(#47, $);
#47 = IFCCARTESIANPOINT((0., 0.));
Compute the curve coordinates at a distance along the curve,
Represent IfcCurveSegment.Placement in matrix form. In this example, the
placement is at (0,0) with RefDirection (1,0) which results in an
identity matrix.
Because the parent curve is located at (0,0) in the direction (1,0),
Since
Compute point and curve tangent at 50 m from the start.
In matrix form
Apply the normalization and curve segment placement to the parent curve point
IfcCosineSpiral is the geometric type for cosine transition spirals.
The curve tangent angle and curvature are given by the following equations
Consider a horizontal cosine transition curve segment that starts at (0,0) with a start direction of 0.0. The radius at the start is infinite and the radius at the end is 300. The arc length of the segment is 100. The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 0., 300., 100., $, .COSINECURVE.);
Compute the cosine spiral parameters
Constant Term:
Cosine Term:
#36 = IFCCURVESEGMENT(.CONTINUOUS., #42, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(100.), #45);
#42 = IFCAXIS2PLACEMENT2D(#43, #44);
#43 = IFCCARTESIANPOINT((0., 0.));
#44 = IFCDIRECTION((1., 0.));
#45 = IFCCOSINESPIRAL(#46, -600., 600.);
#46 = IFCAXIS2PLACEMENT2D(#47, $);
#47 = IFCCARTESIANPOINT((0., 0.));
Compute the curve coordinates at a distance along the curve,
Represent IfcCurveSegment.Placement in matrix form. In this example, the
placement is at (0,0) with RefDirection (1,0) which results in an
identity matrix.
Because the parent curve is located at (0,0) in the direction (1,0),
Since
Compute point and curve tangent at 100 m from the start.
In matrix form
Apply the normalization and curve segment placement to the parent curve point
IfcSineSpiral is the geometric type for sine transition spirals.
The curve tangent angle and curvature are given by the following equations
Consider a horizontal sine transition curve segment that starts at (0,0) with a start direction of 0.0. The radius at the start is infinite and the radius at the end is 300. The arc length of the segment is 100. The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 0., 300., 100., $, .SINECURVE.);
Compute the sine spiral parameters
Constant Term:
Linear Term:
Sine Term:
#36 = IFCCURVESEGMENT(.CONTINUOUS., #42, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(100.), #45);
#42 = IFCAXIS2PLACEMENT2D(#43, #44);
#43 = IFCCARTESIANPOINT((0., 0.));
#44 = IFCDIRECTION((1., 0.));
#45 = IFCSINESPIRAL(#46, -1884.95559215388, 173.205080756888, $);
#46 = IFCAXIS2PLACEMENT2D(#47, $);
#47 = IFCCARTESIANPOINT((0., 0.));
Compute the curve coordinates at a distance along the curve,
Represent IfcCurveSegment.Placement in matrix form. In this example, the
placement is at (0,0) with RefDirection (1,0) which results in an
identity matrix.
Because the parent curve is located at (0,0) in the direction (1,0),
Since
Compute point and curve tangent at 100 m from the start.
In matrix form
Apply the normalization and curve segment placement to the parent curve point
The Viennese Bend is a transition spiral developed for high-speed railway applications. Unlike every other transition curve type in this guide — all of which define horizontal geometry purely from geometric parameters (start radius, end radius, and arc length) — the Viennese Bend incorporates vehicle dynamics: its curvature variation is shaped by the superelevation (cant) transition that accompanies it. The result is a curve that simultaneously satisfies continuity requirements for curvature, cant, and their first derivatives, producing lower lateral jerk experienced by passengers.
IfcAlignmentHorizontalSegment.GravityCenterLineHeight is required for VIENNESEBEND but is optional for all other horizontal segment types. The associated cant segment (IfcAlignmentCantSegment with PredefinedType = VIENNESEBEND) must span the same horizontal length.
The IFC geometric type is IfcSeventhOrderPolynomialSpiral.
The curve tangent angle and curvature are given by the following equations
Consider a horizontal Viennese Bend transition curve segment that starts at (0,0) with a start direction of 0.0. The radius at the start is infinite and the radius at the end is 300. The arc length is 100. The Gravity Center Line Height is 1.8 (this optional parameter is required for the Viennese Bend). The semantic definition is
#28 = IFCCARTESIANPOINT((0., 0.));
#29 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #28, 0., 0., 300., 100., 1.8, .VIENNESEBEND.);
Viennese Bend transition curves are unique in that the horizontal geometry of the curve depends on the cant. For the example, the cant segment horizontal length is 100, the start cant is 0.0 and the end cant is 0 at the left rail and 0.1 at the right rail. The semantic definition is
#64 = IFCALIGNMENTCANTSEGMENT($, $, 0., 100., 0., 0., 0., 0.1, .VIENNESEBEND.);
IfcAlignmentHorizontalSegment.GravityCenterLineHeight
IfcAlignmentCant.RailHeadDistance
IfcAlignmentCantSegment.StartCantLeft
IfcAlignmentCantSegment.EndCantLeft
IfcAlignmentCantSegment.StartCantRight
IfcAlignmentCantSegment.EndCantRight
Compute the polynomial spiral parameters
Constant term
Linear term
Quadratic term
Cubic term
Quartic term
Quintic term
Sextic term
Septic term
#66 = IFCCURVESEGMENT(.CONTINUOUS., #72, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(100.), #75);
#72 = IFCAXIS2PLACEMENT2D(#73, #74);
#73 = IFCCARTESIANPOINT((0., 0.));
#74 = IFCDIRECTION((1., 0.));
#75 = IFCSEVENTHORDERPOLYNOMIALSPIRAL(#76, -78.8880838459446, 63.7638813456506, -57.7378785242934, 64.2314061308743, 83.922298125931, -125.657906854859, $, $);
#76 = IFCAXIS2PLACEMENT2D(#77, $);
#77 = IFCCARTESIANPOINT((0., 0.));
Compute the curve coordinates at a distance along the curve,
Represent IfcCurveSegment.Placement in matrix form. In this example, the
placement is at (0,0) with RefDirection (1,0) which results in an
identity matrix.
Because the parent curve is located at (0,0) in the direction (1,0),
Since
Compute point and curve tangent at 100 m from the start.
In matrix form
Apply the normalization and curve segment placement to the parent curve point
IFC Concept Templates 4.1.4.4.1.1, 4.1.4.4.1.2, 4.1.7.1.1.1, 4.1.7.1.1.2, 4.1.7.1.1.3, and 4.1.7.1.1.4 require that the final IfcAlignmentSegment nested within IfcAlignmentHorizontal, IfcAlignmentVertical, and IfcAlignmentCant has a SegmentLength of zero. A corresponding zero-length IfcCurveSegment is required in each associated geometric representation (IfcCompositeCurve, IfcGradientCurve, or IfcSegmentedReferenceCurve).
The specification imposes no constraint on which curve type backs the zero-length geometric segment. As best practice, use .LINE. (IfcAlignmentHorizontalSegment), .CONSTANTGRADIENT. (IfcAlignmentVerticalSegment), or .CONSTANTCANT. (IfcAlignmentCantSegment) as the PredefinedType of the semantic closing segment, and an IfcLine as the parent curve of the corresponding IfcCurveSegment. The placement of both the semantic and geometric closing segments must match the endpoint and end direction of the preceding segment.
The StartPoint and StartDirection of the semantic segment are taken from the end state of the preceding segment, and SegmentLength is set to zero. One implementation strategy is to map the preceding semantic segment definition to its geometric representation as described in this chapter, as well as in Chapters 3 and 4, and evaluate it at its end point.
// Last non-zero length segment
#88=IFCCARTESIANPOINT((7790.93212831259,4006.73076454875));
#89=IFCALIGNMENTHORIZONTALSEGMENT($,$,#88,-1.23849516741382,0.,0.,2112.2850844257,$,.LINE.);
// Final segment, zero length.
#91=IFCCARTESIANPOINT((8480.,2010.));
#92=IFCALIGNMENTHORIZONTALSEGMENT($,$,#91,-1.23849516741382,0.,0.,0.,$,.LINE.);
The zero-length IfcCurveSegment is placed at the endpoint of the alignment with its axis aligned to the end tangent direction. The parent curve is an IfcLine whose point and direction vector match that placement. SegmentStart and SegmentLength are both zero. Because the segment has zero length, the choice of IfcLine here has no geometric effect — it represents a point at the end of the alignment.
// Last non-zero length segment
#169=IFCCARTESIANPOINT((0.,0.));
#170=IFCDIRECTION((1.,0.));
#171=IFCVECTOR(#170,1.);
#172=IFCLINE(#169,#171);
#173=IFCDIRECTION((0.326219162729524,-0.945294164727599));
#174=IFCAXIS2PLACEMENT2D(#88,#173);
#175=IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE.,#174,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(2112.2850844257),#172);
// Final segment, zero length
#176=IFCCARTESIANPOINT((0.,0.));
#177=IFCDIRECTION((1.,0.));
#178=IFCVECTOR(#177,1.);
#179=IFCLINE(#176,#178);
#180=IFCDIRECTION((0.326219162729524,-0.945294164727599));
#181=IFCAXIS2PLACEMENT2D(#91,#180);
#182=IFCCURVESEGMENT(.DISCONTINUOUS.,#181,IFCLENGTHMEASURE(0.),IFCLENGTHMEASURE(0.),#179);
| # | Item | Notes |
|---|---|---|
| 1 | Use IfcLengthMeasure for SegmentStart and SegmentLength on every IfcCurveSegment
|
Arc-length parameterization is mandatory per IFC schema Informal Proposition 1; IfcParameterValue (unit parameterization) is not valid for alignment geometry |
| 2 | Handle negative SegmentStart and SegmentLength
|
A negative SegmentStart locates the trim origin on the opposite side of the parent curve's reference point; a negative SegmentLength indicates trimming in the direction of decreasing parameter. Both can occur in any combination. |
| 3 | For clothoid curves, convert SegmentStart from arc-length to unit parameter before evaluating |
Compute $u = s / \left |
| 4 | Expect one IfcAlignmentHorizontalSegment with PredefinedType = HELMERTCURVE to map to two IfcCurveSegment entities |
The Helmert curve is the only horizontal type where one semantic segment produces two geometric segments; evaluate the correct half based on the query distance relative to |
| 5 | Treat IfcPolynomialCurve coefficients as having implicit units of |
For a cubic curve, CoefficientsY[3] has implicit units of |
| 6 | Viennese Bend horizontal geometry requires GravityCenterLineHeight and a paired cant segment |
IfcAlignmentHorizontalSegment.GravityCenterLineHeight is mandatory for VIENNESEBEND; the associated IfcAlignmentCantSegment with PredefinedType = VIENNESEBEND must span the same horizontal length, and its cant values enter the curvature formula via the cant factor |
| 7 | Do not assume the parent curve is centered at the origin or aligned with the x-axis | The three-step algorithm (SegmentStart locates where trimming begins regardless of the parent curve's own position and orientation |
| 8 | Apply the positive-left sign convention for radii | Positive StartRadiusOfCurvature / EndRadiusOfCurvature indicates a curve to the left of the direction of travel; negative indicates a curve to the right; zero indicates infinite radius (straight tangent) |