c語言畫實線
㈠ c語言如何畫圖
framebuffer(幀緩沖)。
幀的最低數量為24(人肉眼可見)(低於24則感覺到畫面不流暢)。
顯卡與幀的關系:由cpu調節其數據傳輸速率來輸出其三基色的配比。
三基色:RGB(紅綠藍)。
在沒有桌面和圖形文件的系統界面,可以通過C語言的編程來實現在黑色背景上畫圖!
用下面的代碼,在需要的地方(有注釋)適當修改,就能畫出自己喜歡的圖形!
PS:同樣要編譯運行後才能出效果。
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <stdlib.h>
#define RGB888(r,g,b) ((r & 0xff) <<16 | (g & 0xff) << 8 | (b & 0xff))
#define RGB565(r,g,b) ((r & 0x1f) <<11 | (g & 0x3f) << 5 | (b & 0x1f))
int main()
{
int fd = open("/dev/fb0", O_RDWR);
if(fd < 0){
perror("open err. ");
exit(EXIT_FAILURE);
printf("xres: %d ", info.xres);
printf("yres: %d ", info.yres);
printf("bits_per_pixel: %d ", info.bits_per_pixel);
size_t len = info.xres*info.yres*info.bits_per_pixel >> 3;
unsigned long* addr = NULL;
addr = mmap(NULL, len, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
if(addr == (void*)-1){
perror("mmap err. ");
㈡ 怎樣用C語言繪制直線
【C語言的用MoveTo()和LineTo()】
#include<graphics.h>
#include<math.h>
/*
###############################################################################
功 能:本函數的作用是用逐點比較法來畫一條直線
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
參數說明:x1,y1是起始點坐標,x2,y2是終止點,color是畫線的顏色
調用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*變數定義開始(2007/10/16增加)*/
int iTx; /*x軸終點的相對坐標xa或臨時變數*/
int iTy; /*y軸終點的相對坐標ya或臨時變數*/
int iDx; /*x軸方向的步長dx*/
int iDy; /*y軸方向的步長dy*/
int iFt; /*偏差Fm*/
int iSt; /*記數循環數(dx+dy)S*/
int iXt; /*x方向循環變數xm*/
int iYt; /*y方向循環變數ym*/
/*變數定義結束*/
/*變數初始化開始*/
/*如果是第三象限或第四象限則換成第一或第二象限*/
if(y2<y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1; /*取x軸的相對坐標*/
iTy=y2-y1; /*取y軸的相對坐標*/
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx<0)iSt=-1*iTx+iTy;; /*如果在第二象限,則x軸方向步長取負值*/
iXt=0;
iYt=0;
/*變數初始化結束*/
/*數據處理開始*/
while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx>=0) /*如果在第一象限*/
{
if(iFt<0) /*如果偏差小於0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
else /*如果偏差大於或等於0*/
{
iXt+=iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt<0) /*如果偏差小於0*/
{
iXt-=iDx; /*負x方向走一步*/
iFt+=iTy;
}
else /*如果偏差大於或等於0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
}
iSt--;
}
}
/*
###############################################################################
功 能:本函數的作用是用來畫一條直線
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
參數說明:x1,y1是起始點坐標,x2,y2是終止點,color是畫線的顏色
調用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX; /*x方向的坐標變數*/
int iY; /*y方向的坐標變數*/
int iTx; /*x方向的步長變數*/
int iTy; /*y方向的步長變數*/
float fDx; /*x方向的差分變數*/
float fDy; /*y方向的差分變數*/
float fMinf; /*演算法中的f*/
float fMaxF; /*演算法中的F*/
float fS; /*終點判斷變數*/
fMinf=0.5; /*f=0.5*/
iX=x1;
iY=y1;
putpixel(x1,y1,color);
if(x1==x2&&y1==y2) /*如果終點和起始點相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx<0)iTx=-1;
if(fDy<0)iTy=-1;
fS=fDx>0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF>1) /*如果F>1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fMinf+=1/fMaxF; /*f=f+1/F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iX+=iTx; /*x方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
else /*如果F<1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
putpixel(iX,iY,color);
fMinf+=fMaxF; /*f=f+F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iY+=iTy; /*y方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
}【能夠畫出任意斜率的直線演算法程序】
int dx,dy,incrE,incrNE,d,x,y;
if ((point[1].x-point[0].x)==0){ //垂直的直線
x=point[0].x;
for(y=point[0].y;y<point[1].y;y++)
pDC->SetPixel(x,y,50);
}
else if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))<=1){ //斜率 -1到 1 之間
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=dx-2*dy; incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
if(point[0].y>point[1].y){
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;<br> x++;<br> y--;<br> }
pDC->SetPixel(x,y,50);
}
}
else if(point[0].y<=point[1].y){
dy=point[1].y-point[0].y;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;<br> x++;<br> y++;<br> }
pDC->SetPixel(x,y,50);
}
}
}
else { //斜率 <-1 和 >1的直線
if(point[1].x>=point[0].x){
dx=point[1].x-point[0].x;
dy=point[1].y-point[0].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d<0){
d+=incrE;
y++;
}
else
{d+=incrNE;<br> pDC->SetPixel(x,y,50);<br> x++;<br> y++;<br> }
pDC->SetPixel(x,y,50);
}
}
else if((point[1].y-point[0].y)/(point[1].x-point[0].x)<-1){
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(y<point[1].y)
{
if(d>0){
d+=incrE;
y++;
}
else
{d+=incrNE;<br> x--;<br> y++;<br> }
pDC->SetPixel(x,y,50);
} }
}
㈢ c語言中什麼叫做設置三點寬實線
如果是畫圖的程序,那就是指的線條的寬度是3個像素了
㈣ 怎麼用C語言畫一條紅色的直線
首先設置初始坐標和結束坐標,然後設定畫線顏色,最後用draw函數畫出來就好了
㈤ 如何在VC裡面用C語言繪制圖形,直線,圓等等。另外頭文件<graphics.h>在VC下不能使用,為什麼
<graphics.h>是TC下使用的庫
建立MFC文件,添加菜單「功能性按鍵」時選擇「CVIEW」
函數內容如下(我用的Visual studio 2010,可能有些版本不同導致操作不同)
CDC*pDC=GetDC();//得到繪圖類指針
RedrawWindow();//重建窗口
pDC->Rectangle(50,20,700,400);//以默認畫筆畫一矩形
CPen bluepen(PS_DASH,1,RGB(0,0,255));//創建畫虛線,線寬為1的藍色畫筆
CPen*old=pDC->SelectObject(&bluepen);
pDC->Ellipse(100,50,250,200);//畫圓
CPen redpen(PS_SOLID,2,RGB(255,0,0));//創建畫實線,線寬為2的紅色畫筆
pDC->SelectObject(&redpen);
pDC->Ellipse(500,50,650,200);//畫圓
pDC->MoveTo(375,100);//畫一三角形
pDC->LineTo(225,300);
pDC->LineTo(525,300);
pDC->LineTo(375,100);
CBrush greenBrush(RGB(0,255,0));//創建純色的綠色畫筆刷
pDC->SelectObject(&greenBrush);
pDC->FloodFill(375,200,RGB(255,0,0));//以純色綠筆刷填充三角形
CBrush green1Brush(HS_FDIAGONAL,RGB(0,255,0));//創建影線為斜線的綠色筆刷
pDC->SelectObject(&green1Brush);
pDC->FloodFill(600,150,RGB(255,0,0));//以綠色斜線筆刷填充圓
pDC->SelectObject(old);//釋放創建的畫筆,回復原來的畫筆
pDC->TextOut(335,250,"HELLO WORLD,It's my first computer graphic work!");//輸出字元
ReleaseDC(pDC);//釋放創建的CDC對象
㈥ 如何用C語言畫基本圖形
下面舉一個用drawpoly()函數畫箭頭的例子。#include
#include
int main()
{
int gdriver, gmode, i;
int arw[16]={200,102,300,102,300,107,330,<br/>100,300,93,300,98,200,98,200,102};
gdriver=DETECT;
initgraph(&gdriver, &gmode, "c:\\caic\\bgi");
setbkcolor(BLUE);
cleardevice();
setcolor(12); /*設置作圖顏色*/
drawpoly(8, arw); /*畫一箭頭*/
getch();
closegraph();
return 0;
}
設定線型函數
在沒有對線的特性進行設定之前,TURBO C 用其默認值,即一點寬的實線,但TURBO C 也提供了可以改變線型的函數。線型包括:寬度和形狀。其中寬度只有兩種選擇:一點寬和三點寬。而線的形狀則有五種。下面介紹有關線型的設置函數。
void far setlinestyle(intlinestyle,unsigned upattern,int thickness); 該函數用來設置線的有關信息,其中linestyle是線形狀的規定,
見下表:
有關線的形狀(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義
─────────────────────────
SOLID_LINE 0 實線
DOTTED_LINE 1 點線
CENTER_LINE 2 中心線
DASHED_LINE 3 點畫線
USERBIT_LINE 4 用戶定義線
━━━━━━━━━━━━━━━━━━━━━━━━━
有關線寬(thickness)
thickness是線的寬度,見下表。
━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義
─────────────────────────
NORM_WIDTH 1 一點寬
THIC_WIDTH 3 三點寬
━━━━━━━━━━━━━━━━━━━━━━━━━
對於upattern,只有linestyle選USERBIT_LINE 時才有意義 (選其它線型,uppattern取0即可)。此進uppattern的16位二進制數的每一位代表一個象元,如果那位為1,則該象元打開,否則該象元關閉。 void far getlinesettings(struct linesettingstypefar *lineinfo);該函數將有關線的信息存放到由lineinfo 指向的結構中,表中linesettingstype的結構如下:
struct linesettingstype
{
int linestyle;
unsigned upattern;
int thickness;
}
㈦ 利用C語言編寫 能夠畫出任意的直線演算法程序(利用畫點函數)
上次剛寫過,在VC下運行的,
int dx,dy,incrE,incrNE,d,x,y;
if ((point[1].x-point[0].x)==0){ //垂直的直線
x=point[0].x;
for(y=point[0].y;y<point[1].y;y++)
pDC->SetPixel(x,y,50);
}
else if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))<=1){ //斜率 -1到 1 之間
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=dx-2*dy;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
if(point[0].y>point[1].y){
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y--;
}
pDC->SetPixel(x,y,50);
}
}
else if(point[0].y<=point[1].y){
dy=point[1].y-point[0].y;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y++;
}
pDC->SetPixel(x,y,50);
}
}
}
else { //斜率 <-1 和 >1的直線
if(point[1].x>=point[0].x){
dx=point[1].x-point[0].x;
dy=point[1].y-point[0].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d<0){
d+=incrE;
y++;
}
else
{d+=incrNE;
pDC->SetPixel(x,y,50);
x++;
y++;
}
pDC->SetPixel(x,y,50);
}
}
else if((point[1].y-point[0].y)/(point[1].x-point[0].x)<-1){
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(y<point[1].y)
{
if(d>0){
d+=incrE;
y++;
}
else
{d+=incrNE;
x--;
y++;
}
pDC->SetPixel(x,y,50);
}
}
}
㈧ 怎樣用C語言繪制直線
1.void far line(int x0, int y0, int x1, int y1);
畫一條從點(x0, y0)到(x1, y1)的直線。
2.void far lineto(int x, int y);
畫一作從現行游標到點(x, y)的直線。
3.void far linerel(int dx, int dy);
畫一條從現行游標(x, y)到按相對增量確定的點(x+dx, y+dy)的直線。
㈨ C語言中 使用putpixel()繪制直線問題
這是因為C編譯器對數據類型強制轉化引起的:
對y = y + k來說 , 其中y為int型,k為float型,編譯器會將右值強制轉換為int型,相當於y=(int)(y+k),那麼,在0<k<1的情況下執行y=(int)(y+k)後y值不改變,所以所畫為一條平行於x軸的直線;當然,-1<k<0時,執行y=(int)(y+k)後y值減1,此時,畫線正常。
建議將y=y+k改為y = y0 + (x-x0)*k.
㈩ 怎麼用C語言畫點和直線
這個不管怎麼說不是最開始的控制台的程序,這個新建工程的時候需要選擇的是Win32的程序
畫線的函數使用windows提供的API,MoveTo:移動到起點,LineToEx:移動到終點的這兩個函數,是在OnPaint,或是響應WM_PAINT的消息的時候處理這兩個函數;畫點的畫,使用SetPixel這個函數,同樣也是在WM_PAINT的消息中去處理與畫圖有關的操作的