c语言图形填充
A. c语言中自画图形如何填色
setfillstyle(int pattern, int color)//先用这个函数设置一下填充的模式
floodfill(int x, int y, int border)//再用这个函数填充就可以了。
B. c语言中怎么在规定坐标内画一个填充的矩形,边框和填充色都是黑色
在OnPaint()中调用CPaintDC dc(this);
dc.FrameRectangle可以花边框,FillSolidRect可以填充颜色。
C. C语言画图画出图形后如何填充颜色
#include<graphics.h>
#include<stdlib.h>
main( )
{
int gd=DETECT,gm;
int z,*w,i;
initgraph(&gd,&gm,"");
setbkcolor(GREEN);
setcolor(RED);
circle(200,200,50);
setcolor(RED);
circle(200,200,30);
setfillstyle(1,YELLOW);
floodfill(200,160,RED);
getch( );
closegraph( );
}
setfillstyle是填充,里面1的填充模式,YELLOW是颜色
floodfill(x,y,z) x,y分别是x坐标,y坐标,只需要在填充的闭合图形里面的任意一点即可,z是最边间曲线的颜色。
D. C语言图形填充函数原型是什么
如果你用的是TC,那你可以查看一下GRAPHICS.H头文件的内容,里面关于填充的函数比如有floodfill(int
x,
int
y,
int
border);这是种子填充,还有其它的一些.
如果你做的是WINODWS程序,那么就查看下GDI的内容了.
E. C语言实现多边形填充
/*直角三角形,输入行数,输出*/
#include <stdio.h>
void main()/*如果TC编译不通过,则去掉void*/
{
int n;
scanf("%d",&n);
for (int i = 1;i <= n;i++)
{
for (int j = 0;j < i;j++)
printf("*");
printf("\n");
}
}
/*等腰三角形,输入行数,输出*/
#include <stdio.h>
void main()/*如果TC编译不通过,则去掉void*/
{
int n;
scanf("%d",&n);
for (int i = 1;i <= n;i++)
{
for (int k = 1;k <= n-i;k++)
printf(" ");
for (int j = 0;j < 2*i-1;j++)
printf("*");
printf("\n");
}
}
以上在VS2005上编译通过
F. 急求用C语言编写的扫描线填充多边形的算法
如果是用线填充,程序如下。如果是用点填充需要用到堆栈和系统底层库函数或者用画点函数putpixel()。
下面实例是用扫描线填充长方形,开始要输入长方形的左上顶点坐标和右下顶点坐标以及填充扫描线的间距(>=1),如果间距等于1,就是完全填充(实填充)。
一个完整的c程序如下,程序在win-tc和tc2.0下都调试通过。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
void draw(int x1,int y1,int x2,int y2,int delta)
{int nx1,ny1,nx2,ny2;
nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2;
while((ny1>=y1)&&(nx2<=x2))
{line(nx1,ny1,nx2,ny2);
ny1-=delta;
nx2+=delta;
}
if(nx2>x2)
{ny2-=nx2-x2;
nx2=x2;
while(ny1>y1)
{line(nx1,ny1,nx2,ny2);
ny1-=delta;
ny2-=delta;
}
nx1+=y1-ny1;
ny1=y1;
while(nx1<x2)
{line(nx1,ny1,nx2,ny2);
nx1+=delta;
ny2-=delta;
}
}
else
{nx1+=y1-ny1;
ny1=y1;
while(nx2<x2)
{line(nx1,ny1,nx2,ny2);
nx2+=delta;
nx1+=delta;
}
ny2-=nx2-x2;
nx2=x2;
while(ny2>y1)
{line(nx1,ny1,nx2,ny2);
ny2-=delta;
nx1+=delta;
}
}
}
int main(void)
{int x1,y1,y2,x2,delta;
int driver=DETECT,mode;
printf("Please input lefttop(x1,y1) and rightbottom(x2,y2) of rectangle and delta:\n");
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta);
initgraph (&driver,&mode,"C:\\TC"); /*这里*/
rectangle(x1,y1,x2,y2);
draw(x1,y1,x2,y2,delta);
gotoxy(1,1);
printf("Press any key to exit!");
getch();
closegraph();
return 0;
}
说明:将main()函数中的initgraph(&gdriver,&gmode,"");中的""更改为你的TC安装目录,一般tc必须安装在c盘根目录下,所以就是initgraph(&gdriver,&gmode,"C:\\TC");如你的TC安装目录为D盘的Tools目录下的TC目录,那么上述语句改为:
initgraph(&gdriver,&gmode,"D:\\Tools\\TC");
同时保证在D:\\Tools\\TC目录里有文件EGAVGA.BGI,万一不行,将本程序复制到你的TC安装目录下再运行。
G. C语言图形编程怎么把图形填充成喜欢的颜色
不清楚...........
HDC dc = GetDC(g_hWnd);
HBRUSH brush=CreateSolidBrush(RGB(0, 255, 0));
HBRUSH oldbrush=(HBRUSH)SelectObject(dc, brush);
RECT rect;
rect.left = 10;
rect.right = 50;
rect.top = 10;
rect.bottom = 50;
FillRect(dc,&rect , brush);
Ellipse(dc, 60, 60, 100, 100);
SelectObject(dc, oldbrush);
Ellipse(dc, 120, 120, 150, 150);
H. c语言 给出任意多边形顶点,这些定点连起来是一个凸多边形,如何对它进行填充希望有源程序。
// 点
struct point
{
float x,y; //x y 坐标
};
// 多边形结构体
struct polygon
{
int num; // 点的数目
float offset_x,offset_y; // 偏移
float left,right,top,bottom; // 多边形 上/下/左/右区域
struct point *points; //组成多边形的点
};
// 生成多变形
// 点必须是有序的,按多边形的顶点顺时针给出
// p 组成多边形的点
// size 点的数量
int gen_polygon_clockwise(const struct point* p,int size,struct polygon *poly)
{
int i ;
struct point *p_adr = (point *)malloc(sizeof(struct point) * size);
poly->num = size;
for (i = 0;i < size;i++) {
p_adr[i].x = p[i].x;
p_adr[i].y = p[i].y;
if (i == 0) {
poly->left = p[i].x;
poly->right = p[i].x;
poly->bottom = p[i].y;
poly->top = p[i].y;
} else {
// 确定区域的上/下/左/右 坐标
if (p[i].x < poly->left) {
poly->left = p[i].x;
}
if (p[i].x > poly->right) {
poly->right = p[i].x;
}
if (p[i].y < poly->top) {
poly->top = p[i].y;
}
if (p[i].y > poly->bottom) {
poly->bottom = p[i].y;
}
}
}
poly->points = p_adr;
return 0 ;
}
void free_polygon(struct polygon *poly)
{
free(poly->points);
}
// 点是顺时针给出的
// 判断点是否在直线的左/右区域
// 判断一个点是否在一个区域里,主要是根据该点和组成多边形的直线的关系来判断
int is_point_local_line_region_clockwise(float x1,float x2,float y1,float y2,float x,float y)
{
float w,h,tmp;
// 下面的代码,就不解释了,你【顺时针】画一个多边行,然后在任意画一个点,然后
// 判断组成多边形的每条直线和点的关系就清楚了,主要还是根据该点是在直线的左侧还是
// 右侧(上侧/下侧)来判断一个点是否在多边行的里面
//
// 直线倾率为无穷大
if (x1 == x2) {
if (y1 > y2) {
if (x < x1) {
return 0;
}
} else {
if (x > x1) {
return 0 ;
}
}
}
// 直线倾率为0
if (y1 == y2) {
if (x1 > x2) {
if (y > y1) {
return 0;
}
} else {
if (y < y1) {
return 0;
}
}
}
w = x2 - x1;
h = y2 - y1;
// 直线上的点
// 直线的倾率 直线的点倾式(y = k(x - x1) + y1)
tmp = h/w * (x -x1) + y1;
if (x1 > x2) {
if (y > tmp) {
return 0;
}
} else {
if (y < tmp) {
return 0;
}
}
return 1;
}
// 判断一个点是否在多边行里面
// 在多边形区域里则返回非0值,否则,返回0值
int is_point_in_polygon(float x,float y,const struct polygon *poly)
{
int i ;
if (x < poly->left || x > poly->right ||
y < poly->top || y > poly->right) {
return 0;
}
for (i = 0; i < poly->num - 1;i++) {
if (!is_point_local_line_region_clockwise(poly->points[i].x,
poly->points[i + 1].x,
poly->points[i].y,
poly->points[i + 1].y,x,y)) {
return 0 ;
}
}
if (!is_point_local_line_region_clockwise(poly->points[i].x,
poly->points[0].x,
poly->points[i].y,
poly->points[0].y,
x,y)) {
return 0 ;
}
return 1;
}
#define RESOLUTION_X 100
// 填充多边形
// buffer 填充的二维数组
void fill_poly(const struct polygon *poly,char buffer[][RESOLUTION_X])
{
int x,y,w,h,i,j;
x = (int)poly->left + poly->offset_x;
y = (int)poly->top + poly->offset_y;
w = (int)(poly->right - poly->left);
h = (int)(poly->bottom - poly->top);
for (i = y;i < y + h;i++) {
for (j = x;j < x + w;j++) {
if (is_point_in_polygon(j,i,poly)) {
buffer[i][j] = 255;
}
}
}
}
int main()
{
char buffer[100][100];
struct polygon poly;
struct point points[8];
poly.offset_x = 0;
poly.offset_y = 0 ;
points[0].x = 50;
points[0].y = 50 - 30;
points[1].x = 50 + 21;
points[1].y = 50 - 21;
points[2].x = 50 + 30;
points[2].y = 50;
points[3].x = 50 + 21;
points[3].y = 50 + 21;
points[4].x = 50;
points[4].y = 50 + 30;
points[5].x = 50 - 21;
points[5].y = 50 + 21;
points[6].x = 50 - 30;
points[6].y = 50 ;
points[7].x = 50 - 21;
points[7].y = 50 - 21;
memset(buffer,0,sizeof(buffer));
gen_polygon_clockwise(points,8,&poly);
fill_poly(&poly,buffer);
for (int i = 0;i < 100;i++) {
for (int j = 0;j < 100;j++) {
if (buffer[i][j]) {
std::cout << "*";
} else {
std::cout << " " ;
}
}
std::cout << std::endl;
}
return 0;
}
####
你看对你有没有帮助
浮点坐标到整数坐标只是简单的类型转换
I. C语言 矩形填充算法
#include <stdio.h>
#include <graphics.h>
typedef struct {
int xmin, xmax, ymin, ymax;
} Rectangle;
void FillRectangle(Rectangle *rect, int color) {
int x = 0, y = 0;
for (y = rect->ymin; y <= rect->ymax; y++)
for (x = rect->xmin; x <= rect->xmax; x++) //这里有个分号,应该去掉。
putpixel(x, y, color);
}/* end of FillRectangle() */
int main() {
//declare our color
int color = 0;
//declare our rectangle
Rectangle *rect = (Rectangle *) malloc(sizeof(Rectangle));
if(NULL == rect )
{
printf("allocation memory failed!\n");
return 1;
}
//input the scope
printf("Enter the x-min:\n");
scanf("%d", &rect->xmin);
printf("Enter the x-max:\n");
scanf("%d", &rect->xmax);
printf("Enter the y-min:\n");
scanf("%d", &rect->ymin);
printf("Enter the y-max:\n");
scanf("%d", &rect->ymax);
//input the color
printf("Enter your color:\n");
scanf("%d", &color);
//call our paint function
FillRectangle(rect, color);
return 0;
}
J. C语言 给一个圆形填充颜色
第一floodfill第三个颜色参数一定要和被填充图画时的颜色一样.
第二,X,Y 一定要在被填充的图形内,边界上也是不行的,那样填充的是图形外的部分,如你上题,因是圆形,可改为
setcolor(1);
circle(200,200,100);
floodfill(200,200,1);
但如是长方形或正方形就一定要在边界之内,就是多一个像素都行