示例#1
0
                private static PartitionParam DrawAtPreCrossed(PartitionParam preParam)
                {
                    PartitionParam lastParam = new PartitionParam(preParam);

                    lastParam.OriginPost.BaseLine = preParam.OutlineLabel.Core[preParam.OutlineLabel.Core.Count - 2];
                    lastParam.OriginPost.Point    = lastParam.OriginPost.BaseLine.EndPt;

                    return(PartitionMaker.DrawOrtho(lastParam));
                }
示例#2
0
                //main method
                public static PartitionParam Draw(PartitionParam preParam, PartitionParam initialParam)
                {
                    if (preParam.OutlineLabel.Pure.IsClosed)
                    {
                        return(DrawAtDoughnutType(preParam, initialParam));
                    }

                    PartitionParam lastParam = new PartitionParam(preParam);

                    lastParam.OriginPost.BaseLine = preParam.OutlineLabel.Core.Last();
                    lastParam.OriginPost.Point    = preParam.OutlineLabel.Core.Last().EndPt;

                    if (IsCrossed(lastParam))
                    {
                        return(DrawAtPreCrossed(preParam));
                    }

                    return(PartitionMaker.DrawOrtho(lastParam));
                }
示例#3
0
            private List <Polyline> DrawRoomAtEachPart(LabeledOutline outlineLabel, List <double> roomAreas)
            {
                List <Polyline> partitionList = new List <Polyline>();

                double remainedArea    = outlineLabel.DifferenceArea;
                double remainTolerance = 0.5;


                //draw initial
                Partition      dividerInitial = SetInitialDivider(outlineLabel);
                PartitionParam paramInitial   = new PartitionParam(dividerInitial, dividerInitial.Origin, outlineLabel);
                PartitionParam paramPre       = new PartitionParam(paramInitial);


                //draw middle
                for (int i = 0; i < roomAreas.Count; i++)
                {
                    if (i == roomAreas.Count - 1)
                    {
                        PartitionParam lastPartition = PartitionMakerLast.Draw(paramPre, paramInitial);
                        partitionList.Add(lastPartition.Outline);
                        return(partitionList);
                    }

                    PartitionParam eachPartition = PartitionMaker.DrawEachPartition(paramPre, roomAreas[i]);
                    partitionList.Add(eachPartition.Outline);

                    remainedArea -= eachPartition.Outline.GetArea();

                    eachPartition.PostToPre();
                    paramPre = eachPartition;

                    if (remainedArea <= remainTolerance)
                    {
                        break;
                    }
                }

                return(partitionList);
            }
示例#4
0
                private static PartitionParam DrawAtMultiFoldOutline(PartitionParam param, double targetArea, List <Point3d> outlineVertex)
                {
                    Line           mainLine          = GetMainLine(param, outlineVertex);
                    List <Point3d> canMakePerpVertex = new List <Point3d>();

                    Vector3d mainAlign = mainLine.UnitTangent;
                    Vector3d mainPerp  = VectorTools.RotateVectorXY(mainAlign, Math.PI / 2);
                    Point3d  origin    = param.OriginPost.Point;
                    bool     isMainAlignSameAsPostNormal = mainAlign.IsParallelTo(param.OriginPost.BaseLine.UnitNormal, 0.005) == 1;

                    if (!isMainAlignSameAsPostNormal)
                    {
                        int originIndex = param.OutlineLabel.Core.FindIndex
                                              (i => i.PureLine == param.OriginPost.BasePureLine);

                        param.OriginPost = new PartitionOrigin(origin, param.OutlineLabel.Core[originIndex - 1]);
                        mainPerp         = VectorTools.RotateVectorXY(mainAlign, -Math.PI / 2);
                    }

                    int lastVertexIndex = outlineVertex.Count - 1;

                    for (int i = 1; i < lastVertexIndex; i++)
                    {
                        Vector3d toPreVector  = new Vector3d(outlineVertex[i - 1] - outlineVertex[i]);
                        Vector3d toPostVector = new Vector3d(outlineVertex[i + 1] - outlineVertex[i]);
                        Vector3d toMainVector = -mainPerp;

                        if (IsBetweenVector(toPreVector, toPostVector, toMainVector))
                        {
                            canMakePerpVertex.Add(outlineVertex[i]);
                        }
                    }

                    //SeivePerpVertex
                    List <Point3d> finalVertex = new List <Point3d>();


                    foreach (Point3d i in outlineVertex)
                    {
                        Line toBaseLine = PCXTools.PCXByEquationStrict(i, CurveTools.ToPolyline(mainLine.ToNurbsCurve()), -mainPerp);
                        Line toOutline  = PCXTools.PCXByEquationStrict(toBaseLine.PointAt(1), param.OutlineLabel.Pure, mainPerp);

                        if (toOutline.PointAt(1).DistanceTo(i) < 0.5)
                        {
                            finalVertex.Add(i);
                        }
                    }


                    //DrawAtEachVertex
                    List <PartitionParam> outputCandidate = new List <PartitionParam>();

                    foreach (Point3d i in finalVertex)
                    {
                        Line    toBaseLine = PCXTools.PCXByEquationStrict(i, CurveTools.ToPolyline(mainLine.ToNurbsCurve()), -mainPerp);
                        Point3d tempAnchor = toBaseLine.PointAt(1);
                        Line    toOutline  = PCXTools.PCXByEquationStrict(tempAnchor, param.OutlineLabel.Pure, mainPerp);

                        if (toOutline.PointAt(1).DistanceTo(i) > 0.5)
                        {
                            continue;
                        }

                        List <RoomLine> tempPartition = new List <RoomLine>();
                        tempPartition.Add(new RoomLine(new Line(origin, tempAnchor), LineType.Inner));
                        tempPartition.Add(new RoomLine(new Line(tempAnchor, i), LineType.Inner));

                        PartitionParam tempParam = new PartitionParam(param);
                        tempParam.PartitionPost = new Partition(tempPartition, param.OriginPost);

                        outputCandidate.Add(tempParam);
                    }

                    outputCandidate.Add(PartitionMaker.DrawOrtho(param));

                    //TestCandidate
                    //나중에 수정.. 지금은 면적일치정도로만..
                    Plane                 cornerPlane = new Plane(origin, mainAlign, mainPerp);
                    CornerComparer        comparer    = new CornerComparer();
                    List <PartitionParam> seived      = comparer.Seive(outputCandidate, targetArea, cornerPlane);

                    return(seived[0]);
                }