/// <summary> /// returns the area of the polyloop /// </summary> /// <param name="loop"></param> /// <returns></returns> public static double Area(this IfcPolyLoop loop) { XbimVector3D sum = new XbimVector3D(0, 0, 0); IList<IfcCartesianPoint> pts = loop.Polygon; for (int i = 0; i < pts.Count - 1; i++) { XbimVector3D a = new XbimVector3D(pts[i].X,pts[i].Y,pts[i].Z); XbimVector3D b = new XbimVector3D(pts[i + 1].X, pts[i + 1].Y, pts[i + 1].Z); sum = sum + a.CrossProduct(b); } XbimVector3D n = loop.NewellsNormal(); return n.DotProduct(sum) / 2; }
// Two CreateRotation functions below are adapted from the implementation of getRotation in // the VisualizationLibrary SDK (sources at http://visualizationlibrary.org/ ) /// <summary> /// Creates a rotation matrix converting from a starting direction to a desired direction. /// </summary> /// <param name="fromDirection">Starting direction</param> /// <param name="toDirection">Desired direction</param> /// <returns>the matrix that applied to <see paramref="fromDirection"/> results in <see paramref="toDirection"/></returns> public static XbimMatrix3D CreateRotation(XbimPoint3D fromDirection, XbimPoint3D toDirection) { var a = new XbimVector3D(toDirection.X, toDirection.Y, toDirection.Z); var b = new XbimVector3D(fromDirection.X, fromDirection.Y, fromDirection.Z); a = a.Normalized(); b = b.Normalized(); double cosa = a.DotProduct(b); cosa = clamp(cosa, -1, +1); var axis = XbimVector3D.CrossProduct(a, b).Normalized(); double alpha = Math.Acos(cosa); return(CreateRotation(alpha, axis)); }
public static XbimMatrix3D CreateWorld(XbimVector3D position, XbimVector3D forward, XbimVector3D up) { // prepare vectors forward.Normalized(); XbimVector3D vector = forward * -1; XbimVector3D vector2 = XbimVector3D.CrossProduct(up, vector); vector2.Normalized(); XbimVector3D vector3 = XbimVector3D.CrossProduct(vector, vector2); // prepare matrix XbimMatrix3D result = new XbimMatrix3D( vector2.X, vector2.Y, vector2.Z, 0.0, vector3.X, vector3.Y, vector3.Z, 0.0, vector.X, vector.Y, vector.Z, 0.0, position.X, position.Y, position.Z, 0.0); return(result); }
// Microsoft.Xna.Framework.Matrix public static XbimMatrix3D CreateLookAt(XbimVector3D cameraPosition, XbimVector3D cameraTarget, XbimVector3D cameraUpVector) { // prepare vectors XbimVector3D vector = cameraPosition - cameraTarget; vector.Normalized(); XbimVector3D vector2 = XbimVector3D.CrossProduct(cameraUpVector, vector); vector2.Normalized(); XbimVector3D vector3 = XbimVector3D.CrossProduct(vector, vector2); // prepare matrix XbimMatrix3D result = new XbimMatrix3D( vector2.X, vector3.X, vector.X, 0.0, vector2.Y, vector3.Y, vector.Y, 0.0, vector2.Z, vector3.Z, vector.Z, 0.0, -XbimVector3D.DotProduct(vector2, cameraPosition), -XbimVector3D.DotProduct(vector3, cameraPosition), -XbimVector3D.DotProduct(vector, cameraPosition), 1.0); return(result); }
public XbimVector3D CrossProduct(XbimVector3D v2) { return(XbimVector3D.CrossProduct(this, v2)); }