Exemplo n.º 1
0
    private static void DrawLinePartToBuffer(Color32[] buffer, Vector2 bufferPosition, int bufferWidth, int bufferHeight, Color32 color, double sx, double sy, double p1tx, double p1ty, double p2tx, double p2ty, int j, int maxX, ref double ppx1, int w, bool invertY, float zoomScale)
    {
        if ((p1tx < bufferPosition.x && p2tx < bufferPosition.x) || (p1tx > bufferPosition.x + (bufferWidth >> 8) / zoomScale && p2tx > bufferPosition.x + (bufferWidth >> 8) / zoomScale))
        {
            return;
        }
        if ((p1ty < bufferPosition.y && p2ty < bufferPosition.y) || (p1ty > bufferPosition.y + (bufferHeight >> 8) / zoomScale && p2ty > bufferPosition.y + (bufferHeight >> 8) / zoomScale))
        {
            return;
        }

        if ((p1tx - p2tx) * (p1tx - p2tx) + (p1ty - p2ty) * (p1ty - p2ty) > 0.04)
        {
            double p3tx = (p1tx + p2tx) / 2;
            double p3ty = (p1ty + p2ty) / 2;
            DrawLinePartToBuffer(buffer, bufferPosition, bufferWidth, bufferHeight, color, sx, sy, p1tx, p1ty, p3tx, p3ty, j, maxX, ref ppx1, w, invertY, zoomScale);
            DrawLinePartToBuffer(buffer, bufferPosition, bufferWidth, bufferHeight, color, sx, sy, p3tx, p3ty, p2tx, p2ty, j, maxX, ref ppx1, w, invertY, zoomScale);
            return;
        }

        p1tx -= sx;
        p2tx -= sx;
        p1ty -= sy;
        p2ty -= sy;

        if (j == 0)
        {
            if (p1tx < maxX * -0.25)
            {
                p1tx += maxX;
            }
            else if (p1tx > maxX * 0.75)
            {
                p1tx -= maxX;
            }
        }
        else
        {
            double gpx1 = p1tx + maxX;
            double lpx1 = p1tx - maxX;

            if (Math.Abs(ppx1 - gpx1) < Math.Abs(ppx1 - p1tx))
            {
                p1tx = gpx1;
            }
            else if (Math.Abs(ppx1 - lpx1) < Math.Abs(ppx1 - p1tx))
            {
                p1tx = lpx1;
            }
        }

        ppx1 = p1tx;

        double gpx2 = p2tx + maxX;
        double lpx2 = p2tx - maxX;

        if (Math.Abs(ppx1 - gpx2) < Math.Abs(ppx1 - p2tx))
        {
            p2tx = gpx2;
        }
        else if (Math.Abs(ppx1 - lpx2) < Math.Abs(ppx1 - p2tx))
        {
            p2tx = lpx2;
        }

        double p1x = (p1tx + sx - bufferPosition.x) / zoomScale;
        double p1y = (p1ty + sy - bufferPosition.y) / zoomScale;
        double p2x = (p2tx + sx - bufferPosition.x) / zoomScale;
        double p2y = (p2ty + sy - bufferPosition.y) / zoomScale;

        if (p1x > maxX && p2x > maxX)
        {
            p1x -= maxX;
            p2x -= maxX;
        }

        double fromX = p1x * OnlineMapsUtils.tileSize;
        double fromY = p1y * OnlineMapsUtils.tileSize;
        double toX   = p2x * OnlineMapsUtils.tileSize;
        double toY   = p2y * OnlineMapsUtils.tileSize;

        double stX = (fromX < toX ? fromX : toX) - w;

        if (stX < 0)
        {
            stX = 0;
        }
        else if (stX > bufferWidth)
        {
            stX = bufferWidth;
        }

        double stY = (fromY < toY ? fromY : toY) - w;

        if (stY < 0)
        {
            stY = 0;
        }
        else if (stY > bufferHeight)
        {
            stY = bufferHeight;
        }

        double endX = (fromX > toX ? fromX : toX) + w;

        if (endX < 0)
        {
            endX = 0;
        }
        else if (endX > bufferWidth)
        {
            endX = bufferWidth;
        }

        double endY = (fromY > toY ? fromY : toY) + w;

        if (endY < 0)
        {
            endY = 0;
        }
        else if (endY > bufferHeight)
        {
            endY = bufferHeight;
        }

        int istx = (int)Math.Round(stX);
        int isty = (int)Math.Round(stY);

        int sqrW = w * w;

        int lengthX = (int)Math.Round(endX - stX);
        int lengthY = (int)Math.Round(endY - stY);

        byte  clrR  = color.r;
        byte  clrG  = color.g;
        byte  clrB  = color.b;
        byte  clrA  = color.a;
        float alpha = clrA / 256f;

        if (alpha > 1)
        {
            alpha = 1;
        }

        for (int y = 0; y < lengthY; y++)
        {
            double py      = y + stY;
            int    ipy     = y + isty;
            double centerY = py + 0.5;
            if (!invertY)
            {
                ipy = bufferHeight - ipy - 1;
            }
            ipy *= bufferWidth;

            for (int x = 0; x < lengthX; x++)
            {
                double px      = x + stX;
                int    ipx     = x + istx;
                double centerX = px + 0.5;

                double npx, npy;

                OnlineMapsUtils.NearestPointStrict(centerX, centerY, fromX, fromY, toX, toY, out npx, out npy);
                double onpx = centerX - npx;
                double onpy = centerY - npy;

                double dist = onpx * onpx + onpy * onpy;

                if (dist <= sqrW)
                {
                    int     bufferIndex = ipy + ipx;
                    Color32 pc          = buffer[bufferIndex];
                    pc.r = (byte)((clrR - pc.r) * alpha + pc.r);
                    pc.g = (byte)((clrG - pc.g) * alpha + pc.g);
                    pc.b = (byte)((clrB - pc.b) * alpha + pc.b);
                    pc.a = (byte)((clrA - pc.a) * alpha + pc.a);
                    buffer[bufferIndex] = pc;
                }
            }
        }
    }
Exemplo n.º 2
0
    public override bool HitTest(Vector2 positionLngLat, int zoom)
    {
        if (points == null)
        {
            return(false);
        }

        double cx, cy;
        OnlineMapsProjection projection = manager.map.projection;

        projection.CoordinatesToTile(positionLngLat.x, positionLngLat.y, zoom, out cx, out cy);

        int valueType = -1; // 0 - Vector2, 1 - float, 2 - double, 3 - OnlineMapsVector2d

        object v1 = null;
        object v2 = null;
        object v3 = null;
        int    i  = 0;

        float w    = hitTestWidth.HasValue ? hitTestWidth.Value : width;
        float sqrW = w * w;

        foreach (object p in points)
        {
            if (valueType == -1)
            {
                if (p is Vector2)
                {
                    valueType = 0;
                }
                else if (p is float)
                {
                    valueType = 1;
                }
                else if (p is double)
                {
                    valueType = 2;
                }
                else if (p is OnlineMapsVector2d)
                {
                    valueType = 3;
                }
            }

            object v4 = v3;
            v3 = v2;
            v2 = v1;
            v1 = p;

            double p1tx = 0, p1ty = 0, p2tx = 0, p2ty = 0;
            bool   drawPart = false;

            if (valueType == 0)
            {
                if (i > 0)
                {
                    Vector2 p1 = (Vector2)v2;
                    Vector2 p2 = (Vector2)v1;

                    projection.CoordinatesToTile(p1.x, p1.y, zoom, out p1tx, out p1ty);
                    projection.CoordinatesToTile(p2.x, p2.y, zoom, out p2tx, out p2ty);
                    drawPart = true;
                }
            }
            else if (valueType == 3)
            {
                if (i > 0)
                {
                    OnlineMapsVector2d p1 = (OnlineMapsVector2d)v2;
                    OnlineMapsVector2d p2 = (OnlineMapsVector2d)v1;

                    projection.CoordinatesToTile(p1.x, p1.y, zoom, out p1tx, out p1ty);
                    projection.CoordinatesToTile(p2.x, p2.y, zoom, out p2tx, out p2ty);
                    drawPart = true;
                }
            }
            else if (i > 2 && i % 2 == 1)
            {
                if (valueType == 1)
                {
                    projection.CoordinatesToTile((float)v4, (float)v3, zoom, out p1tx, out p1ty);
                    projection.CoordinatesToTile((float)v2, (float)v1, zoom, out p2tx, out p2ty);
                }
                else if (valueType == 2)
                {
                    projection.CoordinatesToTile((double)v4, (double)v3, zoom, out p1tx, out p1ty);
                    projection.CoordinatesToTile((double)v2, (double)v1, zoom, out p2tx, out p2ty);
                }
                drawPart = true;
            }

            if (drawPart)
            {
                double nx, ny;
                OnlineMapsUtils.NearestPointStrict(cx, cy, p1tx, p1ty, p2tx, p2ty, out nx, out ny);
                double dx = (cx - nx) * OnlineMapsUtils.tileSize;
                double dy = (cy - ny) * OnlineMapsUtils.tileSize;
                double d  = dx * dx + dy * dy;
                if (d < sqrW)
                {
                    return(true);
                }
            }

            i++;
        }

        return(false);
    }