Ejemplo n.º 1
0
        internal static bool BoundingIntersectWithLine(Bounding bounding, LitMath.Line2 line)
        {
            Bounding lineBound = new Bounding(line.startPoint, line.endPoint);

            if (!bounding.IntersectWith(lineBound))
            {
                return(false);
            }

            if (bounding.Contains(line.startPoint) ||
                bounding.Contains(line.endPoint))
            {
                return(true);
            }

            LitMath.Vector2 pkPnt1 = new LitMath.Vector2(bounding.left, bounding.bottom);
            LitMath.Vector2 pkPnt2 = new LitMath.Vector2(bounding.left, bounding.top);
            LitMath.Vector2 pkPnt3 = new LitMath.Vector2(bounding.right, bounding.top);
            LitMath.Vector2 pkPnt4 = new LitMath.Vector2(bounding.right, bounding.bottom);

            double d1 = LitMath.Vector2.Cross(line.startPoint - pkPnt1, line.endPoint - pkPnt1);
            double d2 = LitMath.Vector2.Cross(line.startPoint - pkPnt2, line.endPoint - pkPnt2);
            double d3 = LitMath.Vector2.Cross(line.startPoint - pkPnt3, line.endPoint - pkPnt3);
            double d4 = LitMath.Vector2.Cross(line.startPoint - pkPnt4, line.endPoint - pkPnt4);

            if (d1 * d2 <= 0 || d1 * d3 <= 0 || d1 * d4 <= 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            //LitMath.Vector2 v = new LitMath.Vector2(0.7, 0.7);
            //v = LitMath.Vector2.RotateInRadian(v, LitMath.Utils.PI / 2);
            //Console.WriteLine(v.ToString());
            //Console.WriteLine(Math.Asin(0.5).ToString());

            {
                LitMath.Vector3 va    = new LitMath.Vector3(0, 0, 1);
                LitMath.Vector3 vb    = new LitMath.Vector3(0, 1, 0);
                LitMath.Vector3 axis  = new LitMath.Vector3(1, 1, 0);
                double          angle = LitMath.Vector3.SignedAngle(va, vb, axis);
                Console.WriteLine(angle);
            }
            {
                LitMath.Vector3 va    = new LitMath.Vector3(0, 0, 1);
                LitMath.Vector3 vb    = new LitMath.Vector3(0, 0, 1);
                LitMath.Vector3 axis  = new LitMath.Vector3(1, 1, 0);
                double          angle = LitMath.Vector3.SignedAngle(va, vb, axis);
                Console.WriteLine(angle);
            }
            {
                LitMath.Vector3 va    = new LitMath.Vector3(0, 0, 1);
                LitMath.Vector3 vb    = new LitMath.Vector3(0, 1, 0);
                LitMath.Vector3 axis  = new LitMath.Vector3(0, 1, 1);
                double          angle = LitMath.Vector3.SignedAngle(va, vb, axis);
                Console.WriteLine(angle);
            }


            return;

            //LitMath.Vector2 v1 = new LitMath.Vector2(1, 3);
            //Console.WriteLine(v1.ToString());

            LitMath.Line2 line1 = new LitMath.Line2(
                new LitMath.Vector2(0, 0),
                new LitMath.Vector2(10, 0));
            line1.startPoint.x = 10;
            LitMath.Line2 line2 = new LitMath.Line2(
                new LitMath.Vector2(5, 0),
                new LitMath.Vector2(5, 10));

            LitMath.Vector2 intersection = new LitMath.Vector2();
            if (LitMath.Line2.Intersect(line1, line2, ref intersection))
            {
                Console.WriteLine("相交: " + intersection.ToString());
            }

            LitMath.Rectangle2 rect = new LitMath.Rectangle2(new LitMath.Vector2(10, 10), 10, 20);
            Console.WriteLine(rect.ToString());
            Console.WriteLine(rect.leftBottom.ToString());
            Console.WriteLine(rect.leftTop.ToString());
            Console.WriteLine(rect.rightTop.ToString());
            Console.WriteLine(rect.rightBottom.ToString());

            LitMath.Circle2 circle = new LitMath.Circle2(new LitMath.Vector2(25, 25), 10);
            Console.WriteLine(circle.ToString());
            Console.WriteLine(circle.diameter.ToString());
        }
Ejemplo n.º 3
0
        internal override bool Hit(PickupBox pkbox, Entity entity)
        {
            Polyline polyline = entity as Polyline;

            if (polyline == null)
            {
                return(false);
            }

            Bounding pkBounding = pkbox.reservedBounding;

            for (int i = 1; i < polyline.NumberOfVertices; ++i)
            {
                LitMath.Line2 line = new LitMath.Line2(
                    polyline.GetPointAt(i - 1),
                    polyline.GetPointAt(i));

                if (LineHitter.BoundingIntersectWithLine(pkBounding, line))
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 镜像矩阵
        /// </summary>
        internal static LitMath.Matrix3 MirrorMatrix(LitMath.Line2 mirrorLine)
        {
            LitMath.Vector2 lineDir  = mirrorLine.direction;
            LitMath.Matrix3 matPos1  = LitMath.Matrix3.Translate(-mirrorLine.startPoint);
            double          rotAngle = LitMath.Vector2.SignedAngle(lineDir, new LitMath.Vector2(1, 0));

            LitMath.Matrix3 matRot1 = LitMath.Matrix3.Rotate(rotAngle);

            LitMath.Matrix3 mirrorMatX = new LitMath.Matrix3(
                1, 0, 0,
                0, -1, 0,
                0, 0, 1);

            LitMath.Matrix3 matRot2 = LitMath.Matrix3.Rotate(-rotAngle);
            LitMath.Matrix3 matPos2 = LitMath.Matrix3.Translate(mirrorLine.startPoint);

            return(matPos2 * matRot2 * mirrorMatX * matRot1 * matPos1);
        }
Ejemplo n.º 5
0
        internal override bool Cross(Bounding selectBound, Entity entity)
        {
            Polyline polyline = entity as Polyline;

            if (polyline == null)
            {
                return(false);
            }

            Bounding polylineBound = polyline.bounding;

            if (selectBound.Contains(polylineBound))
            {
                return(true);
            }

            LitMath.Rectangle2 selRect = new LitMath.Rectangle2(
                new LitMath.Vector2(selectBound.left, selectBound.bottom),
                new LitMath.Vector2(selectBound.right, selectBound.top));

            LitMath.Line2 rectLine1 = new LitMath.Line2(selRect.leftBottom, selRect.leftTop);
            LitMath.Line2 rectLine2 = new LitMath.Line2(selRect.leftTop, selRect.rightTop);
            LitMath.Line2 rectLine3 = new LitMath.Line2(selRect.rightTop, selRect.rightBottom);
            LitMath.Line2 rectLine4 = new LitMath.Line2(selRect.rightBottom, selRect.leftBottom);

            for (int i = 1; i < polyline.NumberOfVertices; ++i)
            {
                LitMath.Vector2 spnt         = polyline.GetPointAt(i - 1);
                LitMath.Vector2 epnt         = polyline.GetPointAt(i);
                LitMath.Line2   line2        = new LitMath.Line2(spnt, epnt);
                LitMath.Vector2 intersection = new LitMath.Vector2();
                if (LitMath.Line2.Intersect(rectLine1, line2, ref intersection) ||
                    LitMath.Line2.Intersect(rectLine2, line2, ref intersection) ||
                    LitMath.Line2.Intersect(rectLine3, line2, ref intersection) ||
                    LitMath.Line2.Intersect(rectLine4, line2, ref intersection))
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 6
0
        internal override bool Cross(Bounding selectBound, Entity entity)
        {
            Line line = entity as Line;

            if (line == null)
            {
                return(false);
            }

            Bounding lineBound = line.bounding;

            if (selectBound.Contains(lineBound))
            {
                return(true);
            }

            LitMath.Rectangle2 selRect = new LitMath.Rectangle2(
                new LitMath.Vector2(selectBound.left, selectBound.bottom),
                new LitMath.Vector2(selectBound.right, selectBound.top));

            LitMath.Line2 rectLine1 = new LitMath.Line2(selRect.leftBottom, selRect.leftTop);
            LitMath.Line2 rectLine2 = new LitMath.Line2(selRect.leftTop, selRect.rightTop);
            LitMath.Line2 rectLine3 = new LitMath.Line2(selRect.rightTop, selRect.rightBottom);
            LitMath.Line2 rectLine4 = new LitMath.Line2(selRect.rightBottom, selRect.leftBottom);
            LitMath.Line2 line2     = new LitMath.Line2(line.startPoint, line.endPoint);

            LitMath.Vector2 intersection = new LitMath.Vector2();
            if (LitMath.Line2.Intersect(rectLine1, line2, ref intersection) ||
                LitMath.Line2.Intersect(rectLine2, line2, ref intersection) ||
                LitMath.Line2.Intersect(rectLine3, line2, ref intersection) ||
                LitMath.Line2.Intersect(rectLine4, line2, ref intersection))
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }