Exemplo n.º 1
0
        /// <summary>
        /// No Use Now
        /// </summary>
        /// <param name="cross1">交点1</param>
        /// <param name="cross2">交点2</param>
        /// <param name="center">圆心</param>
        /// <param name="R">半径</param>
        /// <returns></returns>
        public static Pave radPoint(Pave cross1, Pave cross2, Pave center, double R)
        {
            Pave   D  = new Pave((cross1.pointx + cross2.pointx) / 2, (cross1.pointy + cross2.pointy) / 2, 0);
            double OD = D.Dist(center);
            double OC = Math.Pow(R, 2) / OD;
            double x1 = center.pointx + OC / OD * (D.pointx - center.pointx);
            double y1 = center.pointy + OC / OD * (D.pointy - center.pointy);

            return(new Pave(x1, y1, R));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 按顺序返回圆的点集信息
        /// </summary>
        /// <param name="crossPoint">交点</param>
        /// <param name="line">分割线</param>
        /// <param name="center">圆心</param>
        /// <param name="R">半径</param>
        /// <returns></returns>
        public static List <Pave> CircleReturn(Pave crossPoint, Line line, Pave center, double R)
        {
            var         crossPoints  = CrossPoints(line, center, R);
            List <Pave> returnPoints = new List <Pave>();

            if (crossPoint.Dist(crossPoints[0]) > crossPoint.Dist(crossPoints[1]))
            {
                returnPoints.Add(crossPoints[1]);
                returnPoints.Add(center);
                returnPoints.Add(crossPoints[0]);
            }
            else
            {
                returnPoints.Add(crossPoints[0]);
                returnPoints.Add(center);
                returnPoints.Add(crossPoints[1]);
            }
            return(returnPoints);
        }
Exemplo n.º 3
0
 public Line(Pave point1, Pave point2)
 {
     this.point1 = point1;
     this.point2 = point2;
     if (point2.radius != 0)
     {
         this._type = true;
         if (point1.Dist(point2) > point2.radius)
         {
         }
         else
         {
         }
     }
     else
     {
         this._type = false;
     }
 }
Exemplo n.º 4
0
        public static void ReturnCommands(ref ArrayList returnCommands, bool?fang, bool?yuan, List <Pave> originPane, Pave center, double dist, double R, double distxF, double distyF, double ang, string paveRef, bool multiSplit, double splitDist, double splitCount)
        {
            double x = center.pointx;
            double y = center.pointy;
            //Line line = new Line(x, y, ang);
            double deltX = (dist / 2) * Math.Sin(ang);
            double deltY = -(dist / 2) * Math.Cos(ang);
            double x1    = x + deltX;
            double y1    = y + deltY;
            double x2    = x - deltX;
            double y2    = y - deltY;
            Pave   pavea = new Pave(x1, y1, 0);
            Pave   paveb = new Pave(x2, y2, 0);
            Line   linea = new Line(x1, y1, ang);
            Line   lineb = new Line(x2, y2, ang);

            GetLines.SetLine((pavea.Dist(originPane.First()) > paveb.Dist(originPane.First())), linea, lineb);
            bool cross = false;

            GetPanes.SetPane(new List <Pave>(), new List <Pave>());
            Line        line = GetLines.GetLine(false);
            List <Pave> pane = GetPanes.GetPane(false);

            for (int i = 0; i < originPane.Count; i++)
            {
                int ii = i + 1;
                if (ii == originPane.Count)
                {
                    ii = 0;
                }
                Line line1 = new Line(originPane[i], originPane[ii]);
                cross = false;
                var point = line1.Cross(line, ref cross);
                if (cross)
                {
                    pane.Add(point);
                    if (yuan == true)
                    {
                        pane.AddRange(CircleReturn(point, line, center, R));
                    }
                    else if (fang == true)
                    {
                        var returnData = SquareReturn(line, center, point, distxF, distyF, dist, ang);
                        if (returnData[0] == point)
                        {
                            pane.RemoveAt(pane.Count - 1);
                            returnData.RemoveAt(0);
                        }
                        pane.AddRange(returnData);
                    }
                    pane = GetPanes.GetPane(true);
                    line = GetLines.GetLine(true);
                    for (int j = i; j < originPane.Count; j++)
                    {
                        int jj = j + 1;
                        if (jj == originPane.Count)
                        {
                            jj = 0;
                        }
                        cross = false;
                        line1 = new Line(originPane[j], originPane[jj]);
                        point = line1.Cross(line, ref cross);
                        if (cross)
                        {
                            pane.Add(point);
                            i  = j;
                            ii = jj;
                            break;
                        }
                    }
                }
                pane.Add(originPane[ii]);
            }
            if (multiSplit)
            {
                if (splitCount > 1)
                {
                    double splitDistAbs = Math.Abs(splitDist);
                    double xm           = center.pointx;
                    double ym           = center.pointy;
                    double xm1;
                    double ym1;
                    double deltXm = (dist + splitDistAbs) * Math.Sin(ang);
                    double deltYm = -(dist + splitDistAbs) * Math.Cos(ang);
                    if (splitDist > 0)
                    {
                        xm1 = xm + deltXm;
                        ym1 = ym + deltYm;
                    }
                    else
                    {
                        xm1 = xm - deltXm;
                        ym1 = ym - deltYm;
                    }
                    Pave newCenter = new Pave(xm1, ym1, center.radius);
                    #region 点在平面内 错误
                    Line        linem   = new Line(xm1, ym1, (ang + 45) / 180 * Math.PI);
                    bool        inPlate = true;
                    List <Pave> pave    = GetPanes.GetPane(false);
                    for (int i = 0; i < pave.Count; i++)
                    {
                        int j = i + 1;
                        if (j == pave.Count)
                        {
                            j = 0;
                        }
                        Line newLine = new Line(pave[i], pave[j]);
                        bool crossed = false;
                        var  point   = newLine.Cross(linem, ref crossed);
                        if (crossed && point.pointx > xm1)
                        {
                            inPlate = !inPlate;
                        }
                    }
                    List <Pave> orangePavem = new List <Pave>();
                    orangePavem.AddRange(GetPanes.GetPane(inPlate));
                    returnCommands.Add("!!SplitObject.CopyPANE('" + paveRef + "')");
                    foreach (var item in GetPanes.GetPane(true))
                    {
                        returnCommands.Add("new pave pos E " + item.pointx + " N " + item.pointy + " Frad " + item.radius);
                    }
                    #endregion
                    splitCount--;
                    if (splitCount == 1)
                    {
                        multiSplit = false;
                    }
                    ReturnCommands(ref returnCommands, fang, yuan, orangePavem, newCenter, dist, R, distxF, distyF, ang, paveRef, multiSplit, splitDist, splitCount);
                    //ReturnCommands(ref returnCommands, fang, yuan, GetPanes.GetPane(true), newCenter, dist, R, distxF, distyF, ang, paveRef, multiSplit, splitDist, splitCount);
                }
            }
            else
            {
                if (GetPanes.GetPane(false).Count != 0 && GetPanes.GetPane(true).Count != 0)
                {
                    returnCommands.Add("!!SplitObject.CopyPANE('" + paveRef + "')");
                    foreach (var item in GetPanes.GetPane(false))
                    {
                        returnCommands.Add("new pave pos E " + item.pointx + " N " + item.pointy + " Frad " + item.radius);
                    }
                    returnCommands.Add("!!SplitObject.CopyPANE('" + paveRef + "')");
                    foreach (var item in GetPanes.GetPane(true))
                    {
                        returnCommands.Add("new pave pos E " + item.pointx + " N " + item.pointy + " Frad " + item.radius);
                    }
                }
            }
            returnCommands.Add("PANE");
        }
Exemplo n.º 5
0
        /// <summary>
        /// 按顺序返回方孔信息
        /// </summary>
        /// <param name="line">分割线</param>
        /// <param name="center">圆心</param>
        /// <param name="cross">交点</param>
        /// <param name="distxF">沿直线方向长度</param>
        /// <param name="distyF">垂直直线方向长度</param>
        /// <param name="dist">分割距离</param>
        /// <param name="ang">角度</param>
        /// <returns></returns>
        public static List <Pave> SquareReturn(Line line, Pave center, Pave cross, double distxF, double distyF, double dist, double ang)
        {
            List <Pave> returnPoints = new List <Pave>();
            double      xF           = line.point1.pointx;
            double      yF           = line.point1.pointy;
            double      deltXF       = (distxF / 2) * Math.Cos(ang);
            double      deltYF       = (distxF / 2) * Math.Sin(ang);
            double      x1F          = xF + deltXF;
            double      y1F          = yF + deltYF;
            double      x2F          = xF - deltXF;
            double      y2F          = yF - deltYF;
            Pave        paveaF       = new Pave(x1F, y1F, 0);
            Pave        pavebF       = new Pave(x2F, y2F, 0);
            Pave        paveF1;

            if (cross.Dist(line.point1) <= distxF / 2)
            {
                paveF1 = cross;
                distxF = distxF / 2 + cross.Dist(line.point1);
            }
            else
            {
                //MessageBox.Show(cross.Dist(line.point1).ToString() + " " + (distxF / 2).ToString());
                if (paveaF.Dist(cross) < pavebF.Dist(cross))
                {
                    paveF1 = paveaF;
                }
                else
                {
                    paveF1 = pavebF;
                }
            }
            xF     = paveF1.pointx;
            yF     = paveF1.pointy;
            deltXF = (distyF - dist) / 2 * Math.Sin(ang);
            deltYF = -(distyF - dist) / 2 * Math.Cos(ang);
            x1F    = xF + deltXF;
            y1F    = yF + deltYF;
            x2F    = xF - deltXF;
            y2F    = yF - deltYF;
            paveaF = new Pave(x1F, y1F, 0);
            pavebF = new Pave(x2F, y2F, 0);
            Pave paveF2;

            if (paveaF.Dist(center) > pavebF.Dist(center))
            {
                paveF2 = paveaF;
            }
            else
            {
                paveF2 = pavebF;
            }
            xF     = paveF2.pointx;
            yF     = paveF2.pointy;
            deltXF = (distxF) * Math.Cos(ang);
            deltYF = (distxF) * Math.Sin(ang);
            x1F    = xF + deltXF;
            y1F    = yF + deltYF;
            x2F    = xF - deltXF;
            y2F    = yF - deltYF;
            paveaF = new Pave(x1F, y1F, 0);
            pavebF = new Pave(x2F, y2F, 0);
            Pave paveF3;

            //if (paveF1 == cross)
            //{
            //    if (paveaF.Dist(center) > pavebF.Dist(center))
            //    {
            //        paveF3 = paveaF;
            //    }
            //    else
            //    {
            //        paveF3 = pavebF;
            //    }
            //}
            //else
            {
                if (paveaF.Dist(center) < pavebF.Dist(center))
                {
                    paveF3 = paveaF;
                }
                else
                {
                    paveF3 = pavebF;
                }
            }
            xF     = paveF3.pointx;
            yF     = paveF3.pointy;
            deltXF = ((distyF - dist) / 2) * Math.Sin(ang);
            deltYF = -((distyF - dist) / 2) * Math.Cos(ang);
            x1F    = xF + deltXF;
            y1F    = yF + deltYF;
            x2F    = xF - deltXF;
            y2F    = yF - deltYF;
            paveaF = new Pave(x1F, y1F, 0);
            pavebF = new Pave(x2F, y2F, 0);
            Pave paveF4;

            if (paveaF.Dist(center) < pavebF.Dist(center))
            {
                paveF4 = paveaF;
            }
            else
            {
                paveF4 = pavebF;
            }
            returnPoints.Add(paveF1);
            returnPoints.Add(paveF2);
            returnPoints.Add(paveF3);
            returnPoints.Add(paveF4);
            return(returnPoints);
        }