Как рисовать линии в C # - PullRequest
       37

Как рисовать линии в C #

1 голос
/ 10 февраля 2011

У меня есть школьный проект, где у меня должна быть функция, которая может нарисовать линию от любого места на экране до любого другого места на экране. я знаю, что есть некоторые функции, которые делают это для меня.

это то, что я имею до сих пор: (вещь vga.setpixel устанавливает пиксель (uint) x, для пикселя (uint) y, цвет (uint))

class drawaline
{
   public static void swap(ref int a, ref int b)
{
    int temp = a; // Copy the first position's element
    a = b; // Assign to the second element
    b = temp; // Assign to the first element
}
public static int abs(int value)
{
    if (value < 0)
        value = value * -1;
    return value;
}
public static int fpart(int x)
{
    return x;
}
public static int rfpart(int x)
{
    x = 1 - fpart(x);
    return x;
}
public static int ipart(int x)
{
    return x;
}
public static void line(int x1, int y1, int x2, int y2, uint color)
{
    int dx = x2 - x1;
    int dy = y2 - y1;
    if (abs(dx) < (dy))
    {
        swap(ref x1, ref y1);
        swap(ref x2, ref y2);
        swap(ref dx, ref dy);
    }
    if (x2 < x1)
    {
        swap(ref x1, ref x2);
        swap(ref y1, ref y2);
    }
    int gradient = dy / dx;
    // handle first endpoint
    int xend = x1;
    int yend = y1 + gradient * (xend - x1);
    int x1p = x1 + (int).5;
    int xgap = rfpart(x1p);
    int xpxl1 = xend; // this will be used in the main loop
    int ypxl1 = ipart(yend);
    VGAScreen.SetPixel320x200x8((uint)xpxl1, (uint)ypxl1, (uint)color);
    int intery = yend + gradient; // first y-intersection for the main loop
    // handle second endpoint
    xend = x2;
    yend = y2 + gradient * (xend - x2);
    xgap = fpart(x2 + (int)0.5);
    int xpxl2 = xend; // this will be used in the main loop
    int ypxl2 = ipart(yend);
    VGAScreen.SetPixel320x200x8((uint)xpxl2, (uint)ypxl2, (uint)color);
    VGAScreen.SetPixel320x200x8((uint)xpxl2, (uint)ypxl2 + 1, (uint)color);

    // main loop
    for (x = 0; x < xpxl1 + 1; x++)
    {
        VGAScreen.SetPixel320x200x8((uint)x, (uint)intery, (uint)color);
        VGAScreen.SetPixel320x200x8((uint)x, (uint)intery, (uint)color);
        intery = intery + gradient;
    }
}
}

Ответы [ 3 ]

1 голос
/ 10 февраля 2011

Много ошибок:

  1. swap должен принимать свои параметры как ref
  2. Существует Math.Abs, который вы можете использовать вместо того, чтобы писать свойошибка, но плохой стиль)
  3. Ваша fpart функция, скорее всего, не делает то, что вы хотите.Я предполагаю, что он должен вернуть дробную часть double, а не int, переданный внутрь. Заставить его и вернуть double.
  4. (int)0.5 не имеет смысла.Становится 0.
  5. Большинство ваших int переменных должны быть вместо этого двойными.Поскольку ваш код предполагает, что они могут содержать нецелые числа.
  6. int gradient = dy / dx использует целочисленное деление.Вам нужно разыграть одну из них, чтобы удвоить ее перед делением, иначе вы потеряете дробную часть.
0 голосов
/ 01 июня 2013
void draw_line()
        {
            Pen mypen;
            mypen = new Pen(Color.Black , 1);
            Graphics g = this.CreateGraphics();
            g.DrawLine(mypen, 0, 20, 1000, 20); 
            // 0,20 are starting points and 1000,20 are destination.
            mypen.Dispose();
            g.Dispose();
        }
0 голосов
/ 10 февраля 2011

Проверьте это, это поможет вам

есть файл icon.cs, который содержит код, который вы хотите

...