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); } }
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()); }
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); }
/// <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); }
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); }
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); } }