2011-02-10 4 views
1

J'ai un projet d'école où je dois avoir une fonction qui peut dessiner une ligne de n'importe où sur l'écran à n'importe quel endroit sur l'écran. Je sais qu'il y a certaines fonctions incluses qui le font pour moi.Comment dessiner des lignes dans C#

ce que j'ai jusqu'à présent: (la chose vga.setpixel définit le (uint) pixel x, au (uint) y pixal, la couleur (uint) couleur)

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; 
    } 
} 
} 
+0

votre fonction de permutation ne fonctionnera pas. vous devez déclarer a et b comme dehors. – BlackBear

+0

comment je fais ça? (im a noob) – dude

+0

juste mettre "out" avant eux;) public static void swap (int int, out int b) – BlackBear

Répondre

0

Check this it will help you

il y a un fichier icon.cs qui contient le code que vous voulez

+0

qui utilise une fonction "DrawLine" déjà faite, je dois faire mon propre – dude

1

de nombreuses erreurs:

  1. swap doit prendre ses paramètres comme ref
  2. Il est Math.Abs que vous pouvez utiliser au lieu d'écrire votre propre (techniquement pas une erreur, mais mauvais style)
  3. Votre fonction fpart ne plus probablement pas ce que vous voulez faire . Je suppose qu'il devrait retourner la partie fractionnaire d'un double et pas le int transmis. Faites-le prendre et retourner un double.
  4. (int)0.5 n'a pas de sens. Il devient 0.
  5. La plupart de vos variables int devraient être doubles à la place. Puisque votre code suppose qu'ils peuvent contenir des nombres non entiers.
  6. int gradient = dy/dx utilise la division entière. Vous devez lancer l'un d'entre eux pour doubler avant de diviser ou vous perdez la partie fractionnaire.
+0

vous avez raison; mais ne me dérange pas, ses préoccupations sont différentes au lieu de code revie. –

+0

@Waqas Je suppose que c'est à propos de l'apprentissage de coder un algorithme de dessin au trait, pas seulement de tracer une ligne. – CodesInChaos

+1

+1 Quelle que soit la question finale à laquelle il faut répondre, il y a clairement beaucoup de choses que le PO doit apprendre avant d'arriver à quelque chose. –

0
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

vous appelez simplement cette fonction lorsque vous voulez dessiner une ligne et donner un point de départ et de fin ... –

Questions connexes