internal Common.LineSegment GetReturnLine(LineSegment incoming)
 {
     if (overrideMagnitude == double.MinValue)
         return new LineSegment(incoming.EndingPos, ReturnAngle, incoming.Magnitude());
     else
         return new LineSegment(incoming.EndingPos, ReturnAngle, overrideMagnitude); ;
 }
 public LineSegment GetReflectionLine()
 {
     if(reflectionLine == null) {
         reflectionLine = new LineSegment(segmentToReturnOn.Magnitude(), lineToCenter.Angle().Adjust(new Angle(90, true)), incomingPath.EndingPos);
     }
     return reflectionLine;
 }
 public void op_SubtractionTest()
 {
     LineSegment a = new LineSegment(new Vector(3, 2), new Vector(1, 5));
     LineSegment b = new LineSegment(new Vector(1, 2), new Vector(6, 9));
     LineSegment expected = null;
     LineSegment actual;
     actual = (a - b);
     Assert.AreEqual(expected, actual);
     Assert.Inconclusive("Verify the correctness of this test method.");
 }
        public bool PassedEscapedFromEllipseTest(System.Windows.Media.Geometry geometry, LineSegment path)
        {
            if (this == null)
                throw new NullReferenceException();

            var intersect2 = geometry.FillContainsWithDetail(
                    new System.Windows.Media.RectangleGeometry(GetReturnLine(path).AsSystemRect()));
            if (intersect2 != System.Windows.Media.IntersectionDetail.Empty) {
                return false;
            } else return true;
        }
 internal void InitiateRandomWalk(Vector startingPosition = null, double stepSize = 5, int numberOfSteps = 100000)
 {
     this.numberOfSteps = numberOfSteps;
     startingPosition = CurrentPosition;
     if (startingPosition == null) {
         CurrentPosition = new Vector(boardBounds.Width / 2, boardBounds.Height / 2);
     }
     Vector endingPosition = null;
     for (stepCounter = 0; stepCounter < numberOfSteps; stepCounter++) {
         double angleToWalk = newDirectionGenerator();
         double x2 = CurrentPosition.GetX() + stepSize * Math.Cos(angleToWalk);
         double y2 = CurrentPosition.GetY() + stepSize * Math.Sin(angleToWalk);
         endingPosition = new Vector(x2, y2);
         LineSegment newPath = new LineSegment(CurrentPosition, endingPosition);
         pathWalker(newPath, Color.Blue);
         testForCollisionAndAdd(newPath);
     }
 }
 public void SetLineFromAngleAlone(LineSegment incomingPath)
 {
 }
 public ReflectionReturnValue(Angle angle, LineSegment lineToCenter)
 {
     this.Angle = angle;
     this.lineToCenter = lineToCenter;
 }
 public void Add(LineSegment addMe)
 {
     fullPath.Add(addMe);
 }
        private void testForCollisionAndAdd(LineSegment path)
        {
            ReflectionReturnValue reflectedLine = null;
            foreach (IObstruction obst in obstructions) {
                reflectedLine = obst.TestForCollision(path);
                if (reflectedLine != null && reflectedLine.Angle != null && stepCounter < numberOfSteps) {
                    reflectedLine.SetLineFromAngleAlone(path);
                    reflectedLine.PrintReflectionLine(g);
                    pathWalker(reflectedLine.GetLineToReturnOn(), Color.Red);
                    //LineSegment reflectedLine = new LineSegment(path.EndingPos, angleToReturnOn, path.Magnitude());
                    //pathWalker(reflectedLine, Color.Red);

                    testForCollisionAndAdd(reflectedLine.GetLineToReturnOn());
                }
            }
        }
 private bool youGotOutOfTheEllipse(LineSegment resultantVector)
 {
     if (Geometry.FillContainsWithDetail(resultantVector.AsLineGeometry()) != System.Windows.Media.IntersectionDetail.Empty) {
         return false;
     } else return true;
 }
 private Vector checkForPassedWalls(LineSegment path)
 {
     Vector newEndPoint = null;
     if (path.EndingPos.GetX() > Map.Width) {
         horizBoardIdx++;
         newEndPoint = new Vector(path.EndingPos.GetX() - Map.Width, path.EndingPos.GetY());
     }
     if (path.EndingPos.GetX() < 0) {
         horizBoardIdx--;
         newEndPoint = new Vector(path.EndingPos.GetX() + Map.Width, path.EndingPos.GetY());
     }
     if (path.EndingPos.GetY() > Map.Height) {
         vertBoardIdx++;
         newEndPoint = new Vector(path.EndingPos.GetX(), path.EndingPos.GetY() - Map.Height);
     }
     if (path.EndingPos.GetY() < 0) {
         vertBoardIdx--;
         newEndPoint = new Vector(path.EndingPos.GetX(), path.EndingPos.GetY() + Map.Height);
     }
     return newEndPoint;
 }
 private void testForCollisionAndAdd(LineSegment path)
 {
     ReflectedLine reflectedLine = null;
     Rectangle rectOfCentersToCheck = getRectangleForCentersToCheck(path);
     foreach (IObstruction obst in obstructions.Where(i => rectOfCentersToCheck.ContainsPoint(i.CenterPoint))) {
         reflectedLine = obst.TestForCollision(path);
         if (reflectedLine != null && reflectedLine.ReturnAngle != null && stepCounter < numberOfSteps) {
             if (!reflectedLine.PassedEscapedFromEllipseTest(obst.Geometry, path)) {
                 //This means we didn't get away
                 //Print relevant error data!!
                 pathWalker(reflectedLine.GetReturnLine(path), Color.Green);
                 //stepCounter = numberOfSteps;
             } else {
                 pathWalker(reflectedLine.GetReturnLine(path), Color.Red);
                 testForCollisionAndAdd(reflectedLine.GetReturnLine(path));
             }
         }
     }
 }
 private void pathWalker(LineSegment path, Color color)
 {
     stepCounter++;
     if (color == null)
         color = Color.Brown;
     printToBoard(path, color);
     fullPath.Add(path);
     var newEndPt = checkForPassedWalls(path);
     if (newEndPt == null)
         CurrentPosition = path.EndingPos;
     else CurrentPosition = newEndPt;
 }
 private Rectangle getRectangleForCentersToCheck(LineSegment path)
 {
     int leftEdge = (int)path.EndingPos.GetX() - Map.AxisMax;
     if (leftEdge < 0)
         leftEdge += Map.Width;
     int topEdge = (int)path.EndingPos.GetY() - Map.AxisMax;
     if (topEdge < 0)
         topEdge += Map.Height;
     int width = Map.AxisMax * 2;
     if (width + leftEdge > Map.Width)
     {}
     int height = Map.AxisMax * 2;
     if(height + topEdge > Map.Height)
     {}
     return new Rectangle(leftEdge, topEdge, height, width);
     //TODO: This code is buggy/not working and must be fixed!! The bounding rectangle of centers should wrap around the borders!!!!
 }
 public ReflectionReturnValue TestForCollision(LineSegment path)
 {
     var rectangle = new System.Windows.Rect((int)path.EndingPos.GetX(), (int)path.EndingPos.GetY(), 1,0);
     var intersect = Geometry.FillContainsWithDetail(new System.Windows.Media.RectangleGeometry(rectangle));
     if (intersect != System.Windows.Media.IntersectionDetail.Empty) {
         Angle incomingLineAngle = 180 - path.Angle();
         Angle incidentAngle = path.AngleBetweenPoints(CenterPoint);
         Debug.Print("Angle of incoming line: " +incomingLineAngle.ToString());
         Debug.Print("Angle to center line: " + incidentAngle.InDegrees().ToString());
         Angle returnAngle = path.Angle() - incidentAngle * 2;
         Debug.Print("Return Angle: " + returnAngle.ToString());
         return new ReflectionReturnValue(returnAngle, new LineSegment(CenterPoint, path.EndingPos));
     }
     return null;
 }
 public ReflectionReturnValue TestForCollision(LineSegment path)
 {
     Angle angleToReturnOn = null;
     if (path.Angle().InRadians() == 0)
         throw new Exception("This should never happen!");
     if (path.EndingPos.GetX() <= BoundingRectangle.Left || path.EndingPos.GetX() >= BoundingRectangle.Right){
         angleToReturnOn =new Angle(path.YComponent(), -path.XComponent());
     }
     if (path.EndingPos.GetY() >= BoundingRectangle.Bottom) {
         angleToReturnOn= new Angle(-path.YComponent(), path.XComponent());
     }
     if (path.EndingPos.GetY() <= BoundingRectangle.Top) {
         angleToReturnOn = new Angle(path.YComponent(), path.XComponent()).Negate();
     }
     return new ReflectionReturnValue(angleToReturnOn);
 }
 public void ReflectLineTest()
 {
     Vector start = null; // TODO: Initialize to an appropriate value
     Vector end = null; // TODO: Initialize to an appropriate value
     LineSegment target = new LineSegment(start, end); // TODO: Initialize to an appropriate value
     LineSegment lineToReflectOver = null; // TODO: Initialize to an appropriate value
     LineSegment expected = null; // TODO: Initialize to an appropriate value
     LineSegment actual;
     actual = target.ReflectOverLineThroughOrigin(lineToReflectOver);
     Assert.AreEqual(expected, actual);
     Assert.Inconclusive("Verify the correctness of this test method.");
 }
 private void pathWalker(LineSegment path, Color color)
 {
     stepCounter++;
     if (color == null)
         color = Color.Brown;
     printToBoard(path, color);
     fullPathWalked.Add(path);
     CurrentPosition = path.EndingPos;
 }
 private void printToBoard(LineSegment path, Color color)
 {
     Point startingPoint = new Point((int)path.StartingPos.GetX(), (int)path.StartingPos.GetY());
     Point endingPoint = new Point((int)path.EndingPos.GetX(), (int)path.EndingPos.GetY());
     g.DrawLine(new System.Drawing.Pen(color, 1f), startingPoint, endingPoint);
 }
        public ReflectedLine TestForCollision(Common.LineSegment path)
        {
            var intersect = Geometry.FillContainsWithDetail(new System.Windows.Media.RectangleGeometry(path.AsSystemRect()));
            if (intersect != System.Windows.Media.IntersectionDetail.Empty) {
                Angle incidentAngle = path.AngleBetweenPoints(CenterPoint);
                Angle incidentAngleTimesTwo = incidentAngle * 2;
                Angle threesixtyMinus = (new Angle(360, true) - incidentAngleTimesTwo);

                Common.LineSegment lineToCenter = new Common.LineSegment(path.EndingPos, CenterPoint);
                Angle oneEighty = new Angle(180, true);
                //SEARCH FOR THE RETURN ANGLE:
                var outLine = computeReturnAngle(oneEighty, path.Angle(), threesixtyMinus, incidentAngle, path);
                if (outLine != null)
                    return outLine;
                outLine = computeReturnAngle(oneEighty, path.Angle(), -threesixtyMinus, incidentAngle, path);
                if (outLine != null)
                    return outLine;

                outLine.Extend(path.Magnitude());
                outLine = computeReturnAngle(oneEighty, path.Angle(), threesixtyMinus, incidentAngle, path);
                if (outLine != null && outLine.PassedEscapedFromEllipseTest(Geometry, path) == true)
                    return outLine;
                outLine = computeReturnAngle(oneEighty, path.Angle(), -threesixtyMinus, incidentAngle, path);
                if (outLine != null && outLine.PassedEscapedFromEllipseTest(Geometry, path) == true)
                    return outLine;
                throw new Exception();
            }
            return null;
        }