畫線的c語言
❶ 怎麼用C語言畫點和直線
這個不管怎麼說不是最開始的控制台的程序,這個新建工程的時候需要選擇的是Win32的程序
畫線的函數使用windows提供的API,MoveTo:移動到起點,LineToEx:移動到終點的這兩個函數,是在OnPaint,或是響應WM_PAINT的消息的時候處理這兩個函數;畫點的畫,使用SetPixel這個函數,同樣也是在WM_PAINT的消息中去處理與畫圖有關的操作的
❷ 如何在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語言畫一條紅色的直線
首先設置初始坐標和結束坐標,然後設定畫線顏色,最後用draw函數畫出來就好了
❹ 求一用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) 坐標可以為浮點數。不過,用最簡單的采樣方式,我們需要在每像素查詢所有圖元是否佔有該像素,效率很低。