CrossProduct() public method

get normal vector of two vector
public CrossProduct ( Vector4 v ) : Vector4
v Vector4 second vector
return Vector4
Ejemplo n.º 1
0
        /// <summary>
        /// Get wall face
        /// </summary>
        /// <param name="faces"></param>
        /// <returns></returns>
        private List <Edge> GetWallFace(List <List <Edge> > faces)
        {
            LocationCurve location = m_dataProfile.Location as LocationCurve;
            Curve         curve    = location.Curve;
            List <XYZ>    xyzs     = curve.Tessellate() as List <XYZ>;
            Vector4       zAxis    = new Vector4(0, 0, 1);

            if (xyzs.Count == 2)
            {
                return(faces[0]);
            }

            foreach (List <Edge> face in faces)
            {
                foreach (Edge edge in face)
                {
                    List <XYZ> edgexyzs = edge.Tessellate() as List <XYZ>;
                    if (xyzs.Count == edgexyzs.Count)
                    {
                        Vector4 normal = GetFaceNormal(face);
                        Vector4 cross  = Vector4.CrossProduct(zAxis, normal);
                        cross.Normalize();
                        if (cross.Length() == 1)
                        {
                            return(face);
                        }
                    }
                }
            }
            return(faces[0]);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Wall matrix
        /// </summary>
        /// <returns></returns>
        public Matrix4 WallMatrix()
        {
            //get the location curve
            LocationCurve location = m_dataProfile.Location as LocationCurve;
            Vector4       xAxis    = new Vector4(1, 0, 0);
            Vector4       yAxis    = new Vector4(0, 1, 0);
            Vector4       zAxis    = new Vector4(0, 0, 1);
            Vector4       origin   = new Vector4(0, 0, 0);

            if (location != null)
            {
                Curve curve = location.Curve;
                Autodesk.Revit.DB.XYZ start = curve.GetEndPoint(0);
                Autodesk.Revit.DB.XYZ end   = curve.GetEndPoint(1);

                xAxis = new Vector4((float)(end.X - start.X),
                                    (float)(end.Y - start.Y), (float)(end.Z - start.Z));
                xAxis.Normalize();

                yAxis = new Vector4(0, 0, 1);

                zAxis = Vector4.CrossProduct(xAxis, yAxis);
                zAxis.Normalize();

                origin = new Vector4((float)(end.X + start.X) / 2,
                                     (float)(end.Y + start.Y) / 2, (float)(end.Z + start.Z) / 2);
            }
            return(new Matrix4(xAxis, yAxis, zAxis, origin));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Get Face Normal
        /// </summary>
        /// <param name="face">Edges in a face</param>
        private Vector4 GetFaceNormal(List <Edge> face)
        {
            Edge eg0 = face[0];
            Edge eg1 = face[1];

            List <XYZ> points = eg0.Tessellate() as List <XYZ>;

            Autodesk.Revit.DB.XYZ start = points[0];
            Autodesk.Revit.DB.XYZ end   = points[1];

            Vector4 vStart = new Vector4((float)start.X, (float)start.Y, (float)start.Z);
            Vector4 vEnd   = new Vector4((float)end.X, (float)end.Y, (float)end.Z);
            Vector4 vSub   = vEnd - vStart;

            points = eg1.Tessellate() as List <XYZ>;
            start  = points[0];
            end    = points[1];

            vStart = new Vector4((float)start.X, (float)start.Y, (float)start.Z);
            vEnd   = new Vector4((float)end.X, (float)end.Y, (float)end.Z);
            Vector4 vSub2 = vEnd - vStart;

            Vector4 result = vSub.CrossProduct(vSub2);

            result.Normalize();
            return(result);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Get a matrix which can transform points to 2D
        /// </summary>
        public Matrix4 To2DMatrix()
        {
            if (m_dataProfile is Wall)
            {
                return(WallMatrix());
            }
            List <XYZ> eg0 = m_face[0].Tessellate() as List <XYZ>;
            List <XYZ> eg1 = m_face[1].Tessellate() as List <XYZ>;

            Vector4 v1 = new Vector4((float)eg0[0].X,
                                     (float)eg0[0].Y, (float)eg0[0].Z);

            Vector4 v2 = new Vector4((float)eg0[1].X,
                                     (float)eg0[1].Y, (float)eg0[1].Z);
            Vector4 v21 = v1 - v2;

            v21.Normalize();

            Vector4 v3 = new Vector4((float)eg1[0].X,
                                     (float)eg1[0].Y, (float)eg1[0].Z);

            Vector4 v4 = new Vector4((float)eg1[1].X,
                                     (float)eg1[1].Y, (float)eg1[1].Z);
            Vector4 v43 = v4 - v3;

            v43.Normalize();

            Vector4 vZAxis = Vector4.CrossProduct(v43, v21);
            Vector4 vYAxis = Vector4.CrossProduct(vZAxis, v43);

            vYAxis.Normalize();
            vZAxis.Normalize();
            Vector4 vOrigin = (v4 + v1) / 2;

            Matrix4 result = new Matrix4(v43, vYAxis, vZAxis, vOrigin);

            return(result);
        }