SetPixel:在指定位置繪制一個1單位像素的點;
成都創(chuàng)新互聯(lián)基于成都重慶香港及美國等地區(qū)分布式IDC機房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)綿陽機房托管報價,主機托管價格性價比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。
只有當p[n].x?在?p[0].x一個像素范圍內(nèi)時,用?p[0].x繪制,y同理;
不在此像素范圍時,取最末尾兩點中點再判斷,成立則畫點,否則繼續(xù)計算;
如此畫出曲線即為貝塞爾曲線;
說的比較減省,但大體方法是這樣的;
你再鉆鉆吧
你給定一系列點子,用 CDC 的函數(shù) PolyBezierTo 畫就可以了。
繪圖開始位置用 MoveTo() 設(shè)定:
CPoint MoveTo(POINTpoint);
接著 bezier曲線 函數(shù)原型:
BOOL PolyBezierTo(const POINT* lpPoints, int nCount);
這是3次樣條函數(shù)。2此貝塞爾曲線,你要用4點參數(shù)方程,逐段畫,網(wǎng)上應(yīng)有不少程序。自己做也不難。
有關(guān)圖形窗口和圖形屏幕操作函數(shù)
一、圖形窗口操作
象文本方式下可以設(shè)定屏幕窗口一樣,圖形方式下也可以在屏幕上某一區(qū)域設(shè)定窗口,只是設(shè)定的為圖形窗口而已,其后的有關(guān)圖形操作都將以這個窗口的左上角 (0, 0)作為坐標原點,而且可為通過設(shè)置使窗口之外的區(qū)域為不可接觸。這樣,所有的圖形操作就被限定在窗口內(nèi)進行。 void far setviewport(int xl,int yl,int x2, int y2,int clipflag); 設(shè)定一個以(xl,yl)象元點為左上角,(x2,y2)象元為右下角的圖
形窗口,其中x1,y1,x2,y2是相對于整個屏幕的坐標。若 clipflag為非0,則設(shè)定的圖形以外部分不可接觸,若clipflag為0,則圖形窗口
以外可以接觸。
void far clearviewport(void); 清除現(xiàn)行圖形窗口的內(nèi)容。
void far getviewsettings(struct viewporttypefar * viewport); 獲得關(guān)于現(xiàn)行窗口的信息,并將其存于viewporttype定義的結(jié)構(gòu)
變量viewport中,其中viewporttype的結(jié)構(gòu)說明如下:
struct viewporttype
{
int left, top, right, bottom;
int cliplag;
};
注明:
1. 窗口顏色的設(shè)置與前面講過的屏幕顏色設(shè)置相同,但屏幕背景色和窗口背景色只能是一種顏色,如果窗口背景色改變,整個屏幕的背景色也將改變這與文本窗口不同。
2. 可以在同一個屏幕上設(shè)置多個窗口,但只能有一個現(xiàn)行窗口工作,要對其它窗口操作,通過將定義那個窗口的setviewport()函數(shù)再用一次即可。
3. 前面講過圖形屏幕操作的函數(shù)均適合于對窗口的操作。
二、屏幕操作
除了清屏函數(shù)以外,關(guān)于屏幕操作還有以下函數(shù):
void far setactivepage(int pagenum); void far setvisualpage(int pagenum);這兩個函數(shù)只用于EGA,VGA 以及HERCULES圖形適配器。 setctivepage()函數(shù)是為圖形輸出選擇激活頁。所謂激活頁是指后續(xù)圖形的輸出被寫到函數(shù)選定的 pagenum頁面,該頁面并不一定可見。
setvisualpage()函數(shù)才使pagenum所指定的頁面變成可見頁。頁面從0開始(Turbo C默認頁)。如果先用setactivepage() 函數(shù)在不同頁面
上畫出一幅幅圖像,再用setvisualpage() 函數(shù)交替顯示,就可以實現(xiàn)一些動畫的效果。
void far getimage(int xl,int yl, int x2,int y2,void far *mapbuf); void far putimge(int x,int,y,void * mapbuf, int op); unsined far imagesize(int xl,int yl,int x2,int y2);
這三個函數(shù)用于將屏幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過函數(shù)imagesize() 測試要保存左上角為
(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部內(nèi)容需多少個字節(jié),然后再給mapbuf分配一個所測數(shù)字節(jié)內(nèi)存空間的指針。通過調(diào)用
getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時可用putimage()函數(shù)將該圖像輸出到左上角為點(x, y)的位置上,其中
getimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。 關(guān)于這個參數(shù)的定義參見下表:
putimage()函數(shù)中的op值
━━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數(shù) 數(shù)值 含 義
——————————————————————————
COPY_PUT 0 復(fù)制
XOR_PUT 1 與屏幕圖像異或的復(fù)制
OR_PUT 2 與屏幕圖像或后復(fù)制
AND_PUT 3 與屏幕圖像與后復(fù)制
NOT_PUT 4 復(fù)制反像的圖形
━━━━━━━━━━━━━━━━━━━━━━━━━━
對于imagesize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會出錯,出錯時返回-1。
本節(jié)介紹的函數(shù)在圖像動畫處理、菜單設(shè)計技巧中非常有用。
下面程序模擬兩個小球動態(tài)碰撞過程。#include
#include
#include
int main()
{
int i, gdriver, gmode, size;
void *buf;
gdriver=DETECT;
initgraph(gdriver, gmode, "c:\\caic\\bgi");
setbkcolor(BLUE);
cleardevice();
setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1, 10);
circle(100, 200, 30);
floodfill(100, 200, 12);
size=imagesize(69, 169, 131, 231);
buf=malloc(size);
if(!buf) return -1;
getimage(69, 169, 131, 231,buf);
putimage(500, 269, buf, COPY_PUT);
for(i=0; i185; i++){
putimage(70+i, 170, buf, COPY_PUT);
putimage(500-i, 170, buf, COPY_PUT);
}
for(i=0;i185; i++){
putimage(255-i, 170, buf, COPY_PUT);
putimage(315+i, 170, buf, COPY_PUT);
}
getch();
closegraph();
}
圖形模式下的文本輸出
在圖形模式下,只能用標準輸出函數(shù),如printf(),puts(),putchar()函數(shù)輸出文本到屏幕。除此之外,其它輸出函數(shù)(如窗口輸出函數(shù))不能使用,即是可以輸出的標準函數(shù),也只以前景色為白色,按80列,25行的文本方式輸出。
Turbo C2.0也提供了一些專門用于在圖形顯示模式下的文本輸出函數(shù)。下面將分別進行介紹。
一、文本輸出函數(shù) void far outtext(char far *textstring); 該函數(shù)輸出字符串指針textstring所指的文本在現(xiàn)行位置。
void far outtextxy(int x, int y, char far *textstring);該函數(shù)輸出字符串指針textstring所指的文本在規(guī)定的(x, y)位置。其中x和y為象元坐標。
說明:
這兩個函數(shù)都是輸出字符串,但經(jīng)常會遇到輸出數(shù)值或其它類型的數(shù)據(jù),此時就必須使用格式化輸出函數(shù)sprintf()。sprintf()函數(shù)的調(diào)用格式為: int sprintf(char *str, char *format, variable-list); 它與printf()函數(shù)不同之處是將按格式化規(guī)定的內(nèi)容寫入str 指向的字符串中,返回值等于寫入的字符個數(shù)。
例如:
'C110F1sprintf(s, "your TOEFL score is %d", mark);這里s應(yīng)是字符串指針或數(shù)組,mark為整型變量。
二、有關(guān)文本字體、字型和輸出方式的設(shè)置
有關(guān)圖形方式下的文本輸出函數(shù),可以通過setcolor()函數(shù)設(shè)置輸出文本的顏色。另外,也可以改變文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。
void far settexjustify(int horiz, int vert); 該函數(shù)用于定位輸出字符串。
對使用outtextxy(int x, int y, char far *str textstring)函數(shù)所輸出的字符串,其中哪個點對應(yīng)于定位坐標(x,y)在TurboC2.0中是有規(guī)定的。如果把一個字符串看成一個長方形的圖形,在水平方向顯示時,字符串長方形按垂直方向可分為頂部,中部和底部三個位置,水平方向可分為左,中,右三個位置,兩者結(jié)合就有9個位置。
settextjustify()函數(shù)的第一個參數(shù)horiz 指出水平方向三個位置中的一個,第二個參數(shù)vert指出垂直方向三個位置中的一個,二者就確定了其中一個位置。當規(guī)定了這個位置后,用outtextxy () 函數(shù)輸出字符串時,字符串長方形的這個規(guī)定位置就對準函數(shù)中的(x,y)位置。而對用outtext()函數(shù)輸出字符串時,這個規(guī)定的位置就位于現(xiàn)行游標的位置。有關(guān)參數(shù) horiz和vert的取值參見下表:
參數(shù)horiz和vert的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符號常數(shù) 數(shù)值 用于
————————————————————————
LEFT_TEXT 0 水平
RIGHT_TEXT 2 水平
BOTTOM_TEXT 0 垂直
TOP_TEXT 2 垂直
CENTER_TEXT 1 水平或垂直
━━━━━━━━━━━━━━━━━━━━━━━━
void far settextstyle(int font, int direction,int charsize);
該函數(shù)用來設(shè)置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性。
Turbo C2.0對函數(shù)中各個參數(shù)的規(guī)定見下列各表所示:
font的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符號常數(shù) 數(shù)值 含義
————————————————————————
DEFAULT_FONT 0 8*8點陣字(缺省值)
TRIPLEX_FONT 1 三倍筆劃字體
SMALL_FONT 2 小號筆劃字體
SANSSERIF_FONT 3 無襯線筆劃字體
GOTHIC_FONT 4 黑體筆劃字
━━━━━━━━━━━━━━━━━━━━━━━━
direction的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符號常數(shù) 數(shù)值 含義
————————————————————————
HORIZ_DIR 0 從左到右
VERT_DIR 1 從底到頂
━━━━━━━━━━━━━━━━━━━━━━━━
charsize的取值
━━━━━━━━━━━━━━━━━━━━━━━━
符號常數(shù)或數(shù)值 含義
————————————————————————
1 8*8點陣
2 16*16點陣
3 24*24點陣
4 32*32點陣
5 40*40點陣
6 48*48點陣
7 56*56點陣
8 64*64點陣
9 72*72點陣
10 80*80點陣
USER_CHAR_SIZE=0 用戶定義的字符大小
━━━━━━━━━━━━━━━━━━━━━━━━
有關(guān)圖形屏幕下文本輸出和字體字型設(shè)置函數(shù)的用法請看下例:#include
#include
int main()
{
int i, gdriver, gmode;
char s[30];
gdriver=DETECT;
initgraph(gdriver, gmode, "c:\\caic\\bgi");
setbkcolor(BLUE);
cleardevice();
setviewport(100, 100, 540, 380, 1);
/*定義一個圖形窗口*/
setfillstyle(1, 2); /*綠色以實填充*/
setcolor(YELLOW);
rectangle(0, 0, 439, 279);
floodfill(50, 50, 14);
setcolor(12);
settextstyle(1, 0, 8);
/*三重筆劃字體, 水平放大8倍*/
outtextxy(20, 20, "Good Better");
setcolor(15);
settextstyle(3, 0, 5);
/*無襯筆劃字體, 水平放大5倍*/
outtextxy(120, 120, "Good Better");
setcolor(14);
settextstyle(2, 0, 8);
i=620;
sprintf(s, "Your score is %d", i);
/*將數(shù)字轉(zhuǎn)化為字符串*/
outtextxy(30, 200, s);
/*指定位置輸出字符串*/
setcolor(1);
settextstyle(4, 0, 3);
outtextxy(70, 240, s);
getch();
closegraph();
return 0;
}
三、用戶對文本字符大小的設(shè)置
前面介紹的settextstyle()函數(shù),可以設(shè)定圖形方式下輸出文本字符這字體和大小但對于筆劃型字體(除8*8點陣字以個的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。為此Turbo C2.0又提供了另外一個setusercharsize() 函數(shù),對筆劃字體可以分別設(shè)置水平和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為:
void far setusercharsize(int mulx, int divx,int muly, int divy); 該函數(shù)用來設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()
函數(shù)中的charsize為0(或USER_CHAR_SIZE)時才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。調(diào)用函數(shù) setusercharsize()后,每個顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly/divy為輸出字符高。該函數(shù)的用法見下例:
#include
#include
int main()
{
int gdriver, gmode;
gdriver=DETECT;
initgraph(gdriver, gmode, "c:\\caic\\bgi");
setbkcolor(BLUE);
cleardevice();
setfillstyle(1, 2); /*設(shè)置填充方式*/
setcolor(WHITE); /*設(shè)置白色作圖*/
rectangle(100, 100, 330, 380);
floodfill(50, 50, 14); /*填充方框以外的區(qū)域*/
setcolor(12); /*作圖色為淡紅*/
settextstyle(1, 0, 8); /*三重筆劃字體,放大8倍*/
outtextxy(120, 120, "Very Good");
setusercharsize(2, 1, 4, 1);
/*水平放大2倍,垂直放大4倍*/
setcolor(15);
settextstyle(3, 0, 5);
/*無襯字筆劃,放大5倍*/
outtextxy(220, 220, "Very Good");
setusercharsize(4, 1, 1, 1);
settextstyle(3, 0, 0);
outtextxy(180, 320, "Good");
getch();
closegraph();
return 0;
}
是畫一條貝塞爾曲線的代碼:apt數(shù)組包含四個點,兩個端點和兩個控制點。(其中第2和第3是控制點,第1和第4是端點)
首先PolyBezier()函數(shù)畫出被賽爾曲線,然后下面的四條語句用來將端點和控制點連接。
這段代碼是Charles Petzold寫的《windows程序設(shè)計》中的源代碼:
全部程序如下:
#include windows.h
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Bezier") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Bezier Splines"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (msg, NULL, 0, 0))
{
TranslateMessage (msg) ;
DispatchMessage (msg) ;
}
return msg.wParam ;
}
void DrawBezier (HDC hdc, POINT apt[])
{
PolyBezier (hdc, apt, 4) ;
MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ;
LineTo (hdc, apt[1].x, apt[1].y) ;
MoveToEx (hdc, apt[2].x, apt[2].y, NULL) ;
LineTo (hdc, apt[3].x, apt[3].y) ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static POINT apt[4] ;
HDC hdc ;
int cxClient, cyClient ;
PAINTSTRUCT ps ;
switch (message)
{
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
apt[0].x = cxClient / 4 ;
apt[0].y = cyClient / 2 ;
apt[1].x = cxClient / 2 ;
apt[1].y = cyClient / 4 ;
apt[2].x = cxClient / 2 ;
apt[2].y = 3 * cyClient / 4 ;
apt[3].x = 3 * cxClient / 4 ;
apt[3].y = cyClient / 2 ;
return 0 ;
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MOUSEMOVE:
if (wParam MK_LBUTTON || wParam MK_RBUTTON)
{
hdc = GetDC (hwnd) ;
SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
DrawBezier (hdc, apt) ;
if (wParam MK_LBUTTON)
{
apt[1].x = LOWORD (lParam) ;
apt[1].y = HIWORD (lParam) ;
}
if (wParam MK_RBUTTON)
{
apt[2].x = LOWORD (lParam) ;
apt[2].y = HIWORD (lParam) ;
}
SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
DrawBezier (hdc, apt) ;
ReleaseDC (hwnd, hdc) ;
}
return 0 ;
case WM_PAINT:
InvalidateRect (hwnd, NULL, TRUE) ;
hdc = BeginPaint (hwnd, ps) ;
DrawBezier (hdc, apt) ;
EndPaint (hwnd, ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
文章標題:c語言貝塞爾曲線函數(shù) 貝塞爾曲線生成算法
網(wǎng)站地址:http://muchs.cn/article14/hphcde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、網(wǎng)站策劃、網(wǎng)站收錄、企業(yè)網(wǎng)站制作、移動網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)