當前位置:首頁 » 編程語言 » c語言畫圖代碼

c語言畫圖代碼

發布時間: 2023-10-23 18:17:12

㈠ 求一用c語言畫直線的程序

不調用畫圖 API,用C 或 C++ 如何實現畫一條線?
Milo Yip:如何開始用 C++ 寫一個光柵化渲染器?
我嘗試用不同技術實現畫直線的方法(完整源代碼在 miloyip/line),此文簡單介紹個中思路。本文的代碼採用 C 語言、標准庫及極簡的 PNG 編碼函數 svpng(),沒有使用其他 API。

1. Bresenham 演算法
Bresenham直線演算法 [1] 是最簡單的直線光柵化(rasterization)演算法。


Bresenham 直線
如果像上圖,直線的高度小於寬度,那麼 Bresenham 直線演算法會為 軸每個坐標填入一個像素,繪畫每個像素時按斜率判斷 是否需要調整。整個演算法可以避開浮點數運算,只用整數運算實現。以下是一個簡單實現:

// Modified from https://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#C
void bresenham(int x0, int y0, int x1, int y1) {
int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int err = (dx > dy ? dx : -dy) / 2;

while (setpixel(x0, y0), x0 != x1 || y0 != y1) {
int e2 = err;
if (e2 > -dx) { err -= dy; x0 += sx; }
if (e2 < dy) { err += dx; y0 += sy; }
}
}
為了測試不同角度,我做了一個測試用例:

int main() {
memset(img, 255, sizeof(img));
float cx = w * 0.5f - 0.5f, cy = h * 0.5f - 0.5f;
for (int j = 0; j < 5; j++) {
float r1 = fminf(W, H) * (j + 0.5f) * 0.085f;
float r2 = fminf(W, H) * (j + 1.5f) * 0.085f;
float t = j * PI / 64.0f;
for (int i = 1; i <= 64; i++, t += 2.0f * PI / 64.0f) {
float ct = cosf(t), st = sinf(t);
bresenham((int)(cx + r1 * ct), (int)(cy - r1 * st), (int)(cx + r2 * ct), (int)(cy - r2 * st));
}
}
svpng(fopen("line_bresenham.png", "wb"), W, H, img, 0);
}
完整代碼 line_bresenham.c

渲染結果及中間局部放大:



2. 采樣方法
Bresenham 直線演算法有 3 個問題:

不能控制直線寬度;
坐標為整數;
只能對像素寫入一個顏色,只用單色會有嚴重的鋸齒效果。
在圖形學中,除了以逐個圖元(如直線)方式渲染,我們還可以通過對每個像素進行采樣(sampling),換句話說,我們可對整個圖像逐像素詢問:「這個像素的顏色是什麼?」

用采樣方式畫直線時,我們可以用一個具有面積的形狀去表示「直線」,例如是長方形。但在本文中,我們使用膠囊體(capsule)去表示直線。這樣就能解決上面前兩個問題:(1) 可用膠囊體半徑設置直線的寬度;(2) 坐標可以為浮點數。不過,用最簡單的采樣方式,我們需要在每像素查詢所有圖元是否佔有該像素,效率很低。

㈡ 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語言中的美麗圖案的代碼

#include <stdlib.h>
#include <math.h>
#include <graphics.h>
int size, color = 1;
void *save1, *save2;
void save();
void dsnow();
void font();
struct Snow
{
int x;
int y;
int speed;
} snow[100];
void save()
{
int i, x, y;
setcolor(WHITE);
for (i = 1; i <= 6; i++)
{
x = 200+5 * sin(i *3.1415926 / 3);
y = 200-5 * cos(i *3.1415926 / 3);
line(200, 200, x, y);
}
size = imagesize(195, 195, 205, 205);
save1 = malloc(size);
save2 = malloc(size);
getimage(195, 195, 205, 205, save1);
getimage(100, 100, 110, 110, save2);
}
void font()
{
setcolor(color);
settextstyle(0, 0, 4);
outtextxy(80, 200, "HAPPPY NEW YEAR");
color++;
if (color > 15)
color =1;
}
void dsnow()
{
int a[66], i, num = 0;
randomize();
for (i = 0; i < 66; i++)
a[i] = (i - 2) *10;
cleardevice();
while (!kbhit())
{
font();
if (num != 100)
{
snow[num].speed = 2+random(10);
i = random(66);
snow[num].x = a[i];
snow[num].y = 0;
}
for (i = 0; i < num; i++)
putimage(snow[i].x, snow[i].y, save2, COPY_PUT);
font();
if (num != 100)
num++;
for (i = 0; i < num; i++)
{
snow[i].y += snow[i].speed;
putimage(snow[i].x, snow[i].y, save1, COPY_PUT);
if (snow[i].y > 500)
snow[i].y = 0;
}
}
}
main()
{
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "");
save();
dsnow();
getch();
closegraph();
}

㈣ 用C語言寫出畫一個圓形的代碼

可以參考下面的代碼:

#include<math.h>

main()

{

double y;

int x,m;

for(y=10;y>=-10;y--)

{

m=2.5*sqrt(100-y*y);

for(x=1;x<50-m;x++)

printf(" ");

printf("*");

for(;x<50+m;x++)

printf(" ");

printf("* ");

}

}

(4)c語言畫圖代碼擴展閱讀:

for循表達式為:for(單次表達式;條件表達式;末尾循環體){中間循環體;}。

其中,表示式皆可以省略,但分號不可省略,因為「;」可以代表一個空語句,省略了之後語句減少,即為語句格式發生變化,則編譯器不能識別而無法進行編譯。for循環小括弧里第一個「;」號前為一個為不參與循環的單次表達式。

㈤ 用c語言寫程序,此程序能畫出來函數y=2x+5的曲線圖形。

此題把數學問題轉化為用C語言描述即可,很多畫圖問題可以使用這種方法。

  1. 假設屏幕左上角為坐標軸原點



#include<stdio.h>
#defineMAX30//選定曲線要顯示的范圍,因為一次函數是一條直線,所以它的顯示範圍無窮
intmain()
{
intx,y;
for(y=30;y>=0;y--)
{
for(x=0;x<MAX;x++)
{
if(y==2*x+5)
{
printf("*");
}
else
{
printf("");//空格,不滿足y=2x+5的點
}
}
printf(" ");//x軸已經到顯示範圍,所以需要換行。
}
return0;
}

㈥ 誰知道C語言怎麼畫圖啊

Turbo C提供了非常豐富的圖形函數, 所有圖形函數的原型均在graphics. h中, 本節主要介紹圖形模式的初始化、獨立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數。另外, 使用圖形函數時要確保有顯示器圖形驅動程序*BGI, 同時將集成開發環境Options/Linker中的Graphics lib選為on, 只有這樣才能保證正確使用圖形函數。由於種類比較多,所以下面僅列舉2個例子,拋磚引玉→
1.點
void far putpixel(int x, int y, int color);
2.線
void far line(int x0, int y0, int x1, int y1); 畫一條從點(x0, y0)到(x1, y1)的直線。

void far lineto(int x, int y); 畫一作從現行游標到點(x, y)的直線。

void far linerel(int dx, int dy); 畫一條從現行游標(x, y)到按相對增量確定的點(x+dx, y+dy)的直線。

void far circle(int x, int y, int radius); 以(x, y)為圓心, radius為半徑, 畫一個圓。

c語言的圖形部分是很有意思的,也是c中最精彩的內容之一,希望你能很快享受它的樂趣。

㈦ c語言編程一個畫圖軟體(畫板)該如何編寫求大佬幫助,謝謝。

C語言中提供了庫函數來畫圓,函數名為circle
函數的頭文件為 #include<graphics.h>

函數功能: circle()使用當前繪圖色並以實線畫一個完整的圓。
用法:該函數調用方式為void circle(int x,int y,int radius);
說明:參數x,y為圓心坐標,radius為圓半徑,用像素個素表示。注意,調用circle()函數畫圓時不用當前線型。

熱點內容
b樹磁碟存儲 發布:2025-01-31 19:42:53 瀏覽:837
聯想小新air15怎麼配置環境 發布:2025-01-31 19:06:57 瀏覽:968
什麼配置玩3a 發布:2025-01-31 19:05:22 瀏覽:586
phpoa系統 發布:2025-01-31 18:58:42 瀏覽:10
值e的編程 發布:2025-01-31 18:57:06 瀏覽:977
安卓手機的軟體認證在哪裡 發布:2025-01-31 18:57:01 瀏覽:535
android彈出來 發布:2025-01-31 18:56:56 瀏覽:232
辦公室白領新解壓方法 發布:2025-01-31 18:55:23 瀏覽:558
摩斯密碼短長是什麼意思 發布:2025-01-31 18:50:17 瀏覽:587
類的訪問修飾 發布:2025-01-31 18:42:46 瀏覽:933