Пример #1
0
    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();
    }
Пример #2
0
    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();
    }