Grafik LCD dikey çizgi çizdirme fonksiyonu

Başlatan Brdk Khn, 26 Nisan 2025, 14:36:32

Brdk Khn

 128x64 KS108 Grafik lcd'de dikey çizgi çizme fonksiyonu yazmak istiyorum;(kütüphane kullanmak istemiyorum)
 
mesela bunun gibi birşey--> void dikey_cizgi(uint8_t x1, uint8_t y1, uint8_t y2);

x1=dikey cizginin yatay başlangıç noktası(0-127)
y1=dikey cizginin başlangıç noktası(0-63)
y2=dikey cizginin bitiş noktası (0-63) 
(tabii ki y1<y2 olmalı)
                           
xy(0,0)  --------------------page0..xy(127,0)
             --|-----------------page1
             --|-----------------page2
             --|-----------------page3
             --|-----------------page4
             --------------------page5
             --------------------page6
xy(0,63)--------------------page7..xy(127,63)

 Yatay cizgi fonksiyonu yazmak oldukça kolay. Fakat dikey çizgi fonksiyonu yazmak isterseniz araya "page" bilgiside
girdiği için iş baya karmaşık hale geliyor.

Benim yaptığın algoritmada bütün olasılıkları içeren tam 36 adet "if" bloğu kullanmak gerekiyor. if(y1>8 && y1<=16),.....,if(y2>56 && y2<64) gibi. Çünkü her "page" değişiminde  o "page" ait değerler girmek gerekiyor.  Daha pratik bir yöntem önerebilecek bir arkadaş var mı? Buradaki asıl amaç programlama bilgilerini geliştirmek.



 

Mucit23

İlk önce ekranın herhangi bir pixeline nokta koyabilmeniz lazım.

Bunun için GLCD_SetPixel fonksiyonum vardı benim. Eğer bu fonksiyonunuz doğru çalışıyorsa aşağıdaki fonksiyon ile dikey yatay çapraz vs her türlü çizgi çizersiniz.

/*******************************************************************************
*   GLCD_DrawLine                                                              *
*   Parametreler:                                                              *
*   Return:                                                                    *
*******************************************************************************/
void GLCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color)
{
  int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
  yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,
  curpixel = 0;
 
  deltax = abs(x2 - x1);        /* The difference between the x's */
  deltay = abs(y2 - y1);        /* The difference between the y's */
  x = x1;                       /* Start x off at the first pixel */
  y = y1;                       /* Start y off at the first pixel */
 
  if (x2 >= x1)                 /* The x-values are increasing */
  {
    xinc1 = 1;
    xinc2 = 1;
  }
  else                          /* The x-values are decreasing */
  {
    xinc1 = -1;
    xinc2 = -1;
  }
 
  if (y2 >= y1)                 /* The y-values are increasing */
  {
    yinc1 = 1;
    yinc2 = 1;
  }
  else                          /* The y-values are decreasing */
  {
    yinc1 = -1;
    yinc2 = -1;
  }
 
  if (deltax >= deltay)         /* There is at least one x-value for every y-value */
  {
    xinc1 = 0;                  /* Don't change the x when numerator >= denominator */
    yinc2 = 0;                  /* Don't change the y for every iteration */
    den = deltax;
    num = deltax / 2;
    numadd = deltay;
    numpixels = deltax;         /* There are more x-values than y-values */
  }
  else                          /* There is at least one y-value for every x-value */
  {
    xinc2 = 0;                  /* Don't change the x for every iteration */
    yinc1 = 0;                  /* Don't change the y when numerator >= denominator */
    den = deltay;
    num = deltay / 2;
    numadd = deltax;
    numpixels = deltay;         /* There are more y-values than x-values */
  }
 
  for (curpixel = 0; curpixel <= numpixels; curpixel++)
  {
    GLCD_SetPixel(x, y, color);             /* Draw the current pixel */
    num += numadd;              /* Increase the numerator by the top of the fraction */
    if (num >= den)             /* Check if numerator >= denominator */
    {
      num -= den;               /* Calculate the new numerator value */
      x += xinc1;               /* Change the x as appropriate */
      y += yinc1;               /* Change the y as appropriate */
    }
    x += xinc2;                 /* Change the x as appropriate */
    y += yinc2;                 /* Change the y as appropriate */
  }
}

Brdk Khn

Teşekkürler. Biraz karışık geldi ama bir deneyeyim.

Brdk Khn

Yukarıdaki örnekten başka bir seçenek var mı merak ediyorum? Orada sanıyorum her yöne çapraz çizgide çizebiliyor. O yüzden biraz karışık bir algoritması var. İstenilen konuma sadece dikey çizgi çizen daha farklı bir algoritma olabilir mi?