Пример #1
0
 public GridData(eState[,] tileStates)
 {
     _tileStates  = (eState[, ])tileStates.Clone();
     _winningLine = null;
     _width       = tileStates.GetLength(0);
     _height      = tileStates.GetLength(1);
 }
Пример #2
0
        private CompResult ComputeParallelLines(double width, List <MyPoint3D> cartPolygon, LineDefinition lineDef, List <MyPoint3D> intersections, bool addLinesToMap)
        {
            CompResult result = new CompResult();

            while (intersections.Count > 1)
            {
                intersections = intersections.Distinct(new MyPoint3D.MyPoint3D_EqualityComparer()).ToList();
                if (intersections.Min(p => p.Y) == intersections.Max(p => p.Y))
                {
                    intersections.Sort(new MyPoint3D.MyPoint3D_ComparerByX());
                }
                else
                {
                    intersections.Sort(new MyPoint3D.MyPoint3D_ComparerByY());
                }

                for (int i = 0; i < intersections.Count - 1; i += 2)
                {
                    var p1 = intersections[i + 1];
                    var p2 = intersections[i];
                    result.LinesLength += (p1 - p2).Norm;
                    result.LinesCount++;
                    if (addLinesToMap)
                    {
                        AddLineToMap(p1, p2);
                        AddSwathToMap(p1, p2, width);
                    }
                }
                lineDef       = LineDefinition.GetParallelLine(lineDef, width);
                intersections = Utility.GetHeadlandIntersections(cartPolygon, lineDef, width);
            }
            return(result);
        }
Пример #3
0
        /// <summary>
        /// Gets the value of PWL for given time.
        /// </summary>
        /// <param name="time">Time.</param>
        /// <returns>
        /// PWL's value for given time.
        /// </returns>
        protected double GetLineValue(double time)
        {
            while (_currentLineIndex < _pwlPoints)
            {
                if (Times[_currentLineIndex] >= time)
                {
                    long prevLineIndex = _currentLineIndex - 1;
                    if (prevLineIndex >= 0)
                    {
                        if (_lineDefinition == null)
                        {
                            _lineDefinition  = CreateLineParameters(Times[prevLineIndex], Times[_currentLineIndex], Voltages[prevLineIndex], Voltages[_currentLineIndex]);
                            _breakPointAdded = false;
                        }
                        return((_lineDefinition.A * time) + _lineDefinition.B);
                    }
                    else
                    {
                        return(Voltages[0]);
                    }
                }

                _breakPointAdded = false;
                _lineDefinition  = null;
                _currentLineIndex++;
            }

            return(Voltages[_pwlPoints - 1]);
        }
Пример #4
0
 public void IncrementScore(int winner, LineDefinition winningLine)
 {
     if(winner > -1)
     {
         ++_scores[winner];
     }
 }
Пример #5
0
 public GridData(eState[,] tileStates)
 {
     _tileStates = (eState[,])tileStates.Clone();
     _winningLine = null;
     _width = tileStates.GetLength(0);
     _height = tileStates.GetLength(1);
 }
Пример #6
0
 public void IncrementScore(int winner, LineDefinition winningLine)
 {
     if (winner > -1)
     {
         ++_scores[winner];
     }
 }
 public void HighlightWinningLine(int winner, LineDefinition winningLine)
 {
     if(winningLine != null)
     {
         StartCoroutine(_gridDisplay.FlashWinningTiles(winningLine, _gameManager.ResetScene));
     }
 }
 public void HighlightWinningLine(int winner, LineDefinition winningLine)
 {
     if (winningLine != null)
     {
         StartCoroutine(_gridDisplay.FlashWinningTiles(winningLine, _gameManager.ResetScene));
     }
 }
Пример #9
0
 public GridData(int width, int height)
 {
     _tileStates  = null;
     _winningLine = null;
     _width       = width;
     _height      = height;
     _tileStates  = new eState[width, height];
 }
Пример #10
0
 public GridData(int width, int height)
 {
     _tileStates = null;
     _winningLine = null;
     _width = width;
     _height = height;
     _tileStates = new eState[width, height];
 }
Пример #11
0
        void doAllFields()
        {
            if (selectedField == null)
            {
                if (Fields.Count > 0)
                {
                    selectedField = Fields.First();
                }
            }

            GuidanceLines.Clear();
            Swathes.Clear();
            AnalysisResult.Clear();
            foreach (var poly in Fields)
            {
                PointExtension.LocalLatitude = poly.Locations.Min(p => p.Latitude);

                var geoPolygon = new List <GeoPoint>();
                foreach (var p in poly.Locations)
                {
                    geoPolygon.Add(p.ToGeoPoint());
                }

                List <MyPoint3D> cartPolygon = new List <MyPoint3D>();
                foreach (var p in poly.Locations)
                {
                    cartPolygon.Add(p.ToGeoPoint().ToCart());
                }

                var lineDef = LineDefinition.GetBestLine(cartPolygon);
                var res     = AnalyzeFieldAndShowSwaths(poly, lineDef);
                if (double.IsNaN(res.AppliedArea))
                {
                    continue;
                }
                res.AppliedArea = res.AppliedArea / 10000;
                res.FieldArea   = res.FieldArea / 10000;
                //res.Savings = (res.AppliedArea - res.FieldArea) * CostHa;
                res.SectionSaving = (res.AppliedArea - res.FieldArea) * CostHa * (1 - 1.0 / NumberOfSections);
                res.SectionLoss   = (res.AppliedArea - res.FieldArea) * CostHa - res.SectionSaving;
                res.FieldName     = (AnalysisResult.Count + 1).ToString();
                AnalysisResult.Add(res);
            }
            AppliedArea   = AnalysisResult.Sum(r => r.AppliedArea);
            FieldArea     = AnalysisResult.Sum(r => r.FieldArea);
            SectionSaving = AnalysisResult.Sum(r => r.SectionSaving);
            SectionLoss   = AnalysisResult.Sum(r => r.SectionLoss);

            double totalNozzleSaving = (AppliedArea - FieldArea) * CostHa * (1 - 1.0 / NumberOfNozzles);

            NozzleSaving = totalNozzleSaving - SectionSaving;
            NozzleLoss   = (AppliedArea - FieldArea) * CostHa - totalNozzleSaving;

            SectionPaybackHa = SectionControlPrice / (SectionSaving / AppliedArea);
            NozzlePaybackHa  = (NozzleControlPrice - SectionControlPrice) / (NozzleSaving / AppliedArea);
        }
Пример #12
0
        private void FindWinningLine(Move move)
        {
            List <LineDefinition> lines = GetLines(move);

            foreach (LineDefinition line in lines)
            {
                if (IsWinningLine(line))
                {
                    _winningLine = line;
                }
            }
        }
Пример #13
0
    public IEnumerator FlashWinningTiles(LineDefinition winningLine, PostFlashRoutine postFlashRoutine)
    {
        for(int flashCount = 0; flashCount < 6; ++flashCount)
        {
            yield return new WaitForSeconds(0.15f);
            bool flashOn = flashCount%2 == 0;

            for(int tileCount = 0; tileCount < 3; ++tileCount)
            {
                Move tilePosition = winningLine.GetMove(tileCount);
                TileDisplay tileDisplay = GetTileDisplay(tilePosition);
                tileDisplay.SetWinningFlashMaterial(flashOn);
            }
        }
        postFlashRoutine();
    }
Пример #14
0
        public static LineDefinitionList XmlToLineDefinitionsList(string body)
        {
            var lineList = new LineDefinitionList();
            var doc      = XDocument.Parse(body);

            // Handle all LINES
            var lines = from node in doc.Descendants(NS + "line")
                        select new
            {
                object_type = node.Attribute(MOVENS + "object-type").Value,
                name        = (node.Attribute("title") == null) ? null : node.Attribute("title").Value,
                active      = (node.Attribute(MOVENS + "active") == null) ? null : node.Attribute(MOVENS + "active").Value,
                id          = (node.Attribute(MOVENS + "id") == null) ? null : node.Attribute(MOVENS + "id").Value,
                stroke      = (node.Attribute("stroke") == null) ? null : node.Attribute("stroke").Value,
                used        = ((node.Attribute(MOVENS + "used") != null) ? (node.Attribute(MOVENS + "used").Value.ToLower() == "true") : false),
                x1          = node.Attribute("x1").Value,
                y1          = node.Attribute("y1").Value,
                x2          = node.Attribute("x2").Value,
                y2          = node.Attribute("y2").Value,
                events      = ((node.Attribute("name") == null) ? null : node.Attribute("name").Value)
            };

            foreach (var line in lines)
            {
                if (line.object_type.ToUpper() != LINE)
                {
                    continue;
                }

                var newLine = new LineDefinition();
                newLine.Id         = int.Parse(line.id);
                newLine.Name       = line.name;
                newLine.Active     = (line.active.ToLower() == "true");
                newLine.Used       = line.used;
                newLine.Color      = line.stroke;
                newLine.LeftName   = LeftName(line.events);
                newLine.RightName  = RightName(line.events);
                newLine.Initial.X  = (int)Convert.ToDouble(line.x1);
                newLine.Initial.Y  = (int)Convert.ToDouble(line.y1);
                newLine.Terminal.X = (int)Convert.ToDouble(line.x2);
                newLine.Terminal.Y = (int)Convert.ToDouble(line.y2);
                lineList.LineDefinitions.Add(newLine);
            }

            return(lineList);
        }
Пример #15
0
    public IEnumerator FlashWinningTiles(LineDefinition winningLine, PostFlashRoutine postFlashRoutine)
    {
        for (int flashCount = 0; flashCount < 6; ++flashCount)
        {
            yield return(new WaitForSeconds(0.15f));

            bool flashOn = flashCount % 2 == 0;

            for (int tileCount = 0; tileCount < 3; ++tileCount)
            {
                Move        tilePosition = winningLine.GetMove(tileCount);
                TileDisplay tileDisplay  = GetTileDisplay(tilePosition);
                tileDisplay.SetWinningFlashMaterial(flashOn);
            }
        }
        postFlashRoutine();
    }
Пример #16
0
        public static bool LinesIntersection3d(LineDefinition lineA, LineDefinition lineB, out Vector3d closestPointA, out Vector3d closestPointB)
        {
            closestPointA = Vector3d.Zero;
            closestPointB = Vector3d.Zero;
            var dirProjection = lineA.UnitDirection.Dot(lineB.UnitDirection);

            if (Math.Abs(Math.Abs(dirProjection) - 1.0) < 0.00001)
            {
                return(false); // parallel sides
            }
            var sepProjection1 = (lineB.Point - lineA.Point).Dot(lineA.UnitDirection);
            var sepProjection2 = (lineB.Point - lineA.Point).Dot(lineB.UnitDirection);
            var d1             = (sepProjection1 - dirProjection * sepProjection2) / (1 - dirProjection * dirProjection);
            var d2             = (dirProjection * sepProjection1 - sepProjection2) / (1 - dirProjection * dirProjection);

            closestPointA = lineA.Point + d1 * lineA.UnitDirection;
            closestPointB = lineB.Point + d2 * lineB.UnitDirection;
            return(true);
        }
Пример #17
0
        private bool IsWinningLine(LineDefinition lineDefinition)
        {
            Move   firstMove  = lineDefinition.GetMove(0);
            eState firstState = _tileStates[firstMove._column, firstMove._row];

            if (firstState == eState.empty)
            {
                return(false);
            }

            for (int tileCount = 1; tileCount < 3; ++tileCount)
            {
                Move move = lineDefinition.GetMove(tileCount);

                if (_tileStates[move._column, move._row] != firstState)
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #18
0
        void processField()
        {
            PointExtension.LocalLatitude = selectedField.Locations.Min(p => p.Latitude);
            LineDefinition lineDef_AB = LineDefinition.GetLineDefinition(flagA.Location.ToGeoPoint().ToCart(), flagB.Location.ToGeoPoint().ToCart());

            GuidanceLines.Clear();
            Swathes.Clear();
            AnalysisResult res = AnalyzeFieldAndShowSwaths(selectedField, lineDef_AB);

            AppliedArea = res.AppliedArea / 10000;
            FieldArea   = res.FieldArea / 10000;
            //Savings = (res.AppliedArea - res.FieldArea) / 10000 * CostHa;
            SectionSaving = (res.AppliedArea - res.FieldArea) / 10000 * CostHa * (1 - 1.0 / NumberOfSections);
            SectionLoss   = (res.AppliedArea - res.FieldArea) / 10000 * CostHa - SectionSaving;

            double totalNozzleSaving = (res.AppliedArea - res.FieldArea) / 10000 * CostHa * (1 - 1.0 / NumberOfNozzles);

            NozzleSaving = totalNozzleSaving - SectionSaving;
            NozzleLoss   = (res.AppliedArea - res.FieldArea) / 10000 * CostHa - totalNozzleSaving;

            SectionPaybackHa = SectionControlPrice / (SectionSaving / AppliedArea);
            NozzlePaybackHa  = (NozzleControlPrice - SectionControlPrice) / (NozzleSaving / AppliedArea);
        }
Пример #19
0
 private void FindWinningLine(Move move)
 {
     List<LineDefinition> lines = GetLines(move);
     foreach(LineDefinition line in lines)
     {
         if(IsWinningLine(line))
         {
             _winningLine = line;
         }
     }
 }
Пример #20
0
 public static void OnGameWonEvent(int winningPlayer, LineDefinition winningLine)
 {
     OnGameWon(winningPlayer, winningLine);
 }
 public bool Equals(LineDefinition other)
 {
     return this.LineParams.IsSameLine(other.LineParams);
 }
Пример #22
0
        private bool IsWinningLine(LineDefinition lineDefinition)
        {
            Move firstMove = lineDefinition.GetMove(0);
            eState firstState = _tileStates[firstMove._column, firstMove._row];

            if(firstState == eState.empty)
            {
                return false;
            }

            for(int tileCount = 1; tileCount < 3; ++tileCount)
            {
                Move move = lineDefinition.GetMove(tileCount);

                if(_tileStates[move._column, move._row] != firstState)
                {
                    return false;
                }
            }
            return true;
        }
Пример #23
0
        public void TestChooseHeadlandInterstion()
        {
            List <MyPoint3D> headland = new List <MyPoint3D>();

            //headland.Add(new MyPoint3D());
            headland.Add(new MyPoint3D()
            {
                X = 10
            });
            headland.Add(new MyPoint3D()
            {
                Y = 10
            });
            headland.Add(new MyPoint3D()
            {
                X = -10
            });
            headland.Add(new MyPoint3D()
            {
                Y = -10
            });
            headland.Add(new MyPoint3D()
            {
                X = 10
            });
            //headland.Add(new MyPoint3D());

            LineDefinition line = new LineDefinition()
            {
                k = 1
            };
            LineDefinition headlandLine = new LineDefinition()
            {
                k = -1, b = 10
            };
            var intersection = Utility.ChooseHeadlandIntersection(headland, line, 2, headlandLine, new MyPoint3D()
            {
                X = 5, Y = 5
            });

            Assert.AreEqual(5 - Math.Sqrt(2) / 2, intersection.X);
            Assert.AreEqual(5 - Math.Sqrt(2) / 2, intersection.Y);

            line = new LineDefinition()
            {
                k = -1
            };
            headlandLine = new LineDefinition()
            {
                k = 1, b = -10
            };
            intersection = Utility.ChooseHeadlandIntersection(headland, line, 2, headlandLine, new MyPoint3D()
            {
                X = 5, Y = -5
            });
            Assert.AreEqual(true, Math.Abs(5 - Math.Sqrt(2) / 2 - intersection.X) < 0.00000001);
            Assert.AreEqual(true, Math.Abs(-5 + Math.Sqrt(2) / 2 - intersection.Y) < 0.00000001);

            line = new LineDefinition()
            {
                k = -1
            };
            headlandLine = new LineDefinition()
            {
                k = 1, b = 10
            };
            intersection = Utility.ChooseHeadlandIntersection(headland, line, 2, headlandLine, new MyPoint3D()
            {
                X = -5, Y = 5
            });
            Assert.AreEqual(true, Math.Abs(-5 + Math.Sqrt(2) / 2 - intersection.X) < 0.00000001);
            Assert.AreEqual(true, Math.Abs(5 - Math.Sqrt(2) / 2 - intersection.Y) < 0.00000001);

            line = new LineDefinition()
            {
                k = 1
            };
            headlandLine = new LineDefinition()
            {
                k = -1, b = -10
            };
            intersection = Utility.ChooseHeadlandIntersection(headland, line, 2, headlandLine, new MyPoint3D()
            {
                X = -5, Y = -5
            });
            Assert.AreEqual(true, Math.Abs(-5 + Math.Sqrt(2) / 2 - intersection.X) < 0.00000001);
            Assert.AreEqual(true, Math.Abs(-5 + Math.Sqrt(2) / 2 - intersection.Y) < 0.00000001);



            headland = new List <MyPoint3D>();
            headland.Add(new MyPoint3D()
            {
                X = 25.0 / 3
            });
            headland.Add(new MyPoint3D()
            {
                Y = 25.0 / 4
            });
            headland.Add(new MyPoint3D()
            {
                X = -25.0 / 3
            });
            headland.Add(new MyPoint3D()
            {
                Y = -25.0 / 4
            });
            headland.Add(new MyPoint3D()
            {
                X = 25.0 / 3
            });

            line = new LineDefinition()
            {
                k = 4.0 / 3
            };
            headlandLine = new LineDefinition()
            {
                k = -3.0 / 4, b = 25.0 / 4
            };
            intersection = Utility.ChooseHeadlandIntersection(headland, line, 2, headlandLine, new MyPoint3D()
            {
                X = 3, Y = 4
            });
            Assert.AreEqual(true, Math.Abs(3 - 3.0 / 5 - intersection.X) < 0.00000001);
            Assert.AreEqual(true, Math.Abs(4 - 4.0 / 5 - intersection.Y) < 0.00000001);

            line = new LineDefinition()
            {
                k = 4.0 / 3
            };
            headlandLine = new LineDefinition()
            {
                k = -3.0 / 4, b = -25.0 / 4
            };
            intersection = Utility.ChooseHeadlandIntersection(headland, line, 2, headlandLine, new MyPoint3D()
            {
                X = -3, Y = -4
            });
            Assert.AreEqual(true, Math.Abs(-3 + 3.0 / 5 - intersection.X) < 0.00000001);
            Assert.AreEqual(true, Math.Abs(-4 + 4.0 / 5 - intersection.Y) < 0.00000001);



            headland = new List <MyPoint3D>();
            headland.Add(new MyPoint3D()
            {
                X = 90, Y = 10
            });
            headland.Add(new MyPoint3D()
            {
                X = -30, Y = 90
            });
            headland.Add(new MyPoint3D()
            {
                X = 70, Y = 125
            });
            headland.Add(new MyPoint3D()
            {
                X = 90, Y = 10
            });

            line = LineDefinition.GetLineDefinition(new MyPoint3D(), new MyPoint3D()
            {
                X = 15, Y = 60
            });
            headlandLine = LineDefinition.GetLineDefinition(new MyPoint3D()
            {
                X = 90, Y = 10
            }, new MyPoint3D()
            {
                X = -30, Y = 90
            });
            intersection = Utility.ChooseHeadlandIntersection(headland, line, 10, headlandLine, new MyPoint3D()
            {
                X = 15, Y = 60
            });
        }
Пример #24
0
 public static void OnGameWonEvent(int winningPlayer, LineDefinition winningLine)
 {
     OnGameWon(winningPlayer, winningLine);
 }
Пример #25
0
        private AnalysisResult AnalyzeFieldAndShowSwaths(FieldVM polygon, LineDefinition lineDef)
        {
            double processedArea = 0;
            double width         = ImplementWidth;
            var    geoPolygon    = new List <GeoPoint>();

            foreach (var p in polygon.Locations)
            {
                geoPolygon.Add(p.ToGeoPoint());
            }

            List <MyPoint3D> cartPolygon = new List <MyPoint3D>();

            foreach (var p in polygon.Locations)
            {
                cartPolygon.Add(p.ToGeoPoint().ToCart());
            }

            double length = width / 2.0;

            if (Utility.CalculateArea(geoPolygon, false) < 0)
            {
                length = -length;
            }


            List <MyPoint3D> boundary = new List <MyPoint3D>();
            MyPoint3D        prevP    = cartPolygon[0];

            boundary.Add(cartPolygon[0]);
            for (int i = 1; i < cartPolygon.Count; i++)
            {
                if ((prevP - cartPolygon[i]).Norm < 3)
                {
                    continue;
                }
                prevP = cartPolygon[i];
                boundary.Add(cartPolygon[i]);
            }
            if ((boundary.First() - boundary.Last()).Norm < 3)
            {
                boundary.Remove(boundary.Last());
            }

            length = -length;
            List <MyPoint3D> headLand = Utility.ShiftBoundary(length, boundary);

            headLand.Add(headLand.First());
            List <MyPoint3D> innerBoundary = Utility.ShiftBoundary(2 * length, boundary);

            AddHeadLandToMap(headLand);
            AddOuterSwathToMap(boundary, innerBoundary);

            var intersections = Utility.GetHeadlandIntersections(headLand, lineDef, width);

            processedArea += width * ComputeParallelLines(width, headLand, lineDef, intersections, true).LinesLength;

            lineDef        = LineDefinition.GetParallelLine(lineDef, -width);
            intersections  = Utility.GetHeadlandIntersections(headLand, lineDef, width);
            processedArea += width * ComputeParallelLines(-width, headLand, lineDef, intersections, true).LinesLength;
            for (int i = 1; i < headLand.Count; i++)
            {
                processedArea += width * (headLand[i - 1] - headLand[i]).Norm;
            }

            AnalysisResult res = new AnalysisResult();

            res.AppliedArea = processedArea;
            res.FieldArea   = Utility.CalculateArea(geoPolygon);
            return(res);
        }