Example #1
0
    private static Sphere GetCircumsphere(Tetrahedron tetra)
    {
        var p = tetra.p;

        float[][] a = new float[][] {
            new float[] { p[1].x - p[0].x, p[1].y - p[0].y, p[1].z - p[0].z },
            new float[] { p[2].x - p[0].x, p[2].y - p[0].y, p[2].z - p[0].z },
            new float[] { p[3].x - p[0].x, p[3].y - p[0].y, p[3].z - p[0].z }
        };

        float[] b =
        {
            0.5f * (p[1].x * p[1].x - p[0].x * p[0].x + p[1].y * p[1].y - p[0].y * p[0].y + p[1].z * p[1].z - p[0].z * p[0].z),
            0.5f * (p[2].x * p[2].x - p[0].x * p[0].x + p[2].y * p[2].y - p[0].y * p[0].y + p[2].z * p[2].z - p[0].z * p[0].z),
            0.5f * (p[3].x * p[3].x - p[0].x * p[0].x + p[3].y * p[3].y - p[0].y * p[0].y + p[3].z * p[3].z - p[0].z * p[0].z)
        };

        float[] x = { 0f, 0f, 0f };

        var det = Gauss(a, b, ref x);

        if (det == 0)
        {
            return(new Sphere(Vector3.zero, -1));
        }
        else
        {
            var center = new Vector3(x[0], x[1], x[2]);
            return(new Sphere(center, Vector3.Distance(center, p[0])));
        }
    }
Example #2
0
 // generate tetrahedralization of hypercube faces
 void SetTetrahedrons()
 {
     for (int i = 0; i < 4; i++)
     {
         for (int s = -1; s <= 1; s += 2)
         {
             for (int j = 0; j < 5; j++)
             {
                 Tetrahedron t = new Tetrahedron();
                 for (int k = 0; k < 4; k++)
                 {
                     Vector4 v = new Vector4();
                     v[i] = s;
                     for (int l = 0; l < 3; l++)
                     {
                         v[(i + l + 1) % 4] = CubeTetrahedralization[j, k][l];
                     }
                     t.v[k] = v;
                     //Debug.LogFormat("{0},{1},{2}:{3}", i, j, k, v);
                 }
                 tetrahedrons.Add(t);
             }
         }
     }
 }
        //protected double[,] GenerateLocalK(Tetrahedron element)
        //{
        //    int lenght = element.Nodes.Count * DEGREES_OF_FREEDOM;
        //    double[,] k = new double[lenght, lenght];
        //    Material material = MaterialStorage.Materials.FirstOrDefault(m => m.Id == element.IdMaterial);

        //    double[] b = new double[DEGREES_OF_FREEDOM + 1];
        //    double[] c = new double[DEGREES_OF_FREEDOM + 1];
        //    double[] d = new double[DEGREES_OF_FREEDOM + 1];

        //    double vol = element.VolumeWithSign();
        //    double sign = Math.Abs(vol) / vol;
        //    double G = material.ElasticModulus / (2 * (1 + material.PoissonsRatio));
        //    double h = material.PoissonsRatio * material.ElasticModulus
        //        / ((1 + material.PoissonsRatio) * (1 - 2 * material.PoissonsRatio));
        //    double r = 2 * G + h;

        //    vol = 1 / (36 * Math.Abs(vol));

        //    b[0] = -Det(element.Nodes[1].Y, element.Nodes[1].Z, element.Nodes[2].Y, element.Nodes[2].Z, element.Nodes[3].Y, element.Nodes[3].Z) * sign;
        //    b[1] = Det(element.Nodes[0].Y, element.Nodes[0].Z, element.Nodes[2].Y, element.Nodes[2].Z, element.Nodes[3].Y, element.Nodes[3].Z) * sign;
        //    b[2] = -Det(element.Nodes[0].Y, element.Nodes[0].Z, element.Nodes[1].Y, element.Nodes[1].Z, element.Nodes[3].Y, element.Nodes[3].Z) * sign;
        //    b[3] = Det(element.Nodes[0].Y, element.Nodes[0].Z, element.Nodes[1].Y, element.Nodes[1].Z, element.Nodes[2].Y, element.Nodes[2].Z) * sign;

        //    c[0] = Det(element.Nodes[1].X, element.Nodes[1].Z, element.Nodes[2].X, element.Nodes[2].Z, element.Nodes[3].X, element.Nodes[3].Z) * sign;
        //    c[1] = -Det(element.Nodes[0].X, element.Nodes[0].Z, element.Nodes[2].X, element.Nodes[2].Z, element.Nodes[3].X, element.Nodes[3].Z) * sign;
        //    c[2] = Det(element.Nodes[0].X, element.Nodes[0].Z, element.Nodes[1].X, element.Nodes[1].Z, element.Nodes[3].X, element.Nodes[3].Z) * sign;
        //    c[3] = -Det(element.Nodes[0].X, element.Nodes[0].Z, element.Nodes[1].X, element.Nodes[1].Z, element.Nodes[2].X, element.Nodes[2].Z) * sign;

        //    d[0] = -Det(element.Nodes[1].X, element.Nodes[1].Y, element.Nodes[2].X, element.Nodes[2].Y, element.Nodes[3].X, element.Nodes[3].Y) * sign;
        //    d[1] = Det(element.Nodes[0].X, element.Nodes[0].Y, element.Nodes[2].X, element.Nodes[2].Y, element.Nodes[3].X, element.Nodes[3].Y) * sign;
        //    d[2] = -Det(element.Nodes[0].X, element.Nodes[0].Y, element.Nodes[1].X, element.Nodes[1].Y, element.Nodes[3].X, element.Nodes[3].Y) * sign;
        //    d[3] = Det(element.Nodes[0].X, element.Nodes[0].Y, element.Nodes[1].X, element.Nodes[1].Y, element.Nodes[2].X, element.Nodes[2].Y) * sign;

        //    for (int i = 0; i < DEGREES_OF_FREEDOM + 1; i++)
        //    {
        //        for (int j = 0; j < DEGREES_OF_FREEDOM + 1; j++)
        //        {
        //            k[i * DEGREES_OF_FREEDOM, j * DEGREES_OF_FREEDOM] = b[i] * b[j] * r + (c[i] * c[j] + d[i] * d[j]) * G;
        //            k[i * DEGREES_OF_FREEDOM, j * DEGREES_OF_FREEDOM + 1] = b[i] * c[j] * h + c[i] * b[j] * G;
        //            k[i * DEGREES_OF_FREEDOM, j * DEGREES_OF_FREEDOM + 2] = b[i] * d[j] * h + d[i] * b[j] * G;
        //            k[i * DEGREES_OF_FREEDOM + 1, j * DEGREES_OF_FREEDOM] = c[i] * b[j] * h + b[i] * c[j] * G;
        //            k[i * DEGREES_OF_FREEDOM + 1, j * DEGREES_OF_FREEDOM + 1] = c[i] * c[j] * r + (b[i] * b[j] + d[i] * d[j]) * G;
        //            k[i * DEGREES_OF_FREEDOM + 1, j * DEGREES_OF_FREEDOM + 2] = c[i] * d[j] * h + d[i] * c[j] * G;
        //            k[i * DEGREES_OF_FREEDOM + 2, j * DEGREES_OF_FREEDOM] = d[i] * b[j] * h + b[i] * d[j] * G;
        //            k[i * DEGREES_OF_FREEDOM + 2, j * DEGREES_OF_FREEDOM + 1] = d[i] * c[j] * h + c[i] * d[j] * G;
        //            k[i * DEGREES_OF_FREEDOM + 2, j * DEGREES_OF_FREEDOM + 2] = d[i] * d[j] * r + (c[i] * c[j] + b[i] * b[j]) * G;
        //        }
        //    }

        //    k = Multiply(k, vol);
        //    return k;
        //}

        protected double[,] GenerateLocalK(Tetrahedron element)
        {
            int lenght = element.Nodes.Count * DEGREES_OF_FREEDOM;

            double[,] k = new double[lenght, lenght];

            Material material = MaterialStorage.Materials.FirstOrDefault(m => m.Id == element.IdMaterial);

            double[,] E = GenerateE(material.ElasticModulus, material.PoissonsRatio);
            double[,] Q = GenerateQ();
            double[,] B = GenerateB(element);
            double[,] N = Multiply(Q, B);

            k = Multiply(Transponate(N), E);
            k = Multiply(k, N);
            //k = Multiply(Transponate(B), Transponate(Q));
            //k = Multiply(k, E);
            //k = Multiply(k, Q);
            //k = Multiply(k, B);

            k = Multiply(k, element.Volume());
            //k = Multiply(k, element.VolumeWithSign());

            return(k);
        }
Example #4
0
    private void RenderAllInOne()
    {
        IEnumerator <Tetrahedron> toRender = Triangulation.Tetrahedrons.GetEnumerator();
        List <Vector3>            vertices = new List <Vector3>();
        List <int>   triangles             = new List <int>();
        List <Color> colors = new List <Color>();

        int i = 0;

        while (toRender.MoveNext())
        {
            Tetrahedron tetrahedron = toRender.Current;
            vertices.AddRange(tetrahedron.Vectors);
            colors.AddRange(tetrahedron.Colors);

            foreach (int x in tetrahedron.Indices)
            {
                triangles.Add(x + 4 * i);
            }

            i++;
        }

        MeshFilter filter = allMeshes.GetComponent <MeshFilter>();

        filter.mesh.vertices  = vertices.ToArray();
        filter.mesh.triangles = triangles.ToArray();
        filter.mesh.colors    = colors.ToArray();
    }
        /// <summary>
        /// Returns a random point inside the given tetrahedron.
        /// </summary>
        public static Vector3D GetRandomPoint(this Tetrahedron tetrahedron, Random random)
        {
            var s = (float)random.NextDouble();
            var t = (float)random.NextDouble();
            var u = (float)random.NextDouble();

            if (s + t > 1)
            {
                // Fold the cube into a prism:
                s = 1 - s;
                t = 1 - t;
            }

            if (t + u > 1)
            {
                // Fold the prism into a tetrahedron:
                var temp = u;
                u = 1 - s - t;
                t = 1 - temp;
            }
            else if (s + t + u > 1)
            {
                var temp = u;
                u = s + t + u - 1;
                s = 1 - t - temp;
            }

            var a = 1 - s - t - u;  // (a, s, t, u) are the barycentric coordinates of the random point.

            return((tetrahedron.Vertex1 * a) + (tetrahedron.Vertex2 * s) + (tetrahedron.Vertex3 * t) + (tetrahedron.Vertex4 * u));
        }
Example #6
0
    public List <Side> oppositeSide(Tetrahedron tetrahedron, Side side)
    {
        HashSet <int> sideEndPts    = TetraUtil.vertexIDs(side.vertices);
        HashSet <int> notSideEndPts = new HashSet <int>();

        List <Side> outputSides = new List <Side>();

        foreach (Tetrahedron t in tetrahedrons)
        {
            if (t.type != 2)
            {
                if (t.sides.Contains(side))
                {
                    HashSet <int> tempSet = TetraUtil.vertexIDs(t.vertices);
                    notSideEndPts.UnionWith(tempSet.Except(sideEndPts));
                }

                foreach (Side s in t.sides)
                {
                    HashSet <int> tempSideVtx = TetraUtil.vertexIDs(s.vertices);

                    tempSideVtx.IntersectWith(notSideEndPts);

                    if (tempSideVtx.Count == 2)
                    {
                        outputSides.Add(s);
                    }
                }
            }
        }

        return(outputSides);
    }
 private void UpdateTriangulation(Measurement3D measurement, List <Tetrahedron> badTetrahedrons, List <Triangle> polygon)
 {
     //   for each triangle in badTriangles do // remove them from the data structure
     foreach (Tetrahedron tetrahedron in badTetrahedrons)
     {
         //          remove triangle from triangulation
         Triangulation.Remove(tetrahedron);
     }
     //   for each edge in polygon do // re-triangulate the polygonal hole
     foreach (Triangle triangle in polygon)
     {
         //      newTri:= form a triangle from edge to point
         //     add newTri to triangulation
         if (triangle.InSamePlane(measurement))
         {
             Debug.Log("In same plane");
             continue;
         }
         Tetrahedron tetrahedron = new Tetrahedron(
             measurement,
             triangle.a,
             triangle.b,
             triangle.c);
         Triangulation.Add(tetrahedron);
     }
 }
        protected double[,] GenerateA(Tetrahedron element)
        {
            int lenght = element.Nodes.Count * DEGREES_OF_FREEDOM;

            double[,] A = new double[lenght, lenght];

            for (int i = 0; i < element.Nodes.Count; i++)
            {
                A[i * 3, 0] = 1.0f;
                A[i * 3, 1] = element.Nodes[i].X;
                A[i * 3, 2] = element.Nodes[i].Y;
                A[i * 3, 3] = element.Nodes[i].Z;

                A[i * 3 + 1, 4] = 1.0f;
                A[i * 3 + 1, 5] = element.Nodes[i].X;
                A[i * 3 + 1, 6] = element.Nodes[i].Y;
                A[i * 3 + 1, 7] = element.Nodes[i].Z;

                A[i * 3 + 2, 8]  = 1.0f;
                A[i * 3 + 2, 9]  = element.Nodes[i].X;
                A[i * 3 + 2, 10] = element.Nodes[i].Y;
                A[i * 3 + 2, 11] = element.Nodes[i].Z;
            }

            return(A);
        }
Example #9
0
        public static ThreeDShape GetThreeDShape()
        {
            Random random = new Random();

            int whichShape = random.Next(1, 4);

            if (whichShape == 1)
            {
                Cube cube = new Cube(random.Next(1, 10));

                return(cube);
            }

            if (whichShape == 2)
            {
                Sphere sphere = new Sphere(random.Next(1, 10));

                return(sphere);
            }



            Tetrahedron tetrahedron = new Tetrahedron(random.Next(1, 10));

            return(tetrahedron);
        }
Example #10
0
    // Use this for initialization
    void Start()
    {
        rend = gameObject.GetComponent<Renderer>();
        //mat = new Material(Shader.Find("Standard"));
        //rend = new Renderer();
        //rend.material = mat;
        gMO = GameObject.Find("GameManager");
        gM = gMO.GetComponent<GameManager>();
        tetrahedron  = gameObject.GetComponent<Tetrahedron>();
        octahedron   = gameObject.GetComponent<Octahedron>();
        dodecahedron = gameObject.GetComponent<Dodecahedron>();
        icosahedron  = gameObject.GetComponent<Icosahedron>();

        counter = (int)Random.Range(1f, 5f);
        if(counter == 5)
            counter = 4;

        if(counter == 1)
            tetrahedron.MakeMesh();
        if(counter == 2)
            octahedron.MakeMesh();
        if(counter == 3)
            dodecahedron.MakeMesh();
        if(counter == 4)
            icosahedron.MakeMesh();

        gM.ZombiePlus();
    }
Example #11
0
 public void ValidTetrahedron()
 {
     var solid = new Tetrahedron()
     {
         Size = new SharpDX.Vector3(1.0f, 1.0f, 1.0f)
     };
 }
Example #12
0
    public static void tetrahedron_num_test()

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    TETRAHEDRON_NUM_TEST tests TETRAHEDRON_NUM.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    23 May 2007
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        int n;

        Console.WriteLine("");
        Console.WriteLine("TETRAHEDRON_NUM_TEST");
        Console.WriteLine("  TETRAHEDRON_NUM computes the tetrahedron numbers.");
        Console.WriteLine("");

        for (n = 1; n <= 10; n++)
        {
            Console.WriteLine("  "
                              + n.ToString().PadLeft(4) + "  "
                              + Tetrahedron.tetrahedron_num(n).ToString().PadLeft(6) + "");
        }
    }
        /*[Input("Size",DefaultValues= new double[] { 1,1,1})]
         * IDiffSpread<Vector3> FSize;*/

        protected override DX11IndexedGeometry GetGeom(DX11RenderContext context, int slice)
        {
            Tetrahedron settings = new Tetrahedron();

            settings.Size = new Vector3(1, 1, 1);

            return(context.Primitives.Tetrahedron(settings));
        }
Example #14
0
 bool IsWithinCircumsphereBounds(Vector3 pos, Tetrahedron tetra)
 {
     if (Vector3.Distance(pos, tetra.Circumcenter) <= tetra.Circumradius)
     {
         return(true);
     }
     return(false);
 }
Example #15
0
        protected override DX11IndexedGeometry GetGeom(DX11RenderContext context, int slice)
        {
            Tetrahedron settings = new Tetrahedron();

            settings.Radius = this.FSize[slice];

            return(context.Primitives.Tetrahedron(settings));
        }
        /// <summary>
        /// Returns the volume of the given tetrahedron.
        /// </summary>
        public static float GetVolume(this Tetrahedron tetrahedron)
        {
            var a = tetrahedron.Vertex2 - tetrahedron.Vertex1;
            var b = tetrahedron.Vertex3 - tetrahedron.Vertex1;
            var c = tetrahedron.Vertex4 - tetrahedron.Vertex1;

            return(Math.Abs(a.CrossProduct(b).DotProduct(c)) / 6);
        }
Example #17
0
    public void support(int pointIndex_, Tetrahedron tetrahedron_, Vector3 direction_)
    {
        Vector3 newPoint = tetrahedron_.getFarthestPointInDirection(direction_);

        if (pointIndex_ < 4)                    //Make sure the index isn't more than 4, to assure we only have 4 points
        {
            pointsList[pointIndex_] = newPoint; //using an array and the pointIndex, we can swap points!
        }
    }
Example #18
0
    static void Create()
    {
        GameObject  gameObject = new GameObject("Tetrahedron");
        Tetrahedron s          = gameObject.AddComponent <Tetrahedron>();
        MeshFilter  meshFilter = gameObject.GetComponent <MeshFilter>();

        meshFilter.mesh = new Mesh();
        s.Rebuild();
    }
Example #19
0
    public List <TetraPart> getTetraParts(List <List <int> > fragments,
                                          out List <Tetrahedron> fracTetras,
                                          out List <Plane> fracPlanes)
    {
        List <TetraPart> tetraParts = new List <TetraPart>();

        for (int i = 0; i < fragments.Count; i++)
        {
            tetraParts.Add(new TetraPart());
        }

        for (int i = 0; i < nodeIndexOfTetra.Count; i++)
        {
            if (!damagedNodes.Contains(i))
            {
                int node = nodeIndexOfTetra[i].a;
                for (int j = 0; j < fragments.Count; j++)
                {
                    if (fragments[j].Contains(node))
                    {
                        List <Vector3> tetrList = new List <Vector3>();
                        tetrList.Add(nodes[nodeIndexOfTetra[i].a]);
                        tetrList.Add(nodes[nodeIndexOfTetra[i].b]);
                        tetrList.Add(nodes[nodeIndexOfTetra[i].c]);
                        tetrList.Add(nodes[nodeIndexOfTetra[i].d]);
                        tetraParts[j].PushBackTetra(tetrList);
                        break;
                    }
                }
            }
        }

        fracTetras = new List <Tetrahedron>();
        fracPlanes = new List <Plane>();
        foreach (int i in damagedNodes)
        {
            Tetrahedron fracTetra = getFractureTetra(i);
            Plane       fracPlane = getFracturePlane(i);
            if (fracPlane.normal.sqrMagnitude > 1e-6)
            {
                fracTetras.Add(fracTetra);
                fracPlanes.Add(fracPlane);
            }
            else
            {
                tetraParts[tetraParts.Count - 1].PushBackTetra(new List <Vector3>
                {
                    fracTetra.tetra[0],
                    fracTetra.tetra[1],
                    fracTetra.tetra[2],
                    fracTetra.tetra[3]
                });
            }
        }

        return(tetraParts);
    }
Example #20
0
        public static void TetraPost()
        {
            var t = new Tetrahedron();

            //t.Settings.Calculation.MaxDataPoints = 1000000;
            t.Settings.Calculation.MaxDataPoints = 10000000;
            t.Settings.Calculation.FrameCount    = 10;
            t.StartRender("tetraAnimPost2");
        }
Example #21
0
    void Start()
    {
        rotationSpeed = Random.Range(-5f, 5f);
        rend          = gameObject.GetComponent <Renderer>();

        tetrahedron  = gameObject.GetComponent <Tetrahedron>();
        octahedron   = gameObject.GetComponent <Octahedron>();
        dodecahedron = gameObject.GetComponent <Dodecahedron>();
        icosahedron  = gameObject.GetComponent <Icosahedron>();
    }
Example #22
0
 // END CUT HERE
 // BEGIN CUT HERE
 public static void Main()
 {
     try {
     Tetrahedron ___test = new Tetrahedron();
     ___test.run_test(-1);
     } catch(Exception e) {
     //Console.WriteLine(e.StackTrace);
     Console.WriteLine(e.ToString());
     }
 }
Example #23
0
        public static void TetraPostNoRepeat()
        {
            var t = new Tetrahedron();

            //t.Settings.Calculation.MaxDataPoints = 1000000;
            t.Settings.Calculation.MaxDataPoints    = 10000000;
            t.Settings.Calculation.FrameCount       = 10;
            t.Settings.Render.TransparentBackground = false;
            t.StartRender("tetraAnimPostNoRepeat2", GameStyle.NoRepeat);
        }
Example #24
0
    void Start()
    {
        rotationSpeed = Random.Range(-5f, 5f);
        rend = gameObject.GetComponent<Renderer>();

        tetrahedron  = gameObject.GetComponent<Tetrahedron>();
        octahedron   = gameObject.GetComponent<Octahedron>();
        dodecahedron = gameObject.GetComponent<Dodecahedron>();
        icosahedron  = gameObject.GetComponent<Icosahedron>();
    }
Example #25
0
        static void Main(string[] args)
        {
            Circle   circle   = new Circle();
            Square   square   = new Square();
            Triangle triangle = new Triangle();

            Sphere      sphere      = new Sphere();
            Cube        cube        = new Cube();
            Tetrahedron tetrahedron = new Tetrahedron();
        }
Example #26
0
// END CUT HERE
// BEGIN CUT HERE
    public static void Main()
    {
        try {
            Tetrahedron ___test = new Tetrahedron();
            ___test.run_test(-1);
        } catch (Exception e) {
//Console.WriteLine(e.StackTrace);
            Console.WriteLine(e.ToString());
        }
    }
        /// <summary>
        /// Generate triangles from tetrahedron sides
        /// </summary>
        /// <param name="tetrahedron">Tetrahedron</param>
        /// <returns>List of triangles</returns>
        List <Triangle> TrianglesFromTetrahedrons(Tetrahedron tetrahedron)
        {
            List <Triangle> result = new List <Triangle>();

            for (int i = 0; i < tetrahedron.Nodes.Count; i++)
            {
                Triangle triangle = new Triangle(tetrahedron.Nodes[i], tetrahedron.Nodes[(i + 1) % 4], tetrahedron.Nodes[(i + 2) % 4]);
                result.Add(triangle);
            }
            return(result);
        }
    static void Create()
    {
        GameObject  GO          = new GameObject("Tetrahedron");
        Tetrahedron tetrahedron = GO.AddComponent <Tetrahedron>();
        MeshFilter  mf          = GO.AddComponent <MeshFilter>();

        mf.mesh = new Mesh();
        MeshRenderer mr = GO.AddComponent <MeshRenderer>();

        tetrahedron.Rebuild();
    }
 private unsafe bool IsTetrahedronPositiveOrder(Vector3[] points, ref Tetrahedron tetrahedron)
 {
     fixed(Tetrahedron *tetrahedronPointer = &tetrahedron)
     {
         return(IsTetrahedronPositiveOrder(
                    ref points[tetrahedronPointer->Vertices[0]],
                    ref points[tetrahedronPointer->Vertices[1]],
                    ref points[tetrahedronPointer->Vertices[2]],
                    ref points[tetrahedronPointer->Vertices[3]]));
     }
 }
Example #30
0
        public void TetrahedronRaiseEventsProperly()
        {
            int count = 0;
            var solid = new Tetrahedron()
            {
                Size = new SharpDX.Vector3(1.0f, 1.0f, 1.0f)
            };

            solid.PropertyChanged += (s, e) => count++;
            solid.Size             = new SharpDX.Vector3(2.0f, 0.0f, 0.0f);
            Assert.AreEqual <int>(count, 1);
        }
Example #31
0
 private void Initialize(Tetrahedron parent, Vector3 direction)
 {
     mesh = parent.mesh;
     materials = parent.materials;
     material = parent.material;
     maxRotationSpeed = parent.maxRotationSpeed;
     maxDepth = parent.maxDepth;
     depth = parent.depth + 1;
     childScale = parent.childScale;
     transform.parent = parent.transform;
     transform.localScale = Vector3.one * childScale;
     transform.localPosition = direction * (0.5f + 0.5f * childScale);
 }
        /// <summary>
        /// Adds the super tetrahedron, which encompass every vertices.
        /// </summary>
        private unsafe void AddSuperTetrahedron()
        {
            // Compute the bounding box of the primitive
            var boundingBox = BoundingBox.Empty;

            for (int i = 0; i < vertices.Length; i++)
            {
                BoundingBox.Merge(ref boundingBox, ref vertices[i], out boundingBox);
            }

            // Add space for extrapolation
            boundingBox.Minimum -= ExtrapolationDistance;
            boundingBox.Maximum += ExtrapolationDistance;

            // Let's encompass the bounding box (Min:A, Max:B), in this manner (2D example, but same applies in 3D):
            // *
            // |\
            // | \
            // *--B
            // |  |\
            // A--*-*
            {
                // TODO: This might not be enough and we might want to pretend those points are at infinity (see incomplete implementation later)
                // http://stackoverflow.com/questions/30741459/bowyer-watson-algorithm-how-to-fill-holes-left-by-removing-triangles-with-sup#answer-36992359

                // Store additional vertices in extra space
                // Note: we build 3 extra vertices on a plane with normal (1,1,1) to makes computation easier
                // As an example, (assuming 2D), if B=(1,1) or (0.5,1.5), we can encompass it with (2,0) and (0,2))
                var combinedSize = boundingBox.Extent.X + boundingBox.Extent.Y + boundingBox.Extent.Z;
                vertices[vertices.Length - 4] = boundingBox.Minimum - boundingBox.Extent * 1000.0f;
                vertices[vertices.Length - 3] = boundingBox.Minimum + Vector3.UnitZ * combinedSize * 1000.0f;
                vertices[vertices.Length - 2] = boundingBox.Minimum + Vector3.UnitY * combinedSize * 1000.0f;
                vertices[vertices.Length - 1] = boundingBox.Minimum + Vector3.UnitX * combinedSize * 1000.0f;

                // Create super tetrahedron
                var superTetrahedron = new Tetrahedron();
                for (int i = 0; i < 4; ++i)
                {
                    superTetrahedron.Vertices[i]   = vertices.Length - 4 + i;
                    superTetrahedron.Neighbours[i] = -1; // No neighbour
                }

                if (!IsTetrahedronPositiveOrder(vertices, ref superTetrahedron))
                {
                    throw new InvalidOperationException("Tetrahedron not in positive order");
                }

                tetrahedralization.Add(superTetrahedron);
            }
        }
    // Use this for initialization
    void Start()
    {
        Tetrahedron tetrahedron = new Tetrahedron(
            new Measurement3D(4, -2, 6),
            new Measurement3D(-5, 0, 2),
            new Measurement3D(7, 1, -3),
            new Measurement3D(0, 5, 1));

        MonoTetrahedron  monoTetrahedron  = Instantiate(tetraPrefab);
        MonoCircumSphere monoCircumSphere = Instantiate(circumPrefab);

        monoTetrahedron.SetTetrahedron(tetrahedron);
        monoCircumSphere.Initialize(tetrahedron.CircumSphere);
    }
Example #34
0
 bool IsDelaunay(Tetrahedron t)
 {
     for (int i = 0; i < availablePoints.Count; i++)
     {
         if (i != t.x0 && i != t.x1 && i != t.x2 && i != t.x3)
         {
             if (IsWithinCircumsphereBounds(availablePoints[i], t))
             {
                 return(false);
             }
         }
     }
     return(true);
 }
Example #35
0
 /// <summary>
 /// create an Tetrahedron' renderer.
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 public static SimpleRenderer Create(Tetrahedron model)
 {
     return Create(model, model.Lengths, Tetrahedron.strPosition);
 }
            private void Calculate_Click(object sender, System.EventArgs e)
            {
                Pach_GetModel_Command Model = new Pach_GetModel_Command();
                Source[] Source;


                if (PachydermAc_PlugIn.Instance.Source(out Source) && !object.ReferenceEquals(FileLocation.SelectedPath, "")) Rhino.RhinoApp.WriteLine("Model geometry not specified... Exiting calculation...");
                ParticleRays[] RTParticles = new ParticleRays[Source.Length];

                Calculate.Enabled = false;
                PachydermAc_PlugIn plugin = PachydermAc_PlugIn.Instance;
                Scene Sc;
                if (PachydermAc_PlugIn.Instance.Geometry_Spec() == 0) Sc = PachTools.Get_NURBS_Scene(0, (double)Air_Temp.Value, 0, 0, false);
                else Sc = PachTools.Get_Poly_Scene(0, (double)Air_Temp.Value, 0, 0, false);
                
                for (int i = 0; i < Source.Length; i++)
                {
                    if (Source != null)
                    {
                        List<Point3d> L = new List<Point3d>();
                        List<Rhino.Geometry.Point3d> L_RC = new List<Rhino.Geometry.Point3d>();
                        for (int j = 0; j < Source.Length; j++)
                        {
                            L.Add(Source[j].Origin());
                            L_RC.Add(new Rhino.Geometry.Point3d(Source[j].Origin().X, Source[j].Origin().Y, Source[j].Origin().Z));
                        }

                        if (plugin.Geometry_Spec() == 0)
                        {
                            Sc.partition(L_RC, 15);
                            RTParticles[i] = new ParticleRays(Source[i], Sc, (int)RT_Count.Value, CutOffLength());
                        }
                        else if (plugin.Geometry_Spec() == 1)
                        {
                            Sc.partition(L, 15);
                            RTParticles[i] = new ParticleRays(Source[i], Sc, (int)RT_Count.Value, CutOffLength());
                        }
                        RTParticles[i].Begin();
                    }
                    else
                    {
                        Rhino.RhinoApp.WriteLine("Model geometry not specified... Exiting calculation...");
                    }

                    Pachyderm_Acoustic.Visualization.Phonon P;
                    if (ParticleChoice.SelectedIndex == 0)
                    { P = new Tetrahedron(); }
                    else if (ParticleChoice.SelectedIndex == 1)
                    {
                        P = new Icosahedron();
                    }
                    else { P = new Geodesic_sphere(); }
                    RenderParticles(RTParticles, (double)(Frame_Rate.Value * Seconds.Value), P);
                    Rhino.RhinoDoc.ActiveDoc.Views.Redraw();
                }
                Calculate.Enabled = true;
            }
        private void btnCircumcenterTetra_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                PrepFor3D();
                ClearAllVisuals();

                // Create dots
                Point3D[] points = Enumerable.Range(0, 4).Select(o => Math3D.GetRandomVector_Spherical(HALFSIZE3D).ToPoint()).ToArray();

                Visual3D visual = AddDots(_viewportFull, points, _dotColor);
                _dots3D.Add(new Item3D(visual, 0, points));

                // Create a tetrahedron
                Tetrahedron tetra = new Tetrahedron(0, 1, 2, 3, points, new SortedList<Tuple<int, int, int>, TriangleIndexedLinked>());

                // Edge lines
                _misc3D.Add(new Item3D(AddLines(_viewportFull, tetra.EdgeArray, points, Colors.Black)));



                Point3D center = tetra.CircumsphereCenter;

                _misc3D.Add(new Item3D(AddDot(_viewportFull, center, Colors.ForestGreen)));
                _misc3D.Add(new Item3D(AddDot(_viewportFull, center, UtilityWPF.ColorFromHex("205ED66C"), tetra.CircumsphereRadius, true)));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }