hello, this is modified part of camtest.cpp this is for drawing rectangle on picture fetched from cmos sensor. but only its horizontal lines, has plotted truly; vertical algorithm leads to plotting slope line!!! where is the problem? //LineLen = 640 (pixels) x 2 (bytes) //Height = 512 (pixels) //count=Size=LineLen x Height (bytes) bool FetchPicture() const { int count = ::read(fd, Addr, Size); if (count not_eq Size) { throw TError("error in fetching picture from video"); } //new added code: draw rectangular int i=0; for(int c=0;c<count;c+=2){ //horizontal lines : "truly draws horizontal line" if((c>=LineLen*Height/4+LineLen/3)&& (c<=LineLen*Height/4+LineLen*2/3)) {*(Addr+c)=255;*(Addr+c+1)=255;} else if((c>=LineLen*Height*3/4+LineLen/3)&& (c<=LineLen*Height*3/4+LineLen*2/3)) {*(Addr+c)=255;*(Addr+c+1)=255;} //vertical lines : "but only draws slope line !!!!!!!!!!!!!!" i+=2; if(i>LineLen){i=0;} if((i==LineLen*2/4)){*(Addr+c)=255;*(Addr+c+1)=255;} } return true; }
draw rectangle on LCD
Hi Try bellow logic..... static void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color) { int i; for(i=y1;i<=y2;i++) Glib_Line(x1,i,x2,i,color); } static void Glib_Line(int x1,int y1,int x2,int y2,int color) { int dx,dy,e; dx=x2-x1; dy=y2-y1; if(dx>=0) { if(dy >= 0) // dy>=0 { if(dx>=dy) // 1/8 octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1+=1; e+=dy; } } else // 2/8 octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1+=1; e+=dx; } } } else // dy<0 { dy=-dy; // dy=abs(dy) if(dx>=dy) // 8/8 octant { e=dy-dx/2; while(x1<=x2) { PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1+=1; e+=dy; } } else // 7/8 octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1-=1; e+=dx; } } } } else //dx<0 { dx=-dx; //dx=abs(dx) if(dy >= 0) // dy>=0 { if(dx>=dy) // 4/8 octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1-=1; e+=dy; } } else // 3/8 octant { e=dx-dy/2; while(y1<=y2) { PutPixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1+=1; e+=dx; } } } else // dy<0 { dy=-dy; // dy=abs(dy) if(dx>=dy) // 5/8 octant { e=dy-dx/2; while(x1>=x2) { PutPixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1-=1; e+=dy; } } else // 6/8 octant { e=dx-dy/2; while(y1>=y2) { PutPixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1-=1; e+=dx; } } } } } static void PutPixel(U32 x,U32 y,U32 c) { if ( (x < SCR_XSIZE_TFT_320240) && (y < SCR_YSIZE_TFT_320240) ) LCD_BUFER[(y)][(x)] = c; }