如何从基本的 Putpixel 函数中裁剪
How to Crop From a Basic Putpixel Function
我目前正在尝试处理我的硬件。但我不知道如何解决这个问题。例如,这是我写的一个画圆的 putpixel 函数:
void cember(){
int r=50;
const int width=r;
const int length=r*1.5;
for(int y=width;y>= -width;y-=2){
for(int x=-length;x<=length;x++){
if ((int) hesapla(x,y)==r)
putpixel(x+50,y+50,WHITE);
}
}
getch();
}
假设我想仅使用 graphics.h 库从中裁剪出一个方形块。我能做什么?我什至不能写一些代码。我写了一个方形的函数,但不能再进一步了。
不允许我使用 putpixel 而不是 circle 函数的原因。你能帮帮我吗?
- 圆形函数。
void GUI_Circle(int32_t xCentre, int32_t yCentre, int32_t radius, uint32_t colour)
{
int32_t x = 0, y = radius;
int32_t d = 3 - (2 * radius);
if (colour == UINT32_MAX) return;
while(x <= y)
{
//right bottom
if((xCentre + x) >=0 && (yCentre + y) >= 0 && (xCentre + x) < ScreenXsize && (yCentre + y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + x, yCentre + y);
if((xCentre + y) >=0 && (yCentre + x) >= 0 && (xCentre + y) < ScreenXsize && (yCentre + x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + y, yCentre + x);
//left bottom
if((xCentre - x) >=0 && (yCentre + y) >= 0 && (xCentre - x) < ScreenXsize && (yCentre + y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - x, yCentre + y);
if((xCentre - y) >=0 && (yCentre + x) >= 0 && (xCentre - y) < ScreenXsize && (yCentre + x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - y, yCentre + x);
//Top right
if((xCentre + y) >=0 && (yCentre - x) >= 0 && (xCentre + y) < ScreenXsize && (yCentre - x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + y, yCentre - x);
if((xCentre + x) >=0 && (yCentre - y) >= 0 && (xCentre + x) < ScreenXsize && (yCentre - y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + x, yCentre - y);
// Top left
if((xCentre - y) >=0 && (yCentre - x) >= 0 && (xCentre - y) < ScreenXsize && (yCentre - x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - y, yCentre - x);
if((xCentre - x) >=0 && (yCentre - y) >= 0 && (xCentre - x) < ScreenXsize && (yCentre - y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - x, yCentre - y);
if (d < 0) d += (4 * x) + 6;
else
{
d += (4 * (x - y)) + 10;
y -= 1;
}
x++;
}
}
然后让我们修改它来检查我们是否在裁剪区域中:
typedef struct
{
int32_t xStart, xEnd;
int32_t yStart, yEnd;
}clip_type;
void GUI_Circle(int32_t xCentre, int32_t yCentre, int32_t radius, clip_type *c, uint32_t colour)
{
int32_t x = 0, y = radius;
int32_t d = 3 - (2 * radius);
clip_type sc = *c;
if (colour == UINT32_MAX) return;
if(sc.xEnd - sc.xStart <= 0 || sc.yEnd - sc.yStart <= 0) return;
if(sc.xEnd < 0 || sc.yEnd < 0) return;
if(sc.xStart >= ScreenXsize || sc.yStart >= ScreenYsize) return;
if(sc.xStart < 0) sc.xStart = 0;
if(sc.yStart < 0) sc.yStart = 0;
if(sc.xEnd >= ScreenXsize) sc.xEnd = ScreenXsize;
if(sc.yEnd >= ScreenYsize) sc.yEnd = ScreenYsize;
while(x <= y)
{
//right bottom
if((xCentre + x) >= sc.xStart && (yCentre + y) >= sc.yStart && (xCentre + x) < sc.xEnd && (yCentre + y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + x, yCentre + y);
if((xCentre + y) >= sc.xStart && (yCentre + x) >= sc.yStart && (xCentre + y) < sc.xEnd && (yCentre + x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + y, yCentre + x);
//left bottom
if((xCentre - x) >= sc.xStart && (yCentre + y) >= sc.yStart && (xCentre - x) < sc.xEnd && (yCentre + y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - x, yCentre + y);
if((xCentre - y) >= sc.xStart && (yCentre + x) >= sc.yStart && (xCentre - y) < sc.xEnd && (yCentre + x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - y, yCentre + x);
//Top right
if((xCentre + y) >=sc.xStart && (yCentre - x) >= sc.yStart && (xCentre + y) < sc.xEnd && (yCentre - x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + y, yCentre - x);
if((xCentre + x) >=sc.xStart && (yCentre - y) >= sc.yStart && (xCentre + x) < sc.xEnd && (yCentre - y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + x, yCentre - y);
// Top left
if((xCentre - y) >= sc.xStart && (yCentre - x) >= sc.yStart && (xCentre - y) < sc.xEnd && (yCentre - x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - y, yCentre - x);
if((xCentre - x) >= sc.xStart && (yCentre - y) >= sc.yStart && (xCentre - x) < sc.xEnd && (yCentre - y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - x, yCentre - y);
if (d < 0) d += (4 * x) + 6;
else
{
d += (4 * (x - y)) + 10;
y -= 1;
}
x++;
}
}
我目前正在尝试处理我的硬件。但我不知道如何解决这个问题。例如,这是我写的一个画圆的 putpixel 函数:
void cember(){
int r=50;
const int width=r;
const int length=r*1.5;
for(int y=width;y>= -width;y-=2){
for(int x=-length;x<=length;x++){
if ((int) hesapla(x,y)==r)
putpixel(x+50,y+50,WHITE);
}
}
getch();
}
假设我想仅使用 graphics.h 库从中裁剪出一个方形块。我能做什么?我什至不能写一些代码。我写了一个方形的函数,但不能再进一步了。
不允许我使用 putpixel 而不是 circle 函数的原因。你能帮帮我吗?
- 圆形函数。
void GUI_Circle(int32_t xCentre, int32_t yCentre, int32_t radius, uint32_t colour)
{
int32_t x = 0, y = radius;
int32_t d = 3 - (2 * radius);
if (colour == UINT32_MAX) return;
while(x <= y)
{
//right bottom
if((xCentre + x) >=0 && (yCentre + y) >= 0 && (xCentre + x) < ScreenXsize && (yCentre + y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + x, yCentre + y);
if((xCentre + y) >=0 && (yCentre + x) >= 0 && (xCentre + y) < ScreenXsize && (yCentre + x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + y, yCentre + x);
//left bottom
if((xCentre - x) >=0 && (yCentre + y) >= 0 && (xCentre - x) < ScreenXsize && (yCentre + y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - x, yCentre + y);
if((xCentre - y) >=0 && (yCentre + x) >= 0 && (xCentre - y) < ScreenXsize && (yCentre + x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - y, yCentre + x);
//Top right
if((xCentre + y) >=0 && (yCentre - x) >= 0 && (xCentre + y) < ScreenXsize && (yCentre - x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + y, yCentre - x);
if((xCentre + x) >=0 && (yCentre - y) >= 0 && (xCentre + x) < ScreenXsize && (yCentre - y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre + x, yCentre - y);
// Top left
if((xCentre - y) >=0 && (yCentre - x) >= 0 && (xCentre - y) < ScreenXsize && (yCentre - x) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - y, yCentre - x);
if((xCentre - x) >=0 && (yCentre - y) >= 0 && (xCentre - x) < ScreenXsize && (yCentre - y) < ScreenYsize)
TFT_DrawPixel(colour, xCentre - x, yCentre - y);
if (d < 0) d += (4 * x) + 6;
else
{
d += (4 * (x - y)) + 10;
y -= 1;
}
x++;
}
}
然后让我们修改它来检查我们是否在裁剪区域中:
typedef struct
{
int32_t xStart, xEnd;
int32_t yStart, yEnd;
}clip_type;
void GUI_Circle(int32_t xCentre, int32_t yCentre, int32_t radius, clip_type *c, uint32_t colour)
{
int32_t x = 0, y = radius;
int32_t d = 3 - (2 * radius);
clip_type sc = *c;
if (colour == UINT32_MAX) return;
if(sc.xEnd - sc.xStart <= 0 || sc.yEnd - sc.yStart <= 0) return;
if(sc.xEnd < 0 || sc.yEnd < 0) return;
if(sc.xStart >= ScreenXsize || sc.yStart >= ScreenYsize) return;
if(sc.xStart < 0) sc.xStart = 0;
if(sc.yStart < 0) sc.yStart = 0;
if(sc.xEnd >= ScreenXsize) sc.xEnd = ScreenXsize;
if(sc.yEnd >= ScreenYsize) sc.yEnd = ScreenYsize;
while(x <= y)
{
//right bottom
if((xCentre + x) >= sc.xStart && (yCentre + y) >= sc.yStart && (xCentre + x) < sc.xEnd && (yCentre + y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + x, yCentre + y);
if((xCentre + y) >= sc.xStart && (yCentre + x) >= sc.yStart && (xCentre + y) < sc.xEnd && (yCentre + x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + y, yCentre + x);
//left bottom
if((xCentre - x) >= sc.xStart && (yCentre + y) >= sc.yStart && (xCentre - x) < sc.xEnd && (yCentre + y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - x, yCentre + y);
if((xCentre - y) >= sc.xStart && (yCentre + x) >= sc.yStart && (xCentre - y) < sc.xEnd && (yCentre + x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - y, yCentre + x);
//Top right
if((xCentre + y) >=sc.xStart && (yCentre - x) >= sc.yStart && (xCentre + y) < sc.xEnd && (yCentre - x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + y, yCentre - x);
if((xCentre + x) >=sc.xStart && (yCentre - y) >= sc.yStart && (xCentre + x) < sc.xEnd && (yCentre - y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre + x, yCentre - y);
// Top left
if((xCentre - y) >= sc.xStart && (yCentre - x) >= sc.yStart && (xCentre - y) < sc.xEnd && (yCentre - x) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - y, yCentre - x);
if((xCentre - x) >= sc.xStart && (yCentre - y) >= sc.yStart && (xCentre - x) < sc.xEnd && (yCentre - y) < sc.yEnd)
TFT_DrawPixel(colour, xCentre - x, yCentre - y);
if (d < 0) d += (4 * x) + 6;
else
{
d += (4 * (x - y)) + 10;
y -= 1;
}
x++;
}
}