Esempio n. 1
0
        public void DrawCoordinationSystem(ModelViewSurface surface, SKCanvas canvas)
        {
            float h = surface.ViewHeight / 20;
            float w = h / 5;

            SKPath arrow = new SKPath();

            arrow.MoveTo(-w, -2 * w);
            arrow.LineTo(-w, 4 * w);
            arrow.LineTo(-2 * w, 4 * w);
            arrow.LineTo(0, 6 * w);
            arrow.LineTo(2 * w, 4 * w);
            arrow.LineTo(w, 4 * w);
            arrow.LineTo(w, -2 * w);
            arrow.Close();

            SKPaint arrowPaint = new SKPaint()
            {
                Style       = SKPaintStyle.StrokeAndFill,
                Color       = Color.FromRgb(30, 30, 40).ToSKColor(),
                IsAntialias = true,
                BlendMode   = SKBlendMode.Lighten,
                StrokeWidth = 1,
                TextAlign   = SKTextAlign.Center,
                TextSize    = 2 * w
            };

            float px = 3 * w;
            float py = surface.ViewHeight - 3 * w;

            arrow.Transform(SKMatrix.MakeTranslation(px, py));
            arrow.Transform(SKMatrix.MakeRotation((float)Math.PI, px, py));
            canvas.DrawPath(arrow, arrowPaint);
            arrow.Transform(SKMatrix.MakeRotation((float)Math.PI / 2, px, py));
            canvas.DrawPath(arrow, arrowPaint);

            arrowPaint.Color = Color.White.ToSKColor();
            canvas.DrawText("Y", px, py - 8 * w, arrowPaint);
            canvas.DrawText("X", px + 8 * w, py + w / 2, arrowPaint);
        }
Esempio n. 2
0
        public void DrawAxisText(ModelViewSurface surface, SKCanvas canvas)
        {
            SKPaint axisPaint = new SKPaint()
            {
                Style       = SKPaintStyle.StrokeAndFill,
                Color       = Color.LightGray.ToSKColor(),
                IsAntialias = true,
                BlendMode   = SKBlendMode.Lighten,
                StrokeWidth = 1,
                TextAlign   = SKTextAlign.Center,
                TextSize    = surface.ViewHeight / 75
            };

            for (float x = gridStartXbig; x < surface.ViewWidth * surface.ScaleFactor; x += ScaledStep * 10)
            {
                SKPoint pt = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = x, Y = surface.Origin.Y
                },
                                                              surface.ScaleFactor, surface.Origin, surface.ViewHeight);
                pt.Y -= axisPaint.TextSize * 2;
                canvas.DrawText(x.ToString("F1"), pt, axisPaint);
            }

            axisPaint.TextAlign = SKTextAlign.Left;
            for (float y = gridStartYbig + ScaledStep * 10; y < surface.ViewHeight * surface.ScaleFactor; y += ScaledStep * 10)
            {
                SKPoint pt = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = surface.Origin.X,
                    Y = y
                }, surface.ScaleFactor, surface.Origin, surface.ViewHeight);
                pt.X += axisPaint.TextSize;
                pt.Y += axisPaint.TextSize / 2;
                canvas.DrawText(y.ToString("F1"), pt, axisPaint);
            }
        }
Esempio n. 3
0
        public void DrawGrid(ModelViewSurface surface, SKCanvas canvas)
        {
            if (UpdateNeeded)
            {
                gridBMP    = new SKBitmap((int)Math.Round(surface.ViewWidth), (int)Math.Round(surface.ViewHeight));
                gridBuffer = new SKCanvas(gridBMP);
                float x = surface.Origin.X;
                float y = surface.Origin.Y;
                // Найдём ближайшее кратное
                // Количество крупных и мелких делений сетки всегда примерно определённое.
                // Берём ширину окна просмотра и делим её на сто частей
                float stepx = surface.ViewWidth / 100;
                // Определим, скольки линейным единицам модели равен этот шаг
                // И округлим его
                ScaledStep = (float)Math.Round(stepx / surface.ScaleFactor, 1);
                // Теперь найдём кратное ScaledStep число, ближайшее к surface.Origin
                gridStartX = (float)Math.Floor(x / ScaledStep) * ScaledStep;
                gridStartY = (float)Math.Floor(y / ScaledStep) * ScaledStep;
                if (gridStartX < x)
                {
                    gridStartX += ScaledStep;
                }
                if (gridStartY < y)
                {
                    gridStartY += ScaledStep;
                }
                gridStartXbig = (float)Math.Floor(x / (ScaledStep * 10)) * ScaledStep * 10;
                gridStartYbig = (float)Math.Floor(y / (ScaledStep * 10)) * ScaledStep * 10;
                if (gridStartX < x)
                {
                    gridStartX += ScaledStep;
                }
                if (gridStartY < y)
                {
                    gridStartY += ScaledStep;
                }
                if (gridStartXbig < x)
                {
                    gridStartXbig += ScaledStep * 10;
                }
                if (gridStartYbig < y)
                {
                    gridStartYbig += ScaledStep * 10;
                }
                // Теперь рисуем. Для крупных и мелких делений - своя структура SKPaint
                SKPaint PaintSmall = new SKPaint
                {
                    Style       = SKPaintStyle.Stroke,
                    Color       = Color.FromRgb(20, 20, 20).ToSKColor(),
                    IsAntialias = true,
                    StrokeWidth = 1
                };

                SKPaint PaintBig = new SKPaint
                {
                    Style       = SKPaintStyle.Stroke,
                    Color       = PaintSmall.Color,
                    IsAntialias = true,
                    StrokeWidth = 3
                };

                SKPoint smallStart = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = gridStartX, Y = gridStartY
                },
                                                                      surface.ScaleFactor, surface.Origin, surface.ViewHeight);
                SKPoint bigStart = IssoConvert.IssoPoint2DToSkPoint(new IssoPoint2D()
                {
                    X = gridStartXbig, Y = gridStartYbig
                },
                                                                    surface.ScaleFactor, surface.Origin, surface.ViewHeight);

                for (x = smallStart.X; x < surface.ViewWidth; x += ScaledStep * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(x, 0, x, surface.ViewHeight, PaintSmall);
                }

                for (x = bigStart.X; x < surface.ViewWidth; x += ScaledStep * 10 * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(x, 0, x, surface.ViewHeight, PaintBig);
                }

                for (y = smallStart.Y; y > 0; y -= ScaledStep * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(0, y, surface.ViewWidth, y, PaintSmall);
                }

                for (y = bigStart.Y; y > 0; y -= ScaledStep * 10 * surface.ScaleFactor)
                {
                    gridBuffer.DrawLine(0, y, surface.ViewWidth, y, PaintBig);
                }

                DrawCoordinationSystem(surface, gridBuffer);
                DrawAxisText(surface, gridBuffer);

                UpdateNeeded = false;
            }
            canvas.DrawBitmap(gridBMP, 0, 0);
        }