コード例 #1
0
        private List <Rectangle2D> GetRecrangle(List <Vector2D> points)
        {
            List <Rectangle2D> rectangles      = new List <Rectangle2D>();
            Vector2D           floorLocalCoord = GetBasicDirection()[0];
            Vector2D           GlobalCoord     = new Vector2D(1, 0);
            double             xiTa            = 0;

            if (floorLocalCoord.Dot(GlobalCoord) > 0 && GlobalCoord.Cross(floorLocalCoord) < 0)
            {
                xiTa = GlobalCoord.AngleWith(floorLocalCoord);
            }
            else if (floorLocalCoord.Dot(GlobalCoord) < 0 && GlobalCoord.Cross(-floorLocalCoord) < 0)
            {
                xiTa = GlobalCoord.AngleWith(floorLocalCoord);
            }
            else if (floorLocalCoord.Dot(GlobalCoord) > 0 && GlobalCoord.Cross(floorLocalCoord) > 0)
            {
                xiTa = Math.PI / 2 - GlobalCoord.AngleWith(floorLocalCoord);
            }
            else if (floorLocalCoord.Dot(GlobalCoord) < 0 && GlobalCoord.Cross(-floorLocalCoord) > 0)
            {
                xiTa = Math.PI / 2 - GlobalCoord.AngleWith(floorLocalCoord);
            }

            points.ForEach(x => x.X = Math.Floor(x.X * 1e9) / 1e9);
            points.ForEach(x => x.Y = Math.Floor(x.Y * 1e9) / 1e9);
            List <Vector2D> newCoord = new List <Vector2D>();

            points.ForEach(x => newCoord.Add(CoordTransform(x, xiTa)));
            List <double> newXCoord = new List <double>();
            List <double> newYCoord = new List <double>();

            newCoord.ForEach(x =>
            {
                newXCoord.Add(x.X);
                newYCoord.Add(x.Y);
            });
            newXCoord = newXCoord.Distinct().OrderBy(x => x).ToList();
            newYCoord = newYCoord.Distinct().OrderBy(y => y).ToList();


            for (int i = 0; i < newXCoord.Count - 1; i++)
            {
                for (int j = 0; j < newYCoord.Count - 1; j++)
                {
                    Vector2D p1 = new Vector2D(newXCoord[i], newYCoord[j]);
                    Vector2D p2 = new Vector2D(newXCoord[i + 1], newYCoord[j]);
                    Vector2D p3 = new Vector2D(newXCoord[i + 1], newYCoord[j + 1]);
                    Vector2D p4 = new Vector2D(newXCoord[i], newYCoord[j + 1]);

                    p1 = CoordTransform(p1, -xiTa);
                    p2 = CoordTransform(p2, -xiTa);
                    p3 = CoordTransform(p3, -xiTa);
                    p4 = CoordTransform(p4, -xiTa);

                    Rectangle2D rec = new Rectangle2D(p1, p2, p3, p4);
                    rectangles.Add(rec);
                }
            }
            return(rectangles);
        }