




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
〃DDA畫直線響應(yīng)函數(shù)
voidCLine_ScanView::OnLineDda()
(
//TODO:在此添加命令處理程序代碼
LineI;
LDoModal();
DDALine(l.xlJ.ylJ.x2,l.y2,NULL);
)
〃Bresenham畫直線響應(yīng)函數(shù)
voidCLine_ScanView::OnLineBresenham()
(
//TODO:在此添加命令處理程序代碼
LineI;
LDoModal();
BresenhamLine(l.xlJ.yl,l.x2,l.y2,NULL);
}
〃中點(diǎn)Bresenham而直線響應(yīng)函數(shù)
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;
)
)
)
//中點(diǎn)畫圓響應(yīng)函數(shù)
voidCLine_ScanView::OnCixleMidbresenham()
{
//TODO:在此添加命令處理程序代碼
Circlec;
c.DoModal();
MidBresenhamCircle(c.r,NULL);
)
//中點(diǎn)畫圓算法
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++;
)
}
〃中點(diǎn)畫橢圓響應(yīng)函數(shù)
voidCLine_ScanView::OnEllipseMidbresenham()
(
//TODO:在此添加命令處理程序代碼
TuoYuanty;
ty.DoModal();
MidBresenhamEllipse代.ya,ty.b,NULL);
)
//中點(diǎn)畫橢圓算法
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);
)
//多邊形的掃描轉(zhuǎn)換響應(yīng)函數(shù)
voidCLine_ScanView::OnPolygonScan()
(
//TODO:在此添加命令處理程序代碼
CDC*pDC=GetDC();
constintPOINTNUM=6;〃多邊形點(diǎn)數(shù).
/******定義結(jié)構(gòu)體用于活性邊表AET和新邊表
NET***********************************/
typedefstructXET
(
floatx;
floatdx,ymax;
XET*next;
}AET,NET;
/"****定義點(diǎn)結(jié)構(gòu)體pQjp^******??***?*?*?*?*?***?*****??*?*********************I
structpoint
(
floatx;
floaty;
}polypoint[POINTNUM]={250,50,550,150,550,400,250,250,100,350,100,100};〃多邊形頂點(diǎn)
//mypoint[POINTNUM]={100,100,200,100,200,200,100/200};//iEZj^
*****計(jì)算最高點(diǎn)的y坐標(biāo)(掃描到此結(jié)束)**********,****************************
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++)
//計(jì)算新的交點(diǎn)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;
)
//(改進(jìn)算法)先從AET表中刪除ymax==i的結(jié)點(diǎn)
****************************************/
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中的新點(diǎn)加入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;〃考慮端點(diǎn)情況
)
)
)
//多邊形的4種子填充響應(yīng)函數(shù)
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種子填充響應(yīng)函數(shù)
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);
)
}
//二維變換的比例變換響應(yīng)函數(shù)
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();
)
//二維變換的旋轉(zhuǎn)變換響應(yīng)函數(shù)
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),//一個點(diǎn)
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),〃一個點(diǎn)
a[i][0]*sin((t/6)*1.0)+a[i][l]*cos((t/6)*1.0));
)
penl.DeleteObject();
)
//二維變換的錯切變換響應(yīng)函數(shù)
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();
//二維變換的對稱變換響應(yīng)函數(shù)
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;
個點(diǎn)
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();
)
//一維變換的平移變換響應(yīng)函數(shù)
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();
)
//三維變換的比例變換響應(yīng)函數(shù)
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();
)
//三維變換的旋轉(zhuǎn)變換響應(yīng)函數(shù)
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),〃一個點(diǎn)
a[i][0]*sin((t/6)*1.0)+a[i][l]*cos((t/6)*1.0));
)
penl.DeleteObject();
pen2.DeleteObject();
)
//三維變換的錯切變換響應(yīng)函數(shù)
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();
)
//二維變換的對稱變換響應(yīng)函數(shù)
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();
)
//三維變換的平移變換響應(yīng)函數(shù)
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裁剪算法的響應(yīng)函數(shù)
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);
)
)
//直線段中點(diǎn)分割算法的響應(yīng)函數(shù)
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;
〃確定各個頂點(diǎn)所在的位置代碼
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)〃有相同的位置代碼,表示在裁剪區(qū)外部
return0;
if(p0_code==0&&pl_code==0)〃表示兩個點(diǎn)都在裁更區(qū)內(nèi),不需要裁剪
return1;
〃判斷第一個點(diǎn)的位置代碼
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)
〃判斷第二個點(diǎn)的位置代碼
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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出口碗碟采購合同范本
- 業(yè)務(wù)代表合同范本
- Unit 2 SectionA(1a~1e)教學(xué)設(shè)計(jì)- 2024-2025學(xué)年人教版(2024)七年級英語下冊
- 2024年招商銀行唐山分行社會招聘考試真題
- 出租稻田土地合同范本
- 2024年咸陽市實(shí)驗(yàn)中學(xué)教師招聘筆試真題
- 借款公證合同范本
- 買車退款合同范本
- 住建備案合同范本
- 分包轉(zhuǎn)讓合同范本
- 以工代賑政策培訓(xùn)課件
- 垃圾分類校本教材
- 中職學(xué)生開學(xué)心理知識講座
- 虛擬現(xiàn)實(shí)技術(shù)中的智能感知與識別技術(shù)應(yīng)用
- DD 2014-11 地面沉降干涉雷達(dá)數(shù)據(jù)處理技術(shù)規(guī)程
- 咖啡與茶文化培訓(xùn)1
- 一+《展示國家工程++了解工匠貢獻(xiàn)》(教學(xué)課件)-【中職專用】高二語文精講課堂(高教版2023·職業(yè)模塊)
- DIY服裝營銷計(jì)劃書
- 全國教育科學(xué)規(guī)劃課題申報(bào)書:71.《教師在教育數(shù)字化轉(zhuǎn)型中的作用及其實(shí)現(xiàn)路徑研究》
- 非標(biāo)設(shè)備合同范本
- 訂單采購模板
評論
0/150
提交評論