public void ReComputeShape() { //Shape Rhino.Geometry.Point3d origin = originVec.ToRhino(); _shapedGrid.Compute(gridSize, x_Ex, y_Ex, offsetValue, offsetValue2, maxReduceNum, minGridNum, origin, ref shapedGrid, ref shape, ref offsetShape, ref originalShape); if (Rhino.Geometry.AreaMassProperties.Compute(offsetShape.ToPolylineCurve()).Area < (Rhino.Geometry.AreaMassProperties.Compute(shape).Area / 2f)) { ReComputeShape(); Debug.Log("Failed RecomputeShape and start RecomputeShape again"); return; } _areaRatio.Compute(shape, minAreaRatio, roomNum, ref areaSize, ref areaRatio); targetAreaSize = areaSize.ToIntList(); if (debug) { debugPreview.Add(RhinoPreview.PtsShow(shapedGrid, gridSize, Color.white)); } if (show) { if (polyLines.Count != 0) { foreach (var line in polyLines) { Destroy(line); } } polyLines.Add(RhinoPreview.PolyLineShow(shape.ToPolyline(), Color.cyan, 0.3f, "shape")); polyLines.Add(RhinoPreview.PolyLineShow(offsetShape, Color.blue, 0.3f, "offsetShape")); polyLines.Add(RhinoPreview.PolyLineShow(originalShape.ToPolyline(), Color.gray, 0.3f, "originalShape")); } // make first agent position var center = Rhino.Geometry.AreaMassProperties.Compute(shape).Centroid; rectMin = RhinoWrapper.MakeRect(center, gridSize, gridSize); var areaCenters = RhinoWrapper.RandomPt(rectMin, roomNum); if (debug) { debugPreview.Add(RhinoPreview.PolyLineShow(rectMin.ToPolyline(), Color.green, 0.3f, "minRect")); debugPreview.Add(RhinoPreview.PtsShow(areaCenters, gridSize, Color.black)); var centersList = new List <Rhino.Geometry.Point3d>(); centersList.Add(center); debugPreview.Add(RhinoPreview.PtsShow(centersList, gridSize, Color.magenta)); } //relax agent position minDist = (int)Math.Ceiling(Math.Sqrt(2) * gridSize) * (minGridNum + 1); _relax.Compute(ref areaCenters, minDist, offsetShape, (double)gridSize / 2.0); if (debug) { debugPreview.Add(RhinoPreview.PtsShow(areaCenters, gridSize, Color.red)); } agentPosition = areaCenters.ToHost(); }
public override void CollectObservations() { //transform.position = layoutArea.agentPosition[agentNumber] / (layoutArea.gridSize * layoutArea.x_Ex); //Current position (relative) var curPos = new Vector2(transform.position.x / (float)(gridSize * x_Ex), transform.position.y / (float)(gridSize * y_Ex)); AddVectorObs(curPos); //近くの壁までのVector var agentPt = transform.position.ToRhino(); var nearWall = shape.ToPolyline().ClosestPoint(agentPt); var dirNearWall = (nearWall - agentPt); Vector2 dirNearWallVec2 = new Vector2((float)dirNearWall.X / (float)(gridSize * x_Ex), (float)dirNearWall.Y / (float)(gridSize * y_Ex)); AddVectorObs(dirNearWallVec2); if (showInfo) { layoutArea.obsStr.Clear(); layoutArea.obsStr.Add(("Current position " + curPos.ToString("F3"))); layoutArea.obsStr.Add(("dirNearWall " + dirNearWallVec2.ToString("F3"))); } //4方向の壁 float[] fourAxisWall = GetFourAxis(agentPt, shape); AddVectorObs(fourAxisWall); if (showInfo) { foreach (var val in fourAxisWall) { layoutArea.obsStr.Add(("fourAxisWall" + val.ToString("F3"))); } } /* * var lenghtNearWall = dirNearWallVec2.magnitude; * AddVectorObs(lenghtNearWall); */ //他のAgentとの距離と方向 for (int i = 0; i < layoutArea.agentPosition.Count; i++) { if (i == agentNumber) { continue; } var dir = layoutArea.agentPosition[i] - transform.position; Vector2 dirAgent = new Vector2((float)dir.x / (float)(gridSize * x_Ex), (float)dir.y / (float)(gridSize * y_Ex)); AddVectorObs(dirAgent); /* * var dist = dirAgent.magnitude; * AddVectorObs(dist); */ if (showInfo) { layoutArea.obsStr.Add((i + "AgentDir " + dirAgent.ToString("F3"))); } } //面積の差を割合として渡す float currentArea = layoutArea.currentAreaSize[agentNumber] / (1000f * 1000f); float targetArea = layoutArea.targetAreaSize[agentNumber] / (1000f * 1000f); float differenceArea = targetArea - currentArea; float shapeArea = (float)Rhino.Geometry.AreaMassProperties.Compute(shape).Area / (1000f * 1000f); if (differenceArea != 0) { // differenceArea = differenceArea > 0 ? Mathf.Pow((differenceArea / (1000f * 1000f)), 2) : Mathf.Pow((differenceArea / (1000f * 1000f)), 2) * -1f; var diffArea = (differenceArea / targetArea); AddVectorObs(diffArea); if (showInfo) { layoutArea.obsStr.Add(("differenceAreaObs " + diffArea).ToString()); } } else { AddVectorObs(0); } SetMask(); }