Example #1
0
        void hodgeStar(List<leaf> _listLeaf, List<branch> _listBranch, Func<double, double> coeff,double sScale)
        {
            foreach (var branch in _listBranch)
            {
                for (int i = 0; i < branch.tuples.Count(); i++)
                {
                    double g = branch.tuples[i].gij[0, 0];
                    double val = coeff(g);
                    branch.tuples[i].SPK[0, 0] = branch.tuples[i].H[0, 0] * val*sScale;
                    /*if (branch.tuples[i].SPK[0, 0] <= 0)
                    {
                        branch.tuples[i].SPK[0, 0] = 0.00000000000001d;//E-14
                    }*/

                }
            }
            foreach (var leaf in _listLeaf)
            {
                for (int j = 0; j < leaf.r; j++)
                {
                    //Hodge star
                    double g = leaf.tuples[j].refDv * leaf.tuples[j].refDv;

                    leaf.tuples[j].SPK[0, 0] = leaf.tuples[j].H[1, 1] / g;
                    leaf.tuples[j].SPK[1, 1] = leaf.tuples[j].H[0, 0] / g;
                    leaf.tuples[j].SPK[0, 1] = -leaf.tuples[j].H[0, 1] / g;
                    leaf.tuples[j].SPK[1, 0] = -leaf.tuples[j].H[1, 0] / g;
                    leaf.tuples[j].computeEigenVectors();
                    var tup = leaf.tuples[j];
                    var det = tup.SPK[0, 0] * tup.SPK[1, 1] - tup.SPK[0, 1] * tup.SPK[1, 0];
                    /*if (tup.eigenValues[0] < 0 || tup.eigenValues[1] < 0)
                    {
                        if (tup.eigenValues[0] < 0) tup.eigenValues[0] = 0.00000000000001d;//E-14
                        if (tup.eigenValues[1] < 0) tup.eigenValues[1] = 0.00000000000001d;//E-14
                        //P
                        double A11 = tup.eigenVectorsB[0][0];
                        double A12 = tup.eigenVectorsB[0][1];
                        double A21 = tup.eigenVectorsB[1][0];
                        double A22 = tup.eigenVectorsB[1][1];
                        double det2 = A11 * A22 - A12 * A21;
                        //P^-1
                        double B11 = A22 / det2;
                        double B22 = A11 / det2;
                        double B12 = -A12 / det2;
                        double B21 = -A21 / det2;
                        double C11 = B11 * tup.eigenValues[0];
                        double C12 = B12 * tup.eigenValues[1];
                        double C21 = B21 * tup.eigenValues[0];
                        double C22 = B22 * tup.eigenValues[1];
                        double D11 = C11 * A11 + C12 * A21;
                        double D12 = C11 * A12 + C12 * A22;
                        double D21 = C21 * A11 + C22 * A21;
                        double D22 = C21 * A12 + C22 * A22;
                        tup.SPK[0, 0] = D11 * tup.Gij[0, 0] + D12 * tup.Gij[1, 0];
                        tup.SPK[0, 1] = D11 * tup.Gij[0, 1] + D12 * tup.Gij[1, 1];
                        tup.SPK[1, 0] = D21 * tup.Gij[0, 0] + D22 * tup.Gij[1, 0];
                        tup.SPK[1, 1] = D21 * tup.Gij[1, 0] + D22 * tup.Gij[1, 1];
                    }*/
                    tup.SPK[0, 0] *= sScale;
                    tup.SPK[1, 0] *= sScale;
                    tup.SPK[0, 1] *= sScale;
                    tup.SPK[1, 1] *= sScale;
                }
            }
            //For visualization
            crossMagenta.Clear();
            crossCyan.Clear();
            foreach (var leaf in listLeaf)
            {
                foreach (var tuple in leaf.tuples)
                {
                    for (int i = 0; i < 2; i++)
                    {
                        if (tuple.eigenValues[i] < 0)
                        {
                            double s = tuple.eigenValues[i]*sScale;
                            //double s = 0.1;
                            Point3d S = new Point3d(tuple.x - tuple.eigenVectors[i][0] * s, tuple.y - tuple.eigenVectors[i][1] * s, tuple.z - tuple.eigenVectors[i][2] * s);
                            Point3d E = new Point3d(tuple.x + tuple.eigenVectors[i][0] * s, tuple.y + tuple.eigenVectors[i][1] * s, tuple.z + tuple.eigenVectors[i][2] * s);
                            Line line = new Line(S, E);
                            line.Transform(zDown);
                            crossCyan.Add(line);
                        }
                        else
                        {
                            double s = tuple.eigenValues[i]*sScale;
                            //double s = 0.1;
                            Point3d S = new Point3d(tuple.x - tuple.eigenVectors[i][0] * s, tuple.y - tuple.eigenVectors[i][1] * s, tuple.z - tuple.eigenVectors[i][2] * s);
                            Point3d E = new Point3d(tuple.x + tuple.eigenVectors[i][0] * s, tuple.y + tuple.eigenVectors[i][1] * s, tuple.z + tuple.eigenVectors[i][2] * s);
                            Line line = new Line(S, E);
                            line.Transform(zDown);
                            crossMagenta.Add(line);
                        }
                    }
                }
            }
        }
Example #2
0
        private List<Line> DiamondLines(double d)
        {
            var lines = new List<Line>();
            var nodes = new List<Point3d>();

            //corner points
            nodes.Add(new Point3d(0, 0, 0));
            // face-centered points
            nodes.Add(new Point3d(0, d / 2, d / 2));
            nodes.Add(new Point3d(d / 2, 0 , d / 2));
            nodes.Add(new Point3d(d / 2, d / 2, 0));
            // others
            nodes.Add(new Point3d(d/4, d/4, d/4));

            lines.Add(new Line(nodes[4], nodes[0]));
            lines.Add(new Line(nodes[4], nodes[1]));
            lines.Add(new Line(nodes[4], nodes[2]));
            lines.Add(new Line(nodes[4], nodes[3]));

            var lines2 = new List<Line>(lines);
            foreach (var line in lines)
            {
                var newLine = new Line(line.From, line.To);
                newLine.Transform(Transform.Translation(d / 2, d / 2, 0));
                lines2.Add(newLine);
            }
            foreach (var line in lines)
            {
                var newLine = new Line(line.From, line.To);
                newLine.Transform(Transform.Rotation(Math.PI / 2, nodes[4]));
                newLine.Transform(Transform.Translation(d / 2, d / 2, d/2));
                lines2.Add(newLine);
            }
            foreach (var line in lines)
            {
                var newLine = new Line(line.From, line.To);
                newLine.Transform(Transform.Rotation(Math.PI / 2, nodes[4]));
                newLine.Transform(Transform.Translation(0, 0, d / 2));
                lines2.Add(newLine);
            }
            
            lines.AddRange(lines2);

            return lines;
        }
 public Polyline QuadFaceOffset(Point3d p1, Point3d p2, Point3d p3, Point3d p4, Vector3d N, double distance)
 {
     Point3d cen = (p1 + p2 + p3 + p4) / 4;
     Line lcen = new Line(cen, cen + N);
     double u, v;
     Line l1 = new Line(p1, p2);
     Rhino.Geometry.Intersect.Intersection.LineLine(lcen, l1, out u, out v);
     Vector3d v1 = lcen.PointAt(u) - l1.PointAt(v);
     v1.Unitize(); v1 *= distance;
     l1.Transform(Transform.Translation(v1));
     Line l2 = new Line(p2, p3);
     Rhino.Geometry.Intersect.Intersection.LineLine(lcen, l2, out u, out v);
     v1 = lcen.PointAt(u) - l2.PointAt(v);
     v1.Unitize(); v1 *= distance;
     l2.Transform(Transform.Translation(v1));
     Line l3 = new Line(p3, p4);
     Rhino.Geometry.Intersect.Intersection.LineLine(lcen, l3, out u, out v);
     v1 = lcen.PointAt(u) - l3.PointAt(v);
     v1.Unitize(); v1 *= distance;
     l3.Transform(Transform.Translation(v1));
     Line l4 = new Line(p4, p1);
     Rhino.Geometry.Intersect.Intersection.LineLine(lcen, l4, out u, out v);
     v1 = lcen.PointAt(u) - l4.PointAt(v);
     v1.Unitize(); v1 *= distance;
     l4.Transform(Transform.Translation(v1));
     Polyline output = new Polyline();
     Rhino.Geometry.Intersect.Intersection.LineLine(l1, l4, out u, out v);
     output.Add((l1.PointAt(u) + l4.PointAt(v)) / 2);
     Rhino.Geometry.Intersect.Intersection.LineLine(l2, l1, out u, out v);
     output.Add((l2.PointAt(u) + l1.PointAt(v)) / 2);
     Rhino.Geometry.Intersect.Intersection.LineLine(l3, l2, out u, out v);
     output.Add((l3.PointAt(u) + l2.PointAt(v)) / 2);
     Rhino.Geometry.Intersect.Intersection.LineLine(l4, l3, out u, out v);
     output.Add((l4.PointAt(u) + l3.PointAt(v)) / 2);
     return output;
 }
    /// <summary>
    /// Intersects an infinite line with a box volume.
    /// </summary>
    /// <param name="box">Box to intersect.</param>
    /// <param name="line">Line for intersection.</param>
    /// <param name="tolerance">
    /// If tolerance &gt; 0.0, then the intersection is performed against a box 
    /// that has each side moved out by tolerance.
    /// </param>
    /// <param name="lineParameters">
    /// The chord from line.PointAt(lineParameters.T0) to line.PointAt(lineParameters.T1) is the intersection.
    /// </param>
    /// <returns>true if the line intersects the box, false if no intersection occurs.</returns>
    public static bool LineBox(Line line, Box box, double tolerance, out Interval lineParameters)
    {
      //David: test this!
      BoundingBox bbox = new BoundingBox(new Point3d(box.X.Min, box.Y.Min, box.Z.Min),
                                         new Point3d(box.X.Max, box.Y.Max, box.Z.Max));
      Transform xform = Transform.ChangeBasis(Plane.WorldXY, box.Plane);
      line.Transform(xform);

      return LineBox(line, bbox, tolerance, out lineParameters);
    }
        ///// MeshCreation
        public Mesh MeshWindow(Mesh mesh, double t)
        {
            Mesh output = new Mesh();
            mesh.FaceNormals.ComputeFaceNormals();
            for (int i = 0; i < mesh.Faces.Count; i++)
            {
                MeshFace mf = mesh.Faces[i];
                if (mf.IsTriangle)
                {
                    Point3d p1 = mesh.Vertices[mf.A];
                    Point3d p2 = mesh.Vertices[mf.B];
                    Point3d p3 = mesh.Vertices[mf.C];
                    Line l1 = new Line(p1, p2);
                    Line l2 = new Line(p2, p3);
                    Line l3 = new Line(p3, p1);
                    Vector3d v1 = Vector3d.CrossProduct(p2 - p1, mesh.FaceNormals[i]);
                    v1.Unitize(); v1 *= -t;
                    Vector3d v2 = Vector3d.CrossProduct(p3 - p2, mesh.FaceNormals[i]);
                    v2.Unitize(); v2 *= -t;
                    Vector3d v3 = Vector3d.CrossProduct(p1 - p3, mesh.FaceNormals[i]);
                    v3.Unitize(); v3 *= -t;
                    l1.Transform(Transform.Translation(v1));
                    l2.Transform(Transform.Translation(v2));
                    l3.Transform(Transform.Translation(v3));
                    double t1, t2, t3;
                    Rhino.Geometry.Intersect.Intersection.LineLine(l1, l2, out t1, out t2);
                    p2 = (l1.PointAt(t1) + l2.PointAt(t2)) / 2;
                    Rhino.Geometry.Intersect.Intersection.LineLine(l2, l3, out t2, out t3);
                    p3 = (l3.PointAt(t3) + l2.PointAt(t2)) / 2;
                    Rhino.Geometry.Intersect.Intersection.LineLine(l3, l1, out t3, out t1);
                    p1 = (l1.PointAt(t1) + l3.PointAt(t3)) / 2;
                    int index1 = output.Vertices.Count;
                    output.Vertices.Add(p1);
                    output.Vertices.Add(p2);
                    output.Vertices.Add(p3);

                    output.Faces.AddFace(index1, index1 + 1, index1 + 2);
                }
                if (mf.IsQuad)
                {
                    Point3d p1 = mesh.Vertices[mesh.Faces[i].A];
                    Point3d p2 = mesh.Vertices[mesh.Faces[i].B];
                    Point3d p3 = mesh.Vertices[mesh.Faces[i].C];
                    Point3d p4 = mesh.Vertices[mesh.Faces[i].D];
                    Line l1 = new Line(p1, p2);
                    Line l2 = new Line(p2, p3);
                    Line l3 = new Line(p3, p4);
                    Line l4 = new Line(p4, p1);

                    Vector3d v1 = Vector3d.CrossProduct(p2 - p1, mesh.FaceNormals[i]);
                    v1.Unitize(); v1 *= -t;
                    Vector3d v2 = Vector3d.CrossProduct(p3 - p2, mesh.FaceNormals[i]);
                    v2.Unitize(); v2 *= -t;
                    Vector3d v3 = Vector3d.CrossProduct(p4 - p3, mesh.FaceNormals[i]);
                    v3.Unitize(); v3 *= -t;
                    Vector3d v4 = Vector3d.CrossProduct(p1 - p4, mesh.FaceNormals[i]);
                    v4.Unitize(); v4 *= -t;
                    l1.Transform(Transform.Translation(v1));
                    l2.Transform(Transform.Translation(v2));
                    l3.Transform(Transform.Translation(v3));
                    l4.Transform(Transform.Translation(v4));
                    double t1, t2, t3, t4;
                    Rhino.Geometry.Intersect.Intersection.LineLine(l1, l2, out t1, out t2);
                    p2 = (l1.PointAt(t1) + l2.PointAt(t2)) / 2;
                    Rhino.Geometry.Intersect.Intersection.LineLine(l2, l3, out t2, out t3);
                    p3 = (l3.PointAt(t3) + l2.PointAt(t2)) / 2;
                    Rhino.Geometry.Intersect.Intersection.LineLine(l3, l4, out t3, out t4);
                    p4 = (l4.PointAt(t4) + l3.PointAt(t3)) / 2;
                    Rhino.Geometry.Intersect.Intersection.LineLine(l4, l1, out t4, out t1);
                    p1 = (l1.PointAt(t1) + l4.PointAt(t4)) / 2;

                    int index1 = output.Vertices.Count;
                    output.Vertices.Add(p1);
                    output.Vertices.Add(p2);
                    output.Vertices.Add(p3);
                    output.Vertices.Add(p4);

                    output.Faces.AddFace(index1, index1 + 1, index1 + 2, index1 + 3);
                }

            }
            output.UnifyNormals();
            return output;
        }