Exemplo n.º 1
0
    private LineSuggestion FindSmallestDistance(LineSuggestion[] suggestions, Vector2 origin, LineSuggestion other)
    {
        LineSuggestion smallest = suggestions[0];

        for (int i = 1; i < suggestions.Length; i++)
        {
            if (suggestions[i].CompareLine(smallest.line, origin) > 0)
            {
                if (other == null)
                {
                    smallest = suggestions[i];
                }
                else
                {
                    if (suggestions[i].line.x == origin.x)
                    {
                        int sug1 = Math.Sign(suggestions[i].line.y - origin.y);
                        int sug2 = Math.Sign(other.line.y - origin.y);
                        // GD.Print("i: " + sug1 + ", other: " + sug2);
                        //sjekk y
                        if (sug1 != sug2)
                        {
                            smallest = suggestions[i];
                        }
                    }
                    else
                    {
                        int sug1 = Math.Sign(suggestions[i].line.x - origin.x);
                        int sug2 = Math.Sign(other.line.x - origin.x);
                        // GD.Print("i(" + suggestions[i].line.x + ", " + other.line.x + "): " + sug1 + ", other: " + sug2);
                        //sjekk x
                        if (sug1 != sug2)
                        {
                            smallest = suggestions[i];
                        }
                    }
                }
            }
        }

        return(smallest);
    }
Exemplo n.º 2
0
    // Bug: Den tegner strek UANSETT om den treffer en av sine egne linjer. Tenker ikke noe på om det finnes en strek som er nærmere eller om den går igjennom en annen sitt land.
    internal void SuggestConquest(InputEventMouseButton key)
    {
        double d1;

        differ = 0.025;

        d1 = Math.Tan(Map.mousePointingDegree * Math.PI / 180);

        Nation    targetNation = (Nation)(nations[Map.mousePointingNation]);
        ArrayList points       = targetNation.GetPoints();
        Vector2   mp           = GetGlobalMousePosition();

        suggestedPoints = new ArrayList();
        ArrayList tempLineSuggestions = new ArrayList();
        int       previous            = -1;
        int       next = -1;



        for (int i = 0; i < points.Count; i++)
        {
            // GD.Print("------------" + points.Count);
            Vector2 p1 = (Vector2)points[i];
            Vector2 p2 = (Vector2)points[(i + 1) % points.Count];
            double  a  = (p2.y + size) - (p1.y + size);
            double  b  = (p2.x + size) - (p1.x + size);
            double  d2 = a / b;

            double x;
            double y;

            if (!(d1 > d2 - differ && d1 < d2 + differ))
            {
                //TODO flytt dette til en generell sjekk hvor kuttes metode - Da kan jeg lett(ere) få til NATIONTEXT yalll!

                if (p1.x == p2.x)
                {
                    // Få til spesial tilfelle der x = 0 eller y = inf
                    x = p1.x;
                    y = (mp.y + (d1 * (x - mp.x)));
                }
                else
                {
                    double y1 = (mp.y + (d1 * -mp.x));
                    double y2 = (p1.y + (d2 * -p1.x));
                    x = ((y2 - y1) / (d1 - d2));
                    y = (d1 * x + y1);
                }

                // GD.Print("X: " + x + ", Y: " + y + " I mellom punkt: (" + p1.x + ", " + p1.y + ") og (" + p2.x + ", " + p2.y + ")");
                if (CheckX(p1, p2, x))
                {
                    if (CheckY(p1, p2, y))
                    {
                        tempLineSuggestions.Add(new LineSuggestion(new Vector2((float)(x), (float)(y)), i, tempLineSuggestions.Count));
                    }
                }
            }
        }

        if (tempLineSuggestions.Count < 2)
        {
            return;
        }

        LineSuggestion suggestionPoint1 = FindSmallestDistance(tempLineSuggestions.ToArray(typeof(LineSuggestion)) as LineSuggestion[], mp, null);

        tempLineSuggestions.RemoveAt(suggestionPoint1.tempindex);
        LineSuggestion suggestionPoint2 = FindSmallestDistance(tempLineSuggestions.ToArray(typeof(LineSuggestion)) as LineSuggestion[], mp, suggestionPoint1);

        if (suggestionPoint1.index < suggestionPoint2.index)
        {
            previous = suggestionPoint1.index;
            suggestedPoints.Add(suggestionPoint1.line);

            next = suggestionPoint2.index + 1;
            suggestedPoints.Add(suggestionPoint2.line);
        }
        else
        {
            previous = suggestionPoint2.index;
            suggestedPoints.Add(suggestionPoint2.line);

            next = suggestionPoint1.index + 1;
            suggestedPoints.Add(suggestionPoint1.line);
        }

        while (suggestedConquestLine2D.GetPointCount() != 0)
        {
            suggestedConquestLine2D.RemovePoint(suggestedConquestLine2D.GetPointCount() - 1);
        }
        for (int i = 0; i < suggestedPoints.Count; i++)
        {
            suggestedConquestLine2D.AddPoint(mp);
            suggestedConquestLine2D.AddPoint((Vector2)suggestedPoints[i]);
        }

        if (key != null && key.IsPressed() && key.ButtonIndex == 2)
        {
            TryConquest(previous, next, targetNation, key.Shift);
        }
    }