Exemplo n.º 1
0
        public PlateCombine GetMinPlateCombine(PlateModel source, float T, string type, float limit = -1)
        {
            RectHelper rect  = new RectHelper();
            CopyOper   co    = new CopyOper();
            PlateModel pm    = co.CopyPlate(source);
            PlateModel pmnew = co.CopyPlate(source);       //旋转180后的图形

            pmnew = Rotate(pmnew, 180);

            List <PointF> pnew  = pmnew.OutModel.ExpandPoint;
            List <PointF> chnew = rect.GetConvexHull(pmnew.OutModel.ExpandPoint);

            List <PointF> p  = pm.OutModel.ExpandPoint;
            List <PointF> ch = rect.GetConvexHull(pm.OutModel.ExpandPoint);

            Dictionary <string, object> diccombine = rect.Combine(p, ch, pnew, chnew, T, limit, type, 0.9f);
            List <PointF> chcombine = (List <PointF>)diccombine["convexhull"];

            Move(pmnew, Convert.ToSingle(diccombine["movex"]), Convert.ToSingle(diccombine["movey"]));
            RotateAndMove(pm, pmnew, Convert.ToSingle(diccombine["angle"]));

            PlateCombine pc = new PlateCombine(pm, pmnew);

            pc.flag = diccombine["flag"].ToString();
            pc.Rect = pm.Rect = pmnew.Rect = GetRect(pm.OutModel.ExpandPoint, pmnew.OutModel.ExpandPoint);
            return(pc);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 组合图形旋转归位
        /// </summary>
        /// <param name="pm"></param>
        /// <param name="angle"></param>
        /// <returns></returns>
        public PlateCombine RotateAndMove(PlateCombine pc, float angle)
        {
            CopyOper   co  = new CopyOper();
            PlateModel pm1 = co.CopyPlate(pc.Plate1);
            PlateModel pm2 = co.CopyPlate(pc.Plate2);

            RotateOper ro = new RotateOper();

            pm1 = ro.RotatePlate(pm1, new PointF(0, 0), angle);
            pm2 = ro.RotatePlate(pm2, new PointF(0, 0), angle);

            float maxX = pm1.OutModel.ExpandPoint[0].X;
            float maxY = pm1.OutModel.ExpandPoint[0].Y;
            float minX = pm1.OutModel.ExpandPoint[0].X;
            float minY = pm1.OutModel.ExpandPoint[0].Y;

            for (int i = 0; i < pm1.OutModel.ExpandPoint.Count; i++)
            {
                if (maxX < pm1.OutModel.ExpandPoint[i].X)
                {
                    maxX = pm1.OutModel.ExpandPoint[i].X;
                }
                if (maxY < pm1.OutModel.ExpandPoint[i].Y)
                {
                    maxY = pm1.OutModel.ExpandPoint[i].Y;
                }

                if (minX > pm1.OutModel.ExpandPoint[i].X)
                {
                    minX = pm1.OutModel.ExpandPoint[i].X;
                }
                if (minY > pm1.OutModel.ExpandPoint[i].Y)
                {
                    minY = pm1.OutModel.ExpandPoint[i].Y;
                }
            }
            for (int i = 0; i < pm2.OutModel.ExpandPoint.Count; i++)
            {
                if (maxX < pm2.OutModel.ExpandPoint[i].X)
                {
                    maxX = pm2.OutModel.ExpandPoint[i].X;
                }
                if (maxY < pm2.OutModel.ExpandPoint[i].Y)
                {
                    maxY = pm2.OutModel.ExpandPoint[i].Y;
                }

                if (minX > pm2.OutModel.ExpandPoint[i].X)
                {
                    minX = pm2.OutModel.ExpandPoint[i].X;
                }
                if (minY > pm2.OutModel.ExpandPoint[i].Y)
                {
                    minY = pm2.OutModel.ExpandPoint[i].Y;
                }
            }
            MoveOper mo = new MoveOper();

            mo.MovePlate(pm1, -minX, -minY);
            mo.MovePlate(pm2, -minX, -minY);

            PlateCombine pcnew = new PlateCombine(pm1, pm2);

            pcnew.Rect = pc.Rect;
            //if (angle == 90)
            //{
            //      pcnew .Rect = new RectangleF(0, 0, pc .Rect .Height, pc .Rect .Width);
            //}
            pcnew.Rect = GetRect(pm1.OutModel.ExpandPoint, pm2.OutModel.ExpandPoint);
            return(pcnew);
        }
Exemplo n.º 3
0
        public List <PlateCombine> GetMinPlateCombineAll(PlateModel source, float T, string type, float limit = -1, bool _matchwidth = false
                                                         , float _matchrate = 0.9f)
        {
            RectHelper rect  = new RectHelper();
            CopyOper   co    = new CopyOper();
            PlateModel pm    = co.CopyPlate(source);
            PlateModel pmnew = co.CopyPlate(source);       //旋转180后的图形

            pmnew = Rotate(pmnew, 180);

            List <PointF> pnew  = pmnew.OutModel.ExpandPoint;
            List <PointF> chnew = rect.GetConvexHull(pmnew.OutModel.ExpandPoint);

            List <PointF>       p  = pm.OutModel.ExpandPoint;
            List <PointF>       ch = rect.GetConvexHull(pm.OutModel.ExpandPoint);
            var                 tp = rect.CombineAll(p, ch, pnew, chnew, T, limit, type, _matchwidth, _matchrate);
            List <PlateCombine> pc = new List <PlateCombine>();

            if (Convert.ToSingle(tp.Item1["area"].ToString()) > 0)
            {
                PlateModel pm1    = co.CopyPlate(pm);
                PlateModel pmnew1 = co.CopyPlate(pmnew);
                Move(pmnew1, Convert.ToSingle(tp.Item1["movex"]), Convert.ToSingle(tp.Item1["movey"]));
                RotateAndMove(pm1, pmnew1, Convert.ToSingle(tp.Item1["angle"]));
                PlateCombine pc1 = new PlateCombine(pm1, pmnew1, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc1.Rect = pm1.Rect = pmnew1.Rect = GetRect(pm1.OutModel.ExpandPoint, pmnew1.OutModel.ExpandPoint);
                pc.Add(pc1);
            }
            if (Convert.ToSingle(tp.Item2["area"].ToString()) > 0)
            {
                PlateModel pm2    = co.CopyPlate(pm);
                PlateModel pmnew2 = co.CopyPlate(pmnew);
                Move(pmnew2, Convert.ToSingle(tp.Item2["movex"]), Convert.ToSingle(tp.Item2["movey"]));
                RotateAndMove(pm2, pmnew2, Convert.ToSingle(tp.Item2["angle"]));
                PlateCombine pc2 = new PlateCombine(pm2, pmnew2, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc2.Rect = pm2.Rect = pmnew2.Rect = GetRect(pm2.OutModel.ExpandPoint, pmnew2.OutModel.ExpandPoint);
                pc.Add(pc2);
            }
            if (Convert.ToSingle(tp.Item3["area"].ToString()) > 0)
            {
                PlateModel pm3    = co.CopyPlate(pm);
                PlateModel pmnew3 = co.CopyPlate(pmnew);
                Move(pmnew3, Convert.ToSingle(tp.Item3["movex"]), Convert.ToSingle(tp.Item3["movey"]));
                RotateAndMove(pm3, pmnew3, Convert.ToSingle(tp.Item3["angle"]));
                PlateCombine pc3 = new PlateCombine(pm3, pmnew3, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc3.Rect = pm3.Rect = pmnew3.Rect = GetRect(pm3.OutModel.ExpandPoint, pmnew3.OutModel.ExpandPoint);
                pc.Add(pc3);
            }
            if (Convert.ToSingle(tp.Item4["area"].ToString()) > 0)
            {
                PlateModel pm4    = co.CopyPlate(pm);
                PlateModel pmnew4 = co.CopyPlate(pmnew);
                Move(pmnew4, Convert.ToSingle(tp.Item4["movex"]), Convert.ToSingle(tp.Item4["movey"]));
                RotateAndMove(pm4, pmnew4, Convert.ToSingle(tp.Item4["angle"]));
                PlateCombine pc4 = new PlateCombine(pm4, pmnew4, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc4.Rect = pm4.Rect = pmnew4.Rect = GetRect(pm4.OutModel.ExpandPoint, pmnew4.OutModel.ExpandPoint);
                pc.Add(pc4);
            }
            if (Convert.ToSingle(tp.Item1["area"].ToString()) > 0)
            {
                PlateModel pm5    = co.CopyPlate(pm);
                PlateModel pmnew5 = co.CopyPlate(pmnew);
                Move(pmnew5, Convert.ToSingle(tp.Item1["movex"]), Convert.ToSingle(tp.Item1["movey"]));
                RotateAndMove(pm5, pmnew5, Convert.ToSingle(tp.Item1["angle2"]));
                PlateCombine pc5 = new PlateCombine(pm5, pmnew5, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc5.Rect = pm5.Rect = pmnew5.Rect = GetRect(pm5.OutModel.ExpandPoint, pmnew5.OutModel.ExpandPoint);
                pc.Add(pc5);
            }
            if (Convert.ToSingle(tp.Item2["area"].ToString()) > 0)
            {
                PlateModel pm6    = co.CopyPlate(pm);
                PlateModel pmnew6 = co.CopyPlate(pmnew);
                Move(pmnew6, Convert.ToSingle(tp.Item2["movex"]), Convert.ToSingle(tp.Item2["movey"]));
                RotateAndMove(pm6, pmnew6, Convert.ToSingle(tp.Item2["angle2"]));
                PlateCombine pc6 = new PlateCombine(pm6, pmnew6, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc6.Rect = pm6.Rect = pmnew6.Rect = GetRect(pm6.OutModel.ExpandPoint, pmnew6.OutModel.ExpandPoint);
                pc.Add(pc6);
            }
            if (Convert.ToSingle(tp.Item3["area"].ToString()) > 0)
            {
                PlateModel pm7    = co.CopyPlate(pm);
                PlateModel pmnew7 = co.CopyPlate(pmnew);
                Move(pmnew7, Convert.ToSingle(tp.Item3["movex"]), Convert.ToSingle(tp.Item3["movey"]));
                RotateAndMove(pm7, pmnew7, Convert.ToSingle(tp.Item3["angle2"]));
                PlateCombine pc7 = new PlateCombine(pm7, pmnew7, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc7.Rect = pm7.Rect = pmnew7.Rect = GetRect(pm7.OutModel.ExpandPoint, pmnew7.OutModel.ExpandPoint);
                pc.Add(pc7);
            }
            if (Convert.ToSingle(tp.Item4["area"].ToString()) > 0)
            {
                PlateModel pm8    = co.CopyPlate(pm);
                PlateModel pmnew8 = co.CopyPlate(pmnew);
                Move(pmnew8, Convert.ToSingle(tp.Item4["movex"]), Convert.ToSingle(tp.Item4["movey"]));
                RotateAndMove(pm8, pmnew8, Convert.ToSingle(tp.Item4["angle2"]));
                PlateCombine pc8 = new PlateCombine(pm8, pmnew8, Convert.ToSingle(tp.Item1["angle"]), Convert.ToSingle(tp.Item1["angle2"]));
                pc8.Rect = pm8.Rect = pmnew8.Rect = GetRect(pm8.OutModel.ExpandPoint, pmnew8.OutModel.ExpandPoint);
                pc.Add(pc8);
            }

            return(pc);
        }