Normalise |
NOTE Definition according to ISO/CD 10303-42:1992
This function returns a vector or direction whose components are normalized to have a sum of squares of 1.0. The output is of the same type (Direction or Vector, with the same units) as the input argument. If the input argument is not defined or of zero length then the output vector is undefined.
NOTE Function adapted from normalise defined in ISO 10303-42.
HISTORY New function in IFC1.5
FUNCTION IfcNormalise
(Arg : IfcVectorOrDirection)
: IfcVectorOrDirection;
LOCAL
Ndim : INTEGER;
V : IfcDirection
:= IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]);
Vec : IfcVector
:= IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (
IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]), 1.);
Mag : REAL;
Result : IfcVectorOrDirection
:= V;
END_LOCAL;
IF NOT EXISTS (Arg) THEN
RETURN (?);
ELSE
IF 'IFCGEOMETRYRESOURCE.IfcVector' IN TYPEOF(Arg) THEN
BEGIN
Ndim := Arg\IfcVector.Dim;
V.DirectionRatios := Arg\IfcVector.Orientation.DirectionRatios;
Vec.Magnitude := Arg\IfcVector.Magnitude;
Vec.Orientation := V;
IF Arg\IfcVector.Magnitude = 0.0 THEN
RETURN(?);
ELSE
Vec.Magnitude := 1.0;
END_IF;
END;
ELSE
BEGIN
Ndim := Arg\IfcDirection.Dim;
V.DirectionRatios := Arg\IfcDirection.DirectionRatios;
END;
END_IF;
Mag := 0.0;
REPEAT i := 1 TO Ndim;
Mag := Mag + V.DirectionRatios[i]*V.DirectionRatios[i];
END_REPEAT;
IF Mag > 0.0 THEN
Mag := SQRT(Mag);
REPEAT i := 1 TO Ndim;
V.DirectionRatios[i] := V.DirectionRatios[i]/Mag;
END_REPEAT;
IF 'IFCGEOMETRYRESOURCE.IfcVector' IN TYPEOF(arg) THEN
Vec.Orientation := V;
Result := Vec;
ELSE
Result := V;
END_IF;
ELSE
RETURN(?);
END_IF;
END_IF;
RETURN (Result);
END_FUNCTION;