Пример #1
0
        protected override void SolveInstance(Grasshopper.Kernel.IGH_DataAccess DA)
        {
            bool toggle = false;

            if (!DA.GetData(1, ref toggle))
            {
                return;
            }
            if (!DA.GetData(2, ref rs))
            {
                return;
            }
            if (toggle == false)
            {
                newFunction = new GH_function();
                if (!DA.GetData(0, ref newFunction))
                {
                    return;
                }
                t       = 0;
                numNode = 12 * (newFunction.uMax) * (newFunction.vMax);
                int maxNumMember = 20 * (newFunction.uMax) * (newFunction.vMax);
                x                        = new double[numNode, 3];
                originalX                = new double[numNode, 3];
                force                    = new double[numNode, 3];
                velocity                 = new double[numNode, 3];
                nodeType                 = new int[numNode];
                numberOfMembersAtNode    = new int[numNode];
                maxNumberOfMembersAtNode = new int[numNode];
                numberFarEndsBoundary    = new int[numNode];
                thisEnd                  = new int[maxNumMember];
                thatEnd                  = new int[maxNumMember];
                MemberType               = new int[maxNumMember];

                lP = initNodes(newFunction, numNode);
                lL = initMembers(newFunction, numNode);
            }
            else
            {
                calculation();
                visualization();
                t++;
            }
            DA.SetDataList(0, lP);
            DA.SetDataList(1, lL);
        }
Пример #2
0
        private List <Rhino.Geometry.Point3d> initNodes(GH_function func, int numNode)
        {
            List <Rhino.Geometry.Point3d> lP = new List <Rhino.Geometry.Point3d>();

            {
                int node = -1;
                for (int u = 0; u < func.uMax; u++)
                {
                    for (int v = 0; v < func.vMax; v++)
                    {
                        for (int nodeInCell = 0; nodeInCell < 12; nodeInCell++)
                        {
                            node++;
                            double xBottomLeft = -func.maxX + (double)u * func.c;
                            double yBottomLeft = -func.maxY + (double)v * func.c;
                            if (nodeInCell == 0)
                            {
                                x[node, 0] = xBottomLeft + func.a / 2.0;
                                x[node, 1] = yBottomLeft;
                            }
                            if (nodeInCell == 1)
                            {
                                x[node, 0] = xBottomLeft + func.c - func.a / 2.0;
                                x[node, 1] = yBottomLeft;
                            }
                            if (nodeInCell == 2)
                            {
                                x[node, 0] = xBottomLeft + func.c / 2.0;
                                x[node, 1] = yBottomLeft + func.a / 2.0;
                            }
                            if (nodeInCell == 3)
                            {
                                x[node, 0] = xBottomLeft + func.a / 2.0 + func.bcos;
                                x[node, 1] = yBottomLeft + func.bsin;
                            }
                            if (nodeInCell == 4)
                            {
                                x[node, 0] = xBottomLeft + func.c - func.a / 2.0 - func.bcos;
                                x[node, 1] = yBottomLeft + func.bsin;
                            }
                            if (nodeInCell == 5)
                            {
                                x[node, 0] = xBottomLeft;
                                x[node, 1] = yBottomLeft + func.bsin + func.bcos;
                            }
                            if (nodeInCell == 6)
                            {
                                x[node, 0] = xBottomLeft + func.a / 2.0 + 2.0 * func.bcos;
                                x[node, 1] = yBottomLeft + func.c / 2.0;
                            }
                            if (nodeInCell == 7)
                            {
                                x[node, 0] = xBottomLeft + 3.0 * func.a / 2.0 + 2.0 * func.bcos;
                                x[node, 1] = yBottomLeft + func.c / 2.0;
                            }
                            if (nodeInCell == 8)
                            {
                                x[node, 0] = xBottomLeft;
                                x[node, 1] = yBottomLeft + func.bsin + func.bcos + func.a;
                            }
                            if (nodeInCell == 9)
                            {
                                x[node, 0] = xBottomLeft + func.bsin;
                                x[node, 1] = yBottomLeft + func.c - func.bsin;
                            }
                            if (nodeInCell == 10)
                            {
                                x[node, 0] = xBottomLeft + func.c - func.bsin;
                                x[node, 1] = yBottomLeft + func.c - func.bsin;
                            }
                            if (nodeInCell == 11)
                            {
                                x[node, 0] = xBottomLeft + func.c / 2.0;
                                x[node, 1] = yBottomLeft + func.c - func.a / 2.0;
                            }
                        }
                    }
                }
                if (numNode != node + 1)
                {
                    return(lP);
                }
            }
            System.Random rand = new System.Random(0);
            for (int node = 0; node < numNode; node++)
            {
                double z = func.Value.Func(x[node, 0], x[node, 1]).z;
                x[node, 0] = x[node, 0] + (rand.NextDouble() - 0.5) * rs;
                x[node, 1] = x[node, 1] + (rand.NextDouble() - 0.5) * rs;
                x[node, 2] = z;
                if (z < 0.0)
                {
                    nodeType[node] = 0;
                }
                else
                {
                    nodeType[node] = 1;
                }

                {
                    for (int xyz = 0; xyz <= 2; xyz++)
                    {
                        originalX[node, 0] = x[node, 0];
                        originalX[node, 1] = x[node, 1];
                        originalX[node, 2] = x[node, 2];
                        lP.Add(new Rhino.Geometry.Point3d(originalX[node, 0], originalX[node, 1], originalX[node, 2]));
                        velocity[node, 0] = 0.0;
                        velocity[node, 1] = 0.0;
                        velocity[node, 2] = 0.0;
                    }
                    x[node, 2] = z;
                }
                numberOfMembersAtNode[node]    = 0;
                numberFarEndsBoundary[node]    = 0;
                maxNumberOfMembersAtNode[node] = 0;
            }
            return(lP);
        }
Пример #3
0
        private List <Rhino.Geometry.Line> initMembers(GH_function func, int numNode)
        {
            List <Rhino.Geometry.Line> lL = new List <Rhino.Geometry.Line>();

            numMember = 0;
            for (int node = 0; node < numNode - 1; node++)
            {
                for (int otherNode = node + 1; otherNode < numNode; otherNode++)
                {
                    double dx       = x[node, 0] - x[otherNode, 0];
                    double dy       = x[node, 1] - x[otherNode, 1];
                    double LengthSq = dx * dx + dy * dy;
                    if (LengthSq < 1.1 * func.a * func.a)
                    {
                        MemberType[numMember] = 0;
                        if (nodeType[node] != 0 || nodeType[otherNode] != 0)
                        {
                            MemberType[numMember] = 2;
                        }
                        if (nodeType[node] != 0 && nodeType[otherNode] != 0)
                        {
                            MemberType[numMember] = 1;
                        }
                        thisEnd[numMember] = node;
                        thatEnd[numMember] = otherNode;
                        numMember++;
                    }
                }
            }
            for (int member = 0; member < numMember; member++)
            {
                maxNumberOfMembersAtNode[thisEnd[member]]++;
                maxNumberOfMembersAtNode[thatEnd[member]]++;
                if (MemberType[member] != 0)
                {
                    numberOfMembersAtNode[thisEnd[member]]++;
                    numberOfMembersAtNode[thatEnd[member]]++;
                }
            }
            //Bug???
            for (int node = 0; node < numNode - 1; node++)
            {
                if (numberOfMembersAtNode[node] > 1 && nodeType[node] == 0)
                {
                    nodeType[node] = 2;
                }
                if (numberOfMembersAtNode[node] == 1 && nodeType[node] == 0)
                {
                    nodeType[node] = 3;
                }
                numberOfMembersAtNode[node] = 0;
            }
            for (int member = 0; member < numMember; member++)
            {
                if (MemberType[member] == 0)
                {
                    if (nodeType[thisEnd[member]] != 0 && nodeType[thatEnd[member]] != 0)
                    {
                        MemberType[member] = 2;
                    }
                }
                if (MemberType[member] != 0)
                {
                    numberOfMembersAtNode[thisEnd[member]]++;
                    numberOfMembersAtNode[thatEnd[member]]++;
                }
            }


            ////
            for (int node = 0; node < numNode - 1; node++)
            {
                if (numberOfMembersAtNode[node] <= 1)
                {
                    nodeType[node] = 0;
                }
            }
            for (int member = 0; member < numMember; member++)
            {
                if (nodeType[thisEnd[member]] == 0 || nodeType[thatEnd[member]] == 0)
                {
                    MemberType[member] = 0;
                }
            }

            for (int node = 0; node < numNode - 1; node++)
            {
                numberOfMembersAtNode[node] = 0;
            }

            for (int member = 0; member < numMember; member++)
            {
                if (MemberType[member] != 0)
                {
                    numberOfMembersAtNode[thisEnd[member]]++;
                    numberOfMembersAtNode[thatEnd[member]]++;
                }
            }

            for (int node = 0; node < numNode - 1; node++)
            {
                if (numberOfMembersAtNode[node] <= 1)
                {
                    nodeType[node] = 0;
                }
                if (nodeType[node] == 1 && numberOfMembersAtNode[node] < maxNumberOfMembersAtNode[node])
                {
                    nodeType[node] = 3;
                }
            }

            for (int member = 0; member < numMember; member++)
            {
                if (MemberType[member] != 0)
                {
                    if (nodeType[thisEnd[member]] > 1)
                    {
                        numberFarEndsBoundary[thatEnd[member]]++;
                    }
                    if (nodeType[thatEnd[member]] > 1)
                    {
                        numberFarEndsBoundary[thisEnd[member]]++;
                    }
                }
            }

            for (int node = 0; node < numNode - 1; node++)
            {
                if (numberFarEndsBoundary[node] > 1 && nodeType[node] == 1)
                {
                    nodeType[node] = 2;
                }
            }

            for (int node = 0; node < numNode - 1; node++)
            {
                if (nodeType[node] == 3)
                {
                    nodeType[node] = 2;
                }
            }

            for (int member = 0; member < numMember; member++)
            {
                if (MemberType[member] == 2)
                {
                    MemberType[member] = 1;
                }
            }

            for (int node = 0; node < numNode - 1; node++)
            {
                numberFarEndsBoundary[node] = 0;
            }

            for (int member = 0; member < numMember; member++)
            {
                if (MemberType[member] == 0)
                {
                    if (nodeType[thisEnd[member]] == 2)
                    {
                        numberFarEndsBoundary[thatEnd[member]]++;
                    }
                    if (nodeType[thatEnd[member]] == 2)
                    {
                        numberFarEndsBoundary[thisEnd[member]]++;
                    }
                }
            }

            for (int node = 0; node < numNode - 1; node++)
            {
                if (nodeType[node] == 0 && numberFarEndsBoundary[node] == 2)
                {
                    nodeType[node] = 2;
                }
            }

            for (int member = 0; member < numMember; member++)
            {
                if (MemberType[member] == 0 && nodeType[thisEnd[member]] == 2 && nodeType[thatEnd[member]] == 2)
                {
                    MemberType[member] = 1;
                }

                if (MemberType[member] != 0)
                {
                    lL.Add(new Rhino.Geometry.Line(new Rhino.Geometry.Point3d(x[thisEnd[member], 0], x[thisEnd[member], 1], x[thisEnd[member], 2]), new Rhino.Geometry.Point3d(x[thatEnd[member], 0], x[thatEnd[member], 1], x[thatEnd[member], 2])));
                }
            }

            return(lL);
        }
Пример #4
0
        protected override void SolveInstance(Grasshopper.Kernel.IGH_DataAccess DA)
        {
            List <GH_hill> listHill = new List <GH_hill>();
            int            uMax = 0, vMax = 0;
            double         size = 0.0;

            if (!DA.GetDataList(0, listHill))
            {
                return;
            }
            if (!DA.GetData(1, ref size))
            {
                return;
            }
            if (!DA.GetData(2, ref uMax))
            {
                return;
            }
            if (!DA.GetData(3, ref vMax))
            {
                return;
            }
            double ContourInterval = 0.01 * listHill[0].Value.h;
            double seaLevel        = 30.0 * ContourInterval;

            double c      = size / uMax;
            double otherc = size / vMax;

            if (c > otherc)
            {
                c = otherc;
            }
            double maxX = c * uMax / 2d;
            double maxY = c * vMax / 2d;

            GH_function newFunction = new GH_function();

            newFunction.Value      = new function();
            newFunction.Value.Func = new _function((xValue, yValue) => {
                res f          = new res();
                double z       = -seaLevel;
                double zDiff_X = 0;
                double zDiff_Y = 0;
                double dx      = 0;
                double dy      = 0;
                for (int hill = 0; hill < listHill.Count; hill++)
                {
                    dx = xValue - listHill[hill].Value.x;
                    dy = yValue - listHill[hill].Value.y;
                    double expThingy = listHill[hill].Value.h * Math.Exp(-(dx * dx + dy * dy) / (listHill[hill].Value.size * listHill[hill].Value.size));
                    z       += expThingy;
                    zDiff_X -= dx * expThingy / (listHill[hill].Value.size * listHill[hill].Value.size);
                    zDiff_Y -= dy * expThingy / (listHill[hill].Value.size * listHill[hill].Value.size);
                }
                f.z      = z;
                f.zDiffX = zDiff_X;
                f.zDiffY = zDiff_Y;

                return(f);
            });
            Rhino.Geometry.PointCloud pc = new Rhino.Geometry.PointCloud();

            for (int i = 0; i <= uMax * 4; i++)
            {
                for (int j = 0; j <= vMax * 4; j++)
                {
                    double x = -maxX + (c / 4d) * i;
                    double y = -maxY + (c / 4d) * j;
                    pc.Add(new Rhino.Geometry.Point3d(x, y, newFunction.Value.Func(x, y).z));
                }
            }
            Rhino.Geometry.Plane        plane     = new Rhino.Geometry.Plane(new Rhino.Geometry.Point3d(0, 0, 0), new Rhino.Geometry.Vector3d(1.0, 0, 0), new Rhino.Geometry.Vector3d(0.0, 1.0, 0));
            Rhino.Geometry.PlaneSurface planeSurf = new Rhino.Geometry.PlaneSurface(plane, new Rhino.Geometry.Interval(-size / 2d * 1.2d, size / 2d * 1.2d), new Rhino.Geometry.Interval(-size / 2d * 1.2d, size / 2d * 1.2d));
            DA.SetDataList(0, pc.GetPoints().ToList());
            DA.SetData(1, planeSurf);
            newFunction.size            = size;
            newFunction.uMax            = uMax;
            newFunction.vMax            = vMax;
            newFunction.maxX            = maxX;
            newFunction.maxY            = maxY;
            newFunction.c               = c;
            newFunction.seaLevel        = seaLevel;
            newFunction.ContourInterval = ContourInterval;
            newFunction.a               = c * (Math.Sqrt(7.0) - 1.0) / 6.0;
            newFunction.bsin            = c / 4.0;
            newFunction.bcos            = c * (4.0 - Math.Sqrt(7.0)) / 12.0;
            DA.SetData(2, newFunction);
        }