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);
但如是長方形或正方形就一定要在邊界之內,就是多一個像素都行