El método de dibujo del punto medio

Dibujo lineal de punto medio

Algoritmo básico: el
punto de píxel actual es (xp, yp), el siguiente punto de píxel es P1 o P2, establezca M = (xp + 1, yp + 0.5), que es el
punto medio entre p1 y p2 , Q es la línea recta ideal yx = La intersección de xp + 1 líneas verticales. Compare las coordenadas y de Q y M.
Cuando M está por debajo de Q, P2 debería ser el siguiente punto de píxel;
M está por encima de Q y P1 debería tomarse como el siguiente punto

Inserte la descripción de la imagen aquí
Construya el discriminante: d = F (M) = F (xp + 1, yp + 0.5) = a (xp + 1) + b (yp + 0.5) + c donde a = y0-y1,
b = x1-x0, c = x0y1-x1y0
Cuando d <0, M está por debajo de L (punto Q), toma la P2 superior derecha como el siguiente píxel;
cuando d> 0, M está por encima de L (punto Q), toma la P1 derecha como la siguiente Píxeles;
cuando d = 0, se puede seleccionar P1 o P2, y se acuerda que P1 sea el próximo píxel;

Si el píxel actual está en d³0, se toma el píxel derecho positivo P1 (xp + 1, yp). Para determinar la siguiente posición de píxel, d1 = F (xp + 2, yp + 0.5) = a (xp + 2 ) + b (yp + 0.5) = d + a; el incremento es a

Si d <0, tome el píxel superior derecho P2 (xp + 1, yp + 1). Para juzgar el siguiente píxel, necesitamos calcular
d2 = F (xp + 2, yp + 1.5) = a (xp + 2) + b (yp + 1.5) + c = d + a + b; el incremento es a + b

** El dibujo lineal comienza desde (x0, y0), el valor inicial de d d0 = F (x0 + 1, y0 + 0.5) = F (x0, y0) + a + 0.5b = a + 0.5b.
D se puede utilizar para deshacerse del lugar decimal de 2d, la eficiencia **
Ejemplo: (. 5, 2) segmentos lineales con línea de puntos en el método de dibujo Pl (0, 0) -P2
A = Y2-Y1 = X1-X2 = -2 B = 5
d0 = 2a + b = 1 d1 = 2a = -4 d2 = 2 (a + b) = 6
Inserte la descripción de la imagen aquí

algoritmo :

void Midpoint Line (int x0,int y0,int x1, int y1,int color)
 {
  int a, b, d1, d2, d, x, y;
 a=y0-y1, b=x1-x0, d=2*a+b;
 d1=2*a, d2=2* (a+b);
    x=x0, y=y0;
    drawpixel(x, y, color);
    while (x<x1)
    { 
  if (d<0)       
  {
   x++, y++, d+=d2; 
  }
      else       
   {
    x++, d+=d1;
  }
      drawpixel (x, y, color);
    }  /* while */
 } /* mid PointLine */
16 artículos originales publicados · Me gusta1 · Visitas 180

Supongo que te gusta

Origin blog.csdn.net/weixin_44931542/article/details/105110763
Recomendado
Clasificación