计算机图形学程序

计算机图形学程序,第1张

void CDeBoorView::OnDraw(CDC* pDC)

{

int deg=8float coeffx[9]={200,50,100,150,200,250,300,350,200}

float coeffy[9]={200,100,50,50,100,50,50,100,200}

float knot[18]={0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2}

CDeBoorDoc* pDoc = GetDocument()

ASSERT_VALID(pDoc)

int L,n1=9,n=100,i,j

L=n1-deg

float u

float ps[100][2]

for(i=0i<n1i++){

if(i==0)pDC->MoveTo(coeffx[i],coeffy[i])

pDC->LineTo(coeffx[i],coeffy[i])

}

for(i=degi<L+deg+1i++){

if(knot[i+1]>knot[i])

for(j=0j<nj++){

u=knot[i]+j*(knot[i+1]-knot[i])/n

ps[j][0]=deboor(deg,coeffx,knot,u,i,pDC)

ps[j][1]=deboor(deg,coeffy,knot,u,i,pDC)

CPen newpen(PS_SOLID,3,RGB(255,0,0))

CPen *old1=pDC->SelectObject(&newpen)

if(j==0)

pDC->MoveTo(ps[j][0],ps[j][1])

pDC->LineTo(ps[j][0],ps[j][1])

}

}

}

float CDeBoorView::deboor(int deg,float coeff[],float knot[],float u,int i,CDC*pDC){

int k,j

float t1,t2

float coeffa[30]

for(j=i-degj<=ij++)

coeffa[j]=coeff[j]

for(k=1k<=degk++)

for(j=ij>=i-deg+kj--)

{

t1=(knot[j]-u)/(knot[j]-knot[j+deg-k+1])

t2=1.0-t1

coeffa[j]=t2*coeffa[j-1]+t1*coeffa[j]

}

return(coeffa[i])

}

这个要你自己给出起点和终点:

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <graphics.h>

void swap_start_end(int &x1,int &y1,int &x2,int &y2)

void s_line(int x1,int y1,int x2,int y2)

main()

{

int x1,y1,x2,y2

printf("Please input the start dot:\n")

scanf("%d%d",&x1,&y1)

printf("Please input the end dot:\n")

scanf("%d%d",&x2,&y2)

swap(x1,y1,x2,y2)

s_line(x1,y1,x2,y2)

}

void swap_start_end(int &x1,int &y1,int &x2,int &y2)

{

int mid

mid=x1

x1=y1

y1=mid

mid=x2

x2=y2

y2=mid

}

void s_line(int x1,int y1,int x2,int y2)

{

int driver=DETECT,mode

int curx,cury,dx,dy,tx,ty,mid,d,flag,i

initgraph(&driver,&mode,"")

curx=x1

cury=y1

dx=abs(x2-x1)

dy=abs(y2-y1)

if(x2-x1>=0)

tx=1

else

tx=-1

if(y2-y1>=0)

ty=1

else

ty=-1

if(dx>dy)

flag=0

else

{

flag=1

mid=dxdx=dydy=mid

mid=txtx=tyty=mid

mid=x1x1=y1y1=mid

mid=x2x2=y2y2=mid

}

if(flag)

putpixel(cury,curx,2)

else

putpixel(curx,cury,2)

d=2*dy-dx

for(i=0i<dxi++)

{

if(d>=0)

{

d=d+2*(dy-dx)

cury+=ty

}

else

d=d+2*dy

curx+=tx

if(flag)

putpixel(cury,curx,2)

else

putpixel(curx,cury,2)

}

getch()

closegraph()

}

#include <math.h>

#include <graphics.h> /*预定义库函数*/

void circlePoint(int x,int y) /*八分法画圆程序*/

{

circle(320 x*20,240 y*20,3)

circle(320 y*20,240 x*20,3)

circle(320-y*20,240 x*20,3)

circle(320-x*20,240 y*20,3)

circle(320-x*20,240 y*20,3)

circle(320-x*20,240-y*20,3)

circle(320-y*20,240-x*20,3)

circle(320 y*20,240-x*20,3)

circle(320 x*20,240-y*20,3)

}

void MidBresenhamcircle(int r) /* 中点Bresenham算法画圆的程序 */

{

int x,y,d

x=0y=rd=1-r /* 计算初始值 */

while(x<y)

{ circlePoint(x,y) /* 绘制点(x,y)及其在八分圆中的另外7个对称点 */

if(d<0) d =2*x 3 /* 根据误差项d的判断,决定非最大位移方向上是走还是不走 */

else

{ d =2*(x-y) 5

y--

}

delay(900000)

} /* while */

}

main()

{

int i,j,r,graphmode,graphdriver

detectgraph(&graphdriver,&graphmode)

initgraph(&graphdriver,&graphmode," ")

printf("中点Bresenhamcircle算法画圆的程序\n") /*提示信息*/

printf("注意 |r|<=11")

printf("\n输入半径值 r:")

scanf("%d",&r)

printf("按任意键显示图形...")

getch()

cleardevice()

setbkcolor(BLACK)

for(i=20i<=620i =20) /*使用双循环画点函数画出表格中的纵坐标*/

for(j=20j<=460j )

putpixel(i,j,2)

for(j=20j<=460j =20) /*使用双循环画点函数画出表格中的横坐标*/

for(i=20i<=620i )

putpixel(i,j,2)

outtextxy(320,245,"0") /*原点坐标*/

outtextxy(320-5*20,245,"-5")circle(320-5*20,240,2) /*横坐标值*/

outtextxy(320 5*20,245,"5")circle(320 5*20,240,2)

outtextxy(320-10*20,245,"-10")circle(320-10*20,240,2)

outtextxy(320 10*20,245,"10")circle(320 10*20,240,2)

outtextxy(320-15*20,245,"-15")circle(320-15*20,240,2)

outtextxy(320 15*20,245,"15")circle(320 15*20,240,2)

outtextxy(320,240-5*20,"-5")circle(320,240-5*20,2) /*纵坐标值*/

outtextxy(320,240 5*20,"5")circle(320,240 5*20,2)

outtextxy(320,240-10*20,"-10")circle(320,240-10*20,2)

outtextxy(320,240 10*20,"10")circle(320,240 10*20,2)

outtextxy(20,10,"The center of the circle is (0,0) ") /*坐标轴左上角显示提示信息*/

setcolor(RED) /*标记坐标轴*/

line(20,240,620,240) outtextxy(320 15*20,230,"X")

line(320,20,320,460) outtextxy(330,20,"Y")

setcolor(YELLOW)

MidBresenhamcircle(r)

setcolor(BLUE) /*绘制圆*/

circle(320,240,r*20)

setcolor(2)

getch()

closegraph()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11156572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存