![计算机图形学计算机图形学-图形学代码_第1页](http://file4.renrendoc.com/view9/M01/21/05/wKhkGWc9hQiAQP8HAAEX2Zu1_M4431.jpg)
![计算机图形学计算机图形学-图形学代码_第2页](http://file4.renrendoc.com/view9/M01/21/05/wKhkGWc9hQiAQP8HAAEX2Zu1_M44312.jpg)
![计算机图形学计算机图形学-图形学代码_第3页](http://file4.renrendoc.com/view9/M01/21/05/wKhkGWc9hQiAQP8HAAEX2Zu1_M44313.jpg)
![计算机图形学计算机图形学-图形学代码_第4页](http://file4.renrendoc.com/view9/M01/21/05/wKhkGWc9hQiAQP8HAAEX2Zu1_M44314.jpg)
![计算机图形学计算机图形学-图形学代码_第5页](http://file4.renrendoc.com/view9/M01/21/05/wKhkGWc9hQiAQP8HAAEX2Zu1_M44315.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
〃DDA画直线响应函数
voidCLine_ScanView::OnLineDda()
(
//TODO:在此添加命令处理程序代码
LineI;
LDoModal();
DDALine(l.xlJ.ylJ.x2,l.y2,NULL);
)
〃Bresenham画直线响应函数
voidCLine_ScanView::OnLineBresenham()
(
//TODO:在此添加命令处理程序代码
LineI;
LDoModal();
BresenhamLine(l.xlJ.yl,l.x2,l.y2,NULL);
}
〃中点Bresenham而直线响应函数
voidCLine_ScanView::OnLineMidbresenham()
{
//TODO:在此添加命令处理程序代码
LineI;
LDoModalf);
x
MidBresenhamLine(l.xl,l.yl/l-2J.y2,NULL);
}
//DDA画直线算法
voidCLine_ScanView::DDALine(intxl,intyl,intx2,inty2,intcolor)
(
intdx,dy,epsl,k;
floatx=10,y=10,xlncreJylncre;
dx=x2-xl;
dy=y2-yl;
k=dy/dx;
y=yi;
if(abs(dx)>abs(dy))
epsl=abs(dx);
else
epsl=abs(dy);
xlncre=(float)dx/(float)epsl;
ylncre=(float)dy/(float)epsl;
CCIientDCdc(this);
for(k=0;k<=epsl;k++){
dc.SetPixel((int)x.(int)y,color);
x+=xlncre;
y+=ylncre;
)
)
//MidBresenham画直线算法
voidCLine_ScanView::MidEresenhamLine(intxl,intyl,intx2,inty2,intcolor)
(
intdx,dy,d,Uplncre,Downlncre,x,y;
if(xl>x2){
x=x2;x2=xl;xl=x;
y=y2;y2=yl;yl=y;
)
x=xl;
y=yi;
dx=x2-xl;
dy=y2-yl;
d=dx-2*dy;
CCIientDCdc(this);
Uplncre=2*dx-2*dy;
Downlncre=-2*dy;
while(x<=x2){
dc.SetPixel(x,y,color);
x++;
if(d<0){
V++;
d+=Uplncre;
)
else
d+=Downlncre;
)
}
//Bresenham画宜线算法
voidCLine_ScanView::BresenhamLine(intxl,intyl,intx2,inty2,intcolor)
{
intx,y,dx,dy,e;
dx=x2-xl;
dy=y2-yl;
e=-dx;
x=xl;
y=yi;
CCIientDCdc(this);
while(x<=x2){
de.SetPixel(x,y,color);
x++;
e=e+2*dy;
if(e>0){
y++;
e=e-2*dx;
)
)
)
//中点画圆响应函数
voidCLine_ScanView::OnCixleMidbresenham()
{
//TODO:在此添加命令处理程序代码
Circlec;
c.DoModal();
MidBresenhamCircle(c.r,NULL);
)
//中点画圆算法
voidCLine_ScanView::MidBresenhamCircle(intr,intcolor)
{
intx=0;
inty=r;
intd=1-r;
intxO=100;
intyO=100;
CDC*pDC=GetDC();
while(x<=y){
pDC->SetPixel(x+xO,y+yO,color);
pDC->SetPixel(-x+xO,y+yO,color);
pDC->SetPixel(-x+xO,-y+yO,color);
pDC->SetPixel(x+xO,-y+yO,color);
pDC->SetPixel(y+xOzx+yO,color);
pDC->SetPixel(-y+xO,x+yO,color);
pDC->SetPixel(-y+xO,-x+yO,color);
pDC->SetPixel(y+xO,-x+yOzcolor);
if(d<0)
d+=2*x+3;
else{
d+=2*(x-y)+5;
y-;
)
x++;
)
}
〃中点画椭圆响应函数
voidCLine_ScanView::OnEllipseMidbresenham()
(
//TODO:在此添加命令处理程序代码
TuoYuanty;
ty.DoModal();
MidBresenhamEllipse代.ya,ty.b,NULL);
)
//中点画椭圆算法
voidCLine_ScanView::MidEresenhamEllipse(inta,intb,intcolor)
{
intx=0;
inty=b;
intxO=100;
intyO=100;
floatdl,d2;
dl=b*b+a*a*(-b+0.25);
CDC*pDC=GetDC();
pDC->SetPixel(x+xO,y+yO,color);
pDC->SetPixel(-x+xO,-y+yO,color);
pDC->SetPixel(-x+xO,y+yO,color);
pDC->SetPixel(x+xO,-y+yO,color);
while(b*b*(x+l)<a*a*Jy-0.5)){
if(dl<0){
dl+=b*b*(2xx+3);
x++;
)
else{
dl+=b*b*(2xx+3)+a*a*(-2*y+2);
x++;
y-;
)
pDC->SetPixel(x+xO,y+yO,color);
pDC->SetPixel(-x+xO,-y+yO,color);
pDC->SetPixel(-x+xO,y+yO,color);
pDC->SetPixel(x+xO,-y+yO,color);
)
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-l)*(y-l)-a*a*b*b;
while(y>0){
if(d2<=0){
d2+=b*b*(2xx+2)+a*a*(-2*y+3);
x++;
y--;
)
else{
d2+=a*a*(-2*y+3);
y-;
)
pDC->SetPixel(x+xO,y+yO,color);
pDC->SetPixel(-x+xO,-y+yO,color);
pDC->SetPixel(-x+xO,y+yO,color);
pDC->SetPixel(x+xO,-y+yO,color);
)
//多边形的扫描转换响应函数
voidCLine_ScanView::OnPolygonScan()
(
//TODO:在此添加命令处理程序代码
CDC*pDC=GetDC();
constintPOINTNUM=6;〃多边形点数.
/******定义结构体用于活性边表AET和新边表
NET***********************************/
typedefstructXET
(
floatx;
floatdx,ymax;
XET*next;
}AET,NET;
/"****定义点结构体pQjp^******♦♦***♦*♦*♦*♦*♦***♦*****♦♦*♦*********************I
structpoint
(
floatx;
floaty;
}polypoint[POINTNUM]={250,50,550,150,550,400,250,250,100,350,100,100};〃多边形顶点
//mypoint[POINTNUM]={100,100,200,100,200,200,100/200};//iEZj^
*****计算最高点的y坐标(扫描到此结束)**********,****************************
intMaxY=O;
inti;
for(i=0;i<POINTNUM;i-+)
if(polypoint[i].y>MaxY)
MaxY=polypoint[i].y;
******初始化AET表*******************************************************X***/
AET*pAET=newAET;
pAET->next=NULL;
*****初j好[f匕NET表************************************************************
NET*pNET(1024];
for(i=0;i<=MaxY;i++)
(
pNET[i]=newNET;
pNET[i]->next=NULL;
)
/****♦♦扫描并建立NET表
*********************************************************/
for(i=0;i<=MaxY;i++)
(
forfintj=0;j<POINTNUM;j++)
if(polypoint[j].y==i)
{
if(polypoint[(j-l+POINTNUM)%POINTNUM].y>polypoint[j].y)
(
NET*p=newNET;
p->x=polypoint[j].x;
p->ymax=polypoint[(j-l+POINTNUM)%POINTNUM].y;
p->dx=(polypoint[(j-l+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-l+POINTNUM)%
POINTNUM].y-polypoint[j].y);
p->next=pNET[i]->next;
pNET[i]->next=p;
)
if(polypoint[(j+l+POINTNUM)%POINTNUM].y>polypoint(j].y)
(
NET*p=newNET;
p->x=polypoint[j].x;
p->ymax=polypoint[(j+l+POINTNUM)%POINTNUM].y;
p->dx=(polypoint[(j+l+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+l+POINTNlM)%
POINTNUM).y-polypo>nt[j].y);
p->next=pNET[i]->next;
pNET[i]->next=p;
)
)
/******建立并更新活性边表
AET*****************************************************
for(i=0;i<=MaxY;i++)
//计算新的交点x,更新
AET********************************************************/
NET*p=pAET->next;
while(p)
p->x=p->x+p->dx;
p=p->next;
)
//更新后新AET先排序
************************************************************
*/
〃断表排序,不再开辟空间
AET*tq=pAET;
p=pAET->next;
tq->next=NULL;
while(p)
(
while(tq->next&&p->x>=tq->next->x)
tq=tq->next;
NET*s=p->next;
p->next=tq->next;
tq->next=p;
P=s;
tq=pAET;
)
//(改进算法)先从AET表中删除ymax==i的结点
****************************************/
AET*q=pAET;
p=q->next;
while(p)
{
if(p->ymax==i)
q->next=p->next;
deetep;
p=q->next;
else
{
q=q->next;
p=q->next;
)
)
〃将NET中的新点加入AET,并用插入法按X值递增排序
**********************************/
p=pNET[i]->next;
q=pAET;
while(p)
{
while(q->next&&p->x>=q->next->x)
q=q->next;
NET*s=p->next;
p->next=q->next;
q->next=p;
P=s;
q=pAET:
)
/******配对填充颜色
***************************************************************/
p=pAET->next;
while(p&&p->next)
for(floatj=p->x;j<=p->next->x;j++)
pDC->SetPixel(static_cast<int>(j),i/RGB(255,0,0));
p=p->next->next;〃考虑端点情况
)
)
)
//多边形的4种子填充响应函数
voidCLine_ScanView::OnPolygonArea4()
(
//TODO:在此添加命令处理程序代码
DuoBianXingdbx;
dbx.DoModal();
BoundaryFill4(dbx.x,dox.y,RGB(0,255,0),RGB(255,0,0));
)
//多边形的4种子填充算法
voidCLine_ScanView::BoundaryFill4(intx,inty,intboundarycolor,intnewcolor)
CDC*pDC=GetDC();
CPenpen;
pen.CreatePen(RS_SOUDz2,RGB(0,255,0));
pDC->SelectObject(&pen);
inta[4][2]={200,100,180,120,220,120,200,100};
pDC->MoveTo(a[0][0],a[0][l]);
for(inti=0;i<4;i++){
pDC->LineTo(a[i][0]/a[i][l]);
)
intcolor=pDC->GetPixel(xzy);
if(color!=newcolor&&color!=boundarycolor){
pDC->SetPixel(x,y.newcolor);
BoundaryFill4(x/yfl/boundarycolor,newcolor);
BoundaryFill4(xyl,boundarycolor,newcolor);
BoundaryFill4(x+l,y,boundarycolor,newcolor);
BoundaryFill4(x-l,y,boundarycolor,newcolor);
)
)
//多边形的8种子填充响应函数
voidCLine_ScanView::OnPolygonArea8()
(
//TODO:在此添加命令处理程序代码
DuoBianXingdbx;
dbx.DoModal();
BoundaryFill8(dbx.x,dbx.y,RGB(0,255,0),RGB(255,0,0));
//多边形的8种子填充算法
voidCLine_ScanView::BoundaryFill8(intx,inty,intboundarycoloointnewcolor)
|
CDC*pDC=GetDC();
CPenpen;
pen.CreatePen(PS_SOSD,2,RGB(0,255,0));
pDC->SelectObject(&pen);
inta[4][2]={200,100480,120,220,120,200,100};
pDC->MoveTo(a[0][0],a[0][l]);
for(inti=0;i<4;i++){
pDC->LineTo(a[i][0]/a[i][l]);
)
intcolor=pDC->GetPixel(x,y);
if(color!=newcolor&&color!=boundarycolor){
pDC->SetPixel(x,y,newcolor);
BoundaryFillSfx^-nl,boundarycolor,newcolor);
BoundaryFill8(x+l,y+l,boundarycolor,newcolor);
BoundaryFillSfx^-l^oundarycoloGnewcolor);
BoundaryFill8(x-l,y-l,boundarycolorznewcolor);
BoundaryFill8(x+l,y,boundarycolor,newcolor);
BoundaryFill8(x+l,y-l,boundarycolor,newcolor);
BoundaryFill8(x-l,y,boundarycolor,newcolor);
BoundaryFill8(x-1,7+1,boundarycolor,newcolor);
)
}
//二维变换的比例变换响应函数
voidCLine_ScanView::OnTv/oProportion()
{
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenpenl;
penl.CreatePen(PS_S0LID/2,RGB(255z10,255));
int
3[11][2]={100,105,90,135,60,135,85,155,75,185,100,165,125,185,115,155,140,135,110,135,100,
105);
dc.SelectObject(&penl);
dc.MoveTo(a[0][0],a[C][l]);
for(inti=0;i<ll;i++){
dc.LineTo(a[i][0],a[i][l]);
)
doublesx=0.5,sy=0.5;
dc.MoveTo(a[0][0]*sx,a[0][l]*sy);
for(inti=0;i<ll;i++){
dc.LineTo(a[i][O]*sxza[i][l]*sy);
Sleep(5);
)
penl.DeleteObject();
)
//二维变换的旋转变换响应函数
voidCLine_ScanView::OnTv/oRotating()
(
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenpenl;
penl.CreatePen(PS_S0LID,2,RGB(255,10,255));
int
a[ll](2]={100,105,90,135,60,135,85,155,75,185,100,165,125,185,115,155,140,135,110,135,100,
105);
dc.SelectObject(&penl);
dc.MoveTo(a[O][O],a[C][l]);
for(inti=0;i<ll;i++){
dc.LineTo同」[0]月皿1]);
)
intt=600;
dc.MoveTo(a[0][0]*cos((t/6)*1.0)-a[0][l]*sin((t/6)*1.0),//一个点
a[0][0]*sin((t/6)*1.0)+a[0][l]*cos((t/6)*1.0));
for(inti=0;i<ll;i++){
dc.LineTo(a[i]⑼*cos((t/6)*1.0)-a「][l]*sin((t/6)*L0),〃一个点
a[i][0]*sin((t/6)*1.0)+a[i][l]*cos((t/6)*1.0));
)
penl.DeleteObject();
)
//二维变换的错切变换响应函数
voidCLine_ScanView::OnTv/oShear()
{
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenperil;
penl.CreatePen(PS_S0LID,2,RGB(255,10,255));
int
a[ll][2]={100,105,90,135,60,135,85,155,75,185,100,165,125,185,115,155,140,135,110,135,100,
105};
dc.SelectObject(&penl);
dc.MoveTo
for(inti=0;i<ll;i++){
dc.LineTo(a[i][0],a[i][l]);
)
doublec=2zd=1.5,u=50;
dc.MoveTo(a[0][0]+c*a[0][l]/a[0][l]-u);
for(inti=0;i<ll;i++){
dc.LineTo(a[i][0]+c*a[i][l],a[i][l]-u);
)
ints=170,h=200;
dc.MoveTo(a[O][O]+szd*a[O][O]+a[O][l]-h);
for(inti=0;i<ll;i++){
dc.LineTo(a[i][0]+szd*a[i](0]+a[i][l]-h);
)
penl.DeleteObject();
//二维变换的对称变换响应函数
voidCLine_ScanView::OnTv/oSymmetry()
(
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenperil;
penl.CreatePen(PS_S0LID,2,RGB(255,10,255));
int
a[ll][2]={100,105,90,135,60,135,85,155,75,185,100,165,125,185,115,155,140,135,110,135,100,
105);
dc.SelectObject(&penl);
dc.MoveTo(a[0][0],a[C][l]);
for(inti=0;i<ll;i++){
dc.LineTo(a[i](O],a[iKl));
)
intm=0,b=200;
个点
dc.MoveTo(a[0][0]*(l-m*m)/(l+m*m)+2*(a[0][l]-b)*m/(l+m*m)z//—
a[0][0]*(2*m)/(l+m*m)+(a[0][l]-b)*(m*m-l)/(l+m*m)+b);
for(inti=0;i<ll;i++){
dc.LineTo(a[i][0]*(l-m*mi/(l+m*m)+2*(a[i][l]-b)*m/(l+m*m)/
a[i][0]*(2*m)/(l+m*m)+(a[][l]-b)*(m*m-l)/(l+m*m)+b);
)
penl.DeleteObject();
)
//一维变换的平移变换响应函数
voidCLine_ScanView::OnTv/oTranslation()
{
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenperil;
penl.CreatePen(PS_S0LID,2,RGB(255,10,255));
int
a[ll]⑵={100,105,90,135,60,135,85,155,75,185,100,165,125,185,115,155,140,135,110,135,100,
105};
dc.SelectObject(&penl);
dc.MoveTo
for(inti=0;i<ll;i++){
dc.LineTo(a[i][0],a[i][l]);
)
inttx=120,ty=100;
dc.MoveTo(a[0][0]+tx,a[0][l]+ty);
for(inti=0;i<ll;i++){
dc.LineTo(a[i][O]+tx,a[i][l]+ty);
)
penl.DeleteObject();
)
//三维变换的比例变换响应函数
voidCLine_ScanView::OnTI'reeProportion()
(
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenpenl,pen2;
penl.CreatePen(PS_SOLIDz2,RGB(O/O/O));
pen2.CreatePen(PS_S0LID,2,RGB(0,255/0));
inta[4][4]={100,150,0,1,50,200,0,1,150,200,0,1,100,150,0,";
dc.SelectObject(&penl);
dc.MoveTo(3[0][0],3[0][1]);
for(inti=0;i<4;i++){
dc.LineTo(a[i](OLa[i][l]);
)
intb[4][4]={2,0,0,0,02,0,0,0,0,2,0,0,0,0,1};
intc[4][4];
for(inti=0;i<4;i++){
forfintj=0;j<4;j++|{
c[i][j]=O;
)
)
for(inti=0;i<4;i++){
for(intj=0;j<4;j++|{
forfintk=0;k<4;k++){
c[i皿=c[i皿+a皿k]*b[k皿;
)
)
)
dc.SelectObject(&pen2);
dc.MoveTo(c[0][0]zc[0][l]);
for(inti=0;i<4;i++){
dc.LineTo(c[i][0]zc[i][l]);
)
penl.DeleteObject();
pen2.DeleteObject();
)
//三维变换的旋转变换响应函数
voidCLine_ScanView::OnThreeRotating()
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenpenl,pen2;
penLCreatePen(PS_SOLID,2,RGB(O,O,O));
pen2.CreatePen(PS_SOLID,2,RGB(255,O,O));
inta[4][4]={100,150,0,1,50,200,0,1,150,200,0,1,100,150,0,1};
dc.SelectObject(&penl);
dc.MoveTo(a[O][O],a[C][l]);
for(inti=0;i<4;i++){
dc.LineTo(a[i][0],a[i][l]);
)
intt=600;
dc.SelectObject(&pen2);
dc.MoveTo(a[0][0]*cos((t/6)*1.0)-a[0][l]*sin((t/6)*1.0),//-
a[0][0]*sin((t/6)*1.0)+a[0][l]*cos((t/6)*1.0));
for(inti=0;i<4;i++){
dc.LineTo(a皿0r85((t/G)*1.0)-a[i][l]*sin((t/G)*1.0),〃一个点
a[i][0]*sin((t/6)*1.0)+a[i][l]*cos((t/6)*1.0));
)
penl.DeleteObject();
pen2.DeleteObject();
)
//三维变换的错切变换响应函数
voidCLine_ScanView::OnTbreeShear{)
{
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenpenlzpen2;
penl.CreatePen(PS_S0LID,2,RGB(0,0,0));
pen2.CreatePen(PS_SOLID,2,RGB(255,255,0));
inta[4][4]={100,150,0,1,50,200,0,1,150,200,0,1,100,150,0,1};
dc.SelectObject(&penl);
dc.MoveTo(a[O][O],a[C][l]);
for(inti=0;i<4;i++){
dc.LineTo(a[i][OLa[i][l]);
)
intb[4][4]={1,2,0,0,15,1,0,0,0,0,1,0,0,0,0,1};
intc[4][4];
for(inti=0;i<4;i++){
forfintj=0;j<4;j++|{
c[i皿=0;
}
}
for(inti=0;i<4;i++){
forfintj=0;j<4;j++|{
for(intk=0;k<4;k++){
c[i]U]=c[i][j]+a[i][k]*b[k]U];
)
}
)
dc.SelectObject(&pen2);
dc.MoveTo(c[0][0],c[0][l]);
for(inti=0;i<4;i++){
dc.LineTo(c[i][0],c[i][l]);
)
penl.DeleteObject();
pen2.DeleteObject();
)
//二维变换的对称变换响应函数
voidCLine_ScanView::OnTbreeSymmetry()
{
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenpenl,pen2;
penl.CreatePen(PS_S0LID,2,RGB(0,0,0));
pen2.CreatePen(PS_SOLID,2,RGB(O,255/255));
inta[4][4]={100,150,0,1,50,200,0,1,150,200,0,1,100,150,0,1};
dc.SelectObject(&penl);
dc.MoveTo(a[0][0],a[C][l]);
for(inti=0;i<4;i++){
dc.LineTo(a[i][OLa[i][l]);
)
intb[4][4]={0,1,0,0,100,0,0,0,1,0,0,0,0,1};〃沿y=x对称
intc[4][4];
for(inti=0;i<4;i++){
forfintj=0;j<4;j++|{
c[i)U)=O;
)
)
for(inti=0;i<4;i++){
forfintj=0;j<4;j++|{
for(intk=0;k<4;k++){
c[i]U]=c[i]U]+a[i][k]*b[k](j];
)
}
}
dc.SelectObject(&pen2);
dc.MoveTo(c[0][0],c[0][l]);
for(inti=0;i<4;i++){
dc.LineTo(c[i][0],c[i][l]);
)
penl.DeleteObject();
pen2.DeleteObject();
)
//三维变换的平移变换响应函数
voidCLine_ScanView::OnTI*reeTranslation()
(
//TODO:在此添加命令处理程序代码
CCIientDCdc(this);
CPenpenlzpen2;
penl.CreatePen(PS_SOLID,2,RGB(O,O,O));
pen2.CreatePen(PS_SOLID/2,RGD(0/0,255));
inta[4][4]={100,150,0,1,50,200,0,1,150,200,0,1,100,150,0,1};
dc.SelectObject(&penl);
dc.MoveTo(a[O][O],a[C][l]);
for(inti=0;i<4;i++){
dc.LineTo(a[i][OLa[i][l]);
)
intb[4][4]={1,0,0,0,0,1,0,0,0,0,1,0,100,100,0,1};
intc[4][4];
for(inti=0;i<4;i++){
for(intj=0;j<4;j++|{
c[i]U)=O;
)
)
for(inti=0;i<4;i++){
for(intj=0;j<4;j++|{
for(intk=0;k<4;k++){
c[i]D]=c[i][j]+a[i][k]*b[k]U];
)
)
)
dc.SelectObject(&pen2);
dc.MoveTo(c[0][0],c[0][l]);
for(inti=0;i<4;i++){
dc.LineTo(c[i][0]/c[i][l]);
)
penl.DeleteObject();
pen2.DeleteObject();
//直线段CS裁剪算法的响应函数
voidCLine_ScanView::OnLineCs()
(
//TODO:在此添加命令处理程序代码
Line_Cut1c;
lc.DoModal();
intmin_clip_x=100zmin_clip_y=100,max_clip_x=300,max_clip_y=300;
CCIientDCdc(this);
dc.MoveTo(min_clip_x,min_clip_y);
dc.LineTo(min_clip_x,nax_clip_y);
dc.MoveTo(min_clip_x,max_clip_y);
dc.LineTo(max_clip_x,max_clip_y);
dc.MoveTo(max_clip_>:,max_clip_y);
dc.LineTo(max_clip_x,min_clip_y);
dc.MoveTo(max_clip_>:?min_clip_y);
dc.LineTo(min_clip_x,min_clip_y);
if(CutLine(lc.xOJc.yO,lcxlJc.yl)){
dc.MoveTo(lc.xO,lc.yO);
dc.LineTo(lc.xlJc.yl);
)
)
//直线段中点分割算法的响应函数
voidCLine_ScanView::OnLineMidpoint()
{
//TODO:在此添加命令处理程序代码
intxO,yO,xl,yl;
CCIientDCdc(this);
intmin_clip_x=100/min_clip_y=100zmax_clip_x=300,max_clip_y=300;
dc.MoveTo(min_clip_x,min_clip_y);
dc.LineTo(min_clip_x,max_clip_y);
dc.MoveTo(min_clip_x,max_clip_y);
dc.LineTo(max_clip_x,max_clip_y);
dc.MoveTo(max_clip_>:/max_clip_y);
dc.LineTo(max_clip_x,min_clip_y);
dc.MoveTo(max_clip_>:,min_clip_y);
dc.LineTo(min_clip_x,min_clip_y);
x0=120;y0=90;xl=310,yl=310;
Mid_CutLine(xO,yO,xl,/l);
)
/*voidCLine_ScanView::CompOutCode(intx,inty,CRect*rect,OutCode*outCode)
(
outCode->all=0;
outCode->top=outCode->bottom=0;
if(y<rect->top)
(
outCode->top=1;
outCode->all+=1;
)
elseif(y>rect->bottom)
(
outCode->bottom=1;
outCode->all+=1;
)
outCode->right=outCDde->left=0;
if(x>rect->right)
(
outCode->right=1;
outCode->all+=1;
)
elseif(x<rect->left)
{
outCode->left=1;
outCode->all+=1;
)
)*/
//直线段的CS裁剪算法
intCLine_ScanView::CutLine(int&xO,int&yO,int&xl,int&yl)
(
#defineCLIP_CODE_CDxOOOO
^defineCLIP_CODE_N0x0008
//defineCLIP_CODE_S0x0004
#defineCLIP_CODE_E0x0002
#defineCLIP_CODE_W0x0001
#defineCLIPCODENE0x000a
#defineCLIP_CODE_SE0x0006
#defineCLIP_CODE_NW0x0009
#defineCLIP_CODE_SW0x0005
intxcO=xO,ycO=yO,xcl=xl,ycl=yl;
intmin_clip_x=100/min_clip_y=100,max_clip_x=300,max_clip_y=300;
intpO_code=0zpl_code=0;
〃确定各个顶点所在的位置代码
if(yO<min_clip_y)
pO_code|=CLIP_CODE_N;
elseif(yO>max_clip_y)
pO_code|=CLIP_CODE_S;
if(xO<min_clip_x)
pO_code|=CLIP_CODE_W;
elseif(xO>max_clip_x)
pO_code|=CLIP_CODE_E;
if(yl<min_clip_y)
pl_code|=CLIP_CODE_N;
elseif(yl>max_clip_y)
pl_code|=CLIP_CODE_S;
if(xl<min_clip_x)
pl_code|=CLIP_CODE_W;
elseif(xl>max_clip_x)
pl_code|=CLIP_CODE_E;
〃先检测一些简单的情况
if(pO_code&pl_code)〃有相同的位置代码,表示在裁剪区外部
return0;
if(p0_code==0&&pl_code==0)〃表示两个点都在裁更区内,不需要裁剪
return1;
〃判断第一个点的位置代码
switch(pO_code)
(
caseCLIP_CODE_C:
break;
caseCLIP_CODE_N:
ycO=min_clip_y;
xcO=xO+0.5+(ycO-yO)*(xl-xO)/(yl-yO);
break;
)
caseCLIP_CODE_S:
(
ycO=max_clip_y;
xcO=xO+0.5+(ycO-yO)*(xl-xO)/(yl-yO);
break;
)
caseCLIP_CODE_W:
(
xcO=min_clip_x;
yc0=y0+0.5+(xc0-x0)*(yl-y0)/(xl-x0);
break;
)
caseCLIP_CODE_E:
(
xcO=max_clip_x;
ycO=yO+O.5+(xcO-xO)*(yl-yO)/(xl-xO);
break;
)
caseCLIP_CODE_NE:
(
ycO=min_clip_y;
xcO=xO+0.5+(ycO-yO)*(xl-xO)/(yl-yO);
if(xcO<min_clip_x||xcO>max_clip_x)
(
xcO=max_clip_x;
ycO=yO+O.5+(xcO-xO)*(yl-yO)/(xl-xO);
)
break;
)
caseCLIP_CODE_SE:
(
ycO=max_clip_y;
xcO=xO+0.5+(ycO-yO)*(xl-xO)/(yl-yO);
if(xcO<min_clip_x11xcO>max_clip_x)
(
xcO=max_clip_x;
ycO=yO+O.5+(xcO-xO)*(yl-yO)/(xl-xO);
)
break;
)
caseCLIPCODENW:
ycO=min_clip_y;
xcO=xO+0.5+(ycO-yO)*(xl-xO)/(yl-yO);
if(xcO<min_clip_x||xcO>max_clip_x)
{
xcO=min_clip_x;
ycO=yO+O.5+(xcO-xO)*(yl-yO)/(xl-xO);
)
break;
)
caseCLIP_CODE_SW:
(
ycO=max_clip_y;
xcO=xO+0.5+(ycO-yO)*(xl-xO)/(yl-yO);
if(xcO<min_clip_x||xcO>max_clip_x)
{
xcO=min_clip_x;
ycO=yO+O.5+(xcO-xO)*(yl-yO)/(xl-xO);
)
break;
)
default:
break;
}//endswitch(pO_code)
〃判断第二个点的位置代码
switch(pl_code)
(
caseCLIP_CODE_C:
break;
caseCLIP_CODE_N:
(
ycl=min_clip_y;
xcl=xl+0.5+(ycl-yl)*(xl-xO)/(yl-yO);
break;
)
caseCLIP_CODE_S:
ycl=max_clip_y;
xcl=xl+0.5+(ycl-yl)*(xl-xO)/(yl-yO);
break;
)
caseCLIP_CODE_W:
(
xcl=min_clip_x;
ycl=yl+0.5+(xcl-xl)*(yl-y0)/(xl-x0);
break;
)
caseCLIP_CODE_E:
(
xcl=max_clip_x;
ycl=yl+0.5+(xcl-xl)*(yl-y0)/(xl-x0);
break;
)
caseCLIP_CODE_NE:
(
ycl=min_clip_y;
xcl=xl+0.5+(ycl-yl)*(xl-x0)/(yl-y0);
if(xcl<min_clip_x11xcl>max_clip_x)
(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 综合素养提升教育与实践相结合的策略探讨
- 二零二五年度智慧城市建设项目资金入股合同
- 二零二五年度知识产权共享与能源结构调整合同
- 2025年度环保产业股权收购意向书
- 2025年度环保产业员工劳动合同模版版
- 职场中如何平衡工作与家庭维护员工心理健康
- 宏观经济波动下的企业财务风险管理
- 艺术教育实践中的学生能力培养
- 采购过程中的风险管理及应对措施汇报
- 科技与艺术的完美结合-现代宴会厅设计探索
- 物业客服沟通技巧培训课件
- 设备本质安全课件
- 工程造价咨询服务方案(技术方案)
- 整体租赁底商运营方案(技术方案)
- 常用药物作用及副作用课件
- 小学生作文方格纸A4纸直接打印版
- 老人心理特征和沟通技巧
- 幼儿阿拉伯数字描红(0-100)打印版
- 标杆地产集团 研发设计 工程管理 品质地库标准研发成果V1.0
- 2023年1月浙江高考英语听力试题及答案(含MP3+录音原文)
- HI-IPDV10芯片产品开发流程V10宣课件
评论
0/150
提交评论