Vector Difference |
NOTE Definition according to ISO/CD 10303-42:1992
This function returns the difference of the input arguments as (Arg1 - Arg2). The function returns as a vector the vector difference of the two input vectors. The input arguments shall both be of the same dimensionality but may be either directions or vectors. If both input arguments are vectors they must be expressed in the same units, if both are directions a unitless result is produced. A zero difference vector produces a vector of zero magnitude.
NOTE Function adapted from vector_different defined in ISO 10303-42.
HISTORY New function in IFC1.5
FUNCTION IfcVectorDifference
(Arg1, Arg2 : IfcVectorOrDirection)
: IfcVector;
LOCAL
Result : IfcVector;
Res, Vec1, Vec2 : IfcDirection;
Mag, Mag1, Mag2 : REAL;
Ndim : INTEGER;
END_LOCAL;
IF ((NOT EXISTS (Arg1)) OR (NOT EXISTS (Arg2))) OR (Arg1.Dim <> Arg2.Dim) THEN
RETURN (?) ;
ELSE
BEGIN
IF 'IFCGEOMETRYRESOURCE.IfcVector' IN TYPEOF(Arg1) THEN
Mag1 := Arg1\IfcVector.Magnitude;
Vec1 := Arg1\IfcVector.Orientation;
ELSE
Mag1 := 1.0;
Vec1 := Arg1;
END_IF;
IF 'IFCGEOMETRYRESOURCE.IfcVector' IN TYPEOF(Arg2) THEN
Mag2 := Arg2\IfcVector.Magnitude;
Vec2 := Arg2\IfcVector.Orientation;
ELSE
Mag2 := 1.0;
Vec2 := Arg2;
END_IF;
Vec1 := IfcNormalise (Vec1);
Vec2 := IfcNormalise (Vec2);
Ndim := SIZEOF(Vec1.DirectionRatios);
Mag := 0.0;
Res := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0:Ndim]);
REPEAT i := 1 TO Ndim;
Res.DirectionRatios[i] := Mag1*Vec1.DirectionRatios[i] - Mag2*Vec2.DirectionRatios[i];
Mag := Mag + (Res.DirectionRatios[i]*Res.DirectionRatios[i]);
END_REPEAT;
IF (Mag > 0.0 ) THEN
Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Res, SQRT(Mag));
ELSE
Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Vec1, 0.0);
END_IF;
END;
END_IF;
RETURN (Result);
END_FUNCTION;