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); }
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); }
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); }
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); }