图形学实验之二维图形变换

1、 程序由CcgGJ2Dtrans、CcgGJ2DtransDoc、CcgGJ2DtransView、CCgtransControl、CMainFrm类构成,下图为示意图。

 

2、 classCcgGJ2DtransDoc :

(1)  在此类中定义与CCgtransControl的按钮的变量值

l  BOOL m_selfRotate;

boolm_ClipPolygon;

int  m_transDir,m_transMode,m_transSelect;

 

(2)  定义窗口及图形的顶点

l  int x1,y1,x2,y2;  // Line

l  int x[6],y[6];    // Polygon

l  int NEWx[6],NEWy[6];    // Polygon

l  int m_window[4];  // Window

(3)  定义图形变换矩阵

float  m_lineTransMatrix[3][2],

m_polygonTransMatrix[3][2],

m_polygonNEWTransMatrix[3][2];

 

(4)  定义图形裁剪后的信息

l  int cx1,cy1,cx2,cy2;     // Line Clip Buffer

l  int cn, cx[36],cy[36];   // Polygon Clip Buffer

l  int NEWcn, NEWcx[36],NEWcy[36];    // Polygon Clip Buffer

l  BOOL m_lineVisible,m_polygonVisible,m_polygonNEWVisible;

 

(5)  初始化参数

l  绘制图形的顶点信息

l      m_ClipPolygon= m_selfRotate = FALSE; // F: Axis  T: Self

l      m_transDir= 0;      //0:-X  1:+X  2:-Y 3:+Y

l      m_transMode= 0;     //0:Translate  1:rotate  2:scale

l      m_transSelect= 0;   //0:Line       1:Polygon

l  变换矩阵为单位矩阵

 

3、 classCcgGJ2DtransView

(1)     窗口大小

intm_wndWidth;

intm_wndHeight;

(2)     旋转中点

float lcx,lcy,

(3)     视口信息

floatvx1,vy1,vx2,vy2;

floatvx[6],vy[6];

floatNEWvx[6],NEWvy[6];

(4)     功能函数说明

a)  计算变换后图形顶点的函数

void TransformLine();

void TransformPolygon();

void TransformPolygonNEW();

void TransformWindow();

b)   计算变换矩阵

void CalculatMatrix(float transMatrix[3][2]);

void CalculatPolygonNEWMatrix();

void ScaleMatrix(float SX, float SY, float transMatrix[3][2]);

void RotateMatrix(float S, float C, float transMatrix[3][2]);

void TranslateMatrix(float DX, float DY, float transMatrix[3][2]);

c)   计算图形的重点

void LineCenter();

void PolygonCenter();

void PolygonNEWCenter();

d)   裁剪图形相关函数

l  直线裁剪 返回值0:不可见;1:可见

int ClipLine(int *x1, int *y1, int *x2, int *y2);

l   判断直线是否在窗口内是否可见,返回值0:不可见;1:可见

int LineVisible(int *x1, int *y1, int *x2, int *y2);

l  为每个顶点编码 返回值为每个顶点的码

int pCode(int*x, int *y);

l  裁剪多边形

int ClipPolygon(int n, int *x, int *y, int *cn, int cx[], int cy[]);

l  判断直线是否横穿窗口边界

int LineCross(int x1, int y1, int x2, int y2, int i);

l  判断(x,y)点对第i条边是否可见 返回值 0:不可见;1:可见

int pVisible(int x, int y, int i);

l  求(sx,sy)、(px,py)与第i条窗口边界的交点

void interSect(int Sx, int  Sy, int Px, int Py, int  i, int *ix, int *iy);

l  输出顶点

void outPut(intx, int y, int*Nout, int *tempX, int*tempY);

 

 

4、 classCCgtransControl 中的参数介绍

(1)    定义ComboBox,与下拉菜单建立联系

l  CComboBox   m_transSelect;

(2)    函数说明

绘制视图窗口的图形

void viewTransLine(CRect dcRect);

void viewTransPolygonNEW(CRectdcRect);

void viewTransPolygon(CRect dcRect);

 

5、 classCMainFrame 中的参数介绍

(1)    定义窗口分割条

l  CSplitterWnd     m_wndSplitter;

 

 相关程序

view。cpp



void CcgGJ2DtransView::OnDraw(CDC* pDC)
{
CcgGJ2DtransDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;


// Draw XY Axis
pDC->MoveTo(          0,   m_wndHeight/2);
pDC->LineTo(m_wndWidth,    m_wndHeight/2);
pDC->MoveTo(m_wndWidth/2,              0);
pDC->LineTo(m_wndWidth/2,    m_wndHeight);


// First calculate transform matrix
switch (pDoc->m_transSelect) {
case 0: // Line
CalculatMatrix(pDoc->m_lineTransMatrix);
break;
case 1: // Polygon1
CalculatMatrix(pDoc->m_polygonTransMatrix);
break;
case 2: // Polygon2
CalculatMatrix(pDoc->m_polygonNEWTransMatrix);
break;
case 3: // window
TransformWindow();
break;
}


// Draw window
pDC->MoveTo(m_wndWidth/2 + pDoc->m_window[0], m_wndHeight/2 - pDoc->m_window[3]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[1], m_wndHeight/2 - pDoc->m_window[3]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[1], m_wndHeight/2 - pDoc->m_window[2]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[0], m_wndHeight/2 - pDoc->m_window[2]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[0], m_wndHeight/2 - pDoc->m_window[3]);
// Second transform Line and polygon
TransformLine();
TransformPolygon();
TransformPolygonNEW();


// Draw Line and polygon on space.
pDC->MoveTo(m_wndWidth/2 + vx1, m_wndHeight/2 - vy1);
pDC->LineTo(m_wndWidth/2 + vx2, m_wndHeight/2 - vy2);


pDC->MoveTo(m_wndWidth/2 + vx[0], m_wndHeight/2 - vy[0]);
for (int i = 1; i < 6; i++)
pDC->LineTo(m_wndWidth/2 + vx[i], m_wndHeight/2 - vy[i]);


pDC->MoveTo(m_wndWidth/2 + NEWvx[0], m_wndHeight/2 - NEWvy[0]);
for (int i = 1; i < 6; i++)
pDC->LineTo(m_wndWidth/2 + NEWvx[i], m_wndHeight/2 - NEWvy[i]);


pDoc->m_lineVisible = false;
pDoc->cx1 = (int)(vx1+0.5);    pDoc->cy1 = (int)(vy1+0.5);
pDoc->cx2 = (int)(vx2+0.5);    pDoc->cy2 = (int)(vy2+0.5);


if (ClipLine(&pDoc->cx1, &pDoc->cy1, &pDoc->cx2, &pDoc->cy2))
{
CPen newPen;
CPen *oldPen;


// Create new color pen to Draw Clipping Line
newPen.CreatePen(PS_SOLID, 2, RGB(200, 20, 255) );
oldPen = (CPen *)pDC->SelectObject(&newPen);


pDC->MoveTo(pDoc->cx1+m_wndWidth/2, m_wndHeight/2-pDoc->cy1);
pDC->LineTo(pDoc->cx2+m_wndWidth/2, m_wndHeight/2-pDoc->cy2);


pDC->SelectObject(oldPen);
newPen.DeleteObject();


pDoc->m_lineVisible = true; 


}


if (pDoc->m_ClipPolygon == false)
{


int vvx[12],vvy[12];


for (int i = 0; i < 6; i++) {
vvx[i] = (int)(vx[i]+0.5);
vvy[i] = (int)(vy[i]+0.5);
}


pDoc->m_polygonVisible = false;


if (ClipPolygon(6, vvx, vvy, &pDoc->cn, pDoc->cx, pDoc->cy)) 


{
CPen newPen;
CPen *oldPen;


// Create new color pen to Draw Clipping Line
newPen.CreatePen(PS_SOLID, 2,  RGB(255, 0, 100));
oldPen = (CPen *)pDC->SelectObject(&newPen);


pDC->MoveTo(pDoc->cx[0]+m_wndWidth/2, m_wndHeight/2-pDoc->cy[0]);
for (int i = 1; i < pDoc->cn; i++) 
pDC->LineTo(pDoc->cx[i]+m_wndWidth/2, m_wndHeight/2-pDoc->cy[i]);


pDC->SelectObject(oldPen);
newPen.DeleteObject();


pDoc->m_polygonVisible = true; 
}






int NEWvvx[12],NEWvvy[12];


for (int i = 0; i < 6; i++) {
NEWvvx[i] = (int)(NEWvx[i]+0.5);
NEWvvy[i] = (int)(NEWvy[i]+0.5);
}


pDoc->m_polygonNEWVisible = false;


if (ClipPolygon(6, NEWvvx, NEWvvy, &pDoc->NEWcn, pDoc->NEWcx, pDoc->NEWcy)) 


{
CPen newPen;
CPen *oldPen;


// Create new color pen to Draw Clipping Line
newPen.CreatePen(PS_SOLID, 2,  RGB(0, 100, 200));
oldPen = (CPen *)pDC->SelectObject(&newPen);


pDC->MoveTo(pDoc->NEWcx[0]+m_wndWidth/2, m_wndHeight/2-pDoc->NEWcy[0]);
for (int i = 1; i < pDoc->NEWcn; i++) 
pDC->LineTo(pDoc->NEWcx[i]+m_wndWidth/2, m_wndHeight/2-pDoc->NEWcy[i]);


pDC->SelectObject(oldPen);
newPen.DeleteObject();


pDoc->m_polygonNEWVisible = true; 
}
}
//polygons clip
else
{
InitCpandSp(pDoc->cx,pDoc->cy,pDoc->cn,pDoc->NEWcx,pDoc->NEWcy,pDoc->NEWcn);
ClipPolygoneach(cp,cpNumber,sp,spNumber);


}
pDoc->UpdateAllViews(this);



}
void CcgGJ2DtransView::ClipPolygoneach(struct point cp[],int cpNumber,struct point sp[],int spNumber)
{
InsertNewLine(cp,sp,cpnew,spnew);


}


/*


void CClipPolyon::OutJd1(point *p3,point *p4,point *Q,point *inout)
{
int i=1;
int j=1;
ct=1;
int n=0;


command:
if(i<ct3)   
{   
if(p3[i].flag==1) 
{


inout[0].x=p3[i].x;
inout[0].y=p3[i].y;
inout[0].flag=p3[i].flag;


p3[i].flag=0;
Q[ct].x=p3[i].x;
Q[ct].y=p3[i].y;


ct++;
i++;
goto Q3;
}
else
{
i++;
goto command;
}
}
else
goto End;




Q3:
if(i==ct3)
i=1;
if(p3[i].flag!=-1)
{
Q[ct].x=p3[i].x;
Q[ct].y=p3[i].y;


ct++;
i++;


goto Q3;
}
else
goto Q4;


Q4:
for(j=1;j<ct4;j++)
{
if(p4[j].x==p3[i].x&&p4[j].y==p3[i].y&&p4[j].flag==p3[i].flag)
{
Q[ct].x=p4[j].x;
Q[ct].y=p4[j].y;
j++;
ct++;


goto Q5;
}
}


Q5:
if(j==ct4)
j=1;
if(p4[j].flag!=1)
{
Q[ct].x=p4[j].x;
Q[ct].y=p4[j].y;


j++;
ct++;


goto Q5;
}
else
{
if(p4[j].x==inout[0].x&&p4[j].y==inout[0].y&&p4[j].flag==1)
{


i=1;
j=1;


// Drawpoly(Q,ct,x0,y0,pDC);
// ct=1;
n++;
if(n==1)
ctt1=ct-1;
else if(n==2)
ctt2=ct-1;
else if(n==3)
ctt3=ct-1;
goto command;
}
else
goto Q6;
}


Q6:
for(i=1;i<ct3;i++)
{
if(p3[i].x==p4[j].x&&p3[i].y==p4[j].y&&p3[i].flag==p4[j].flag)
{
p3[i].flag=0;
Q[ct].x=p3[i].x;
Q[ct].y=p3[i].y;


ct++;
i++;


goto Q3;
}
}
End:   


{}
}




*/
void CcgGJ2DtransView::InitCpandSp( int cxp[], int cyp[], int cpNumber,int sxp[], int syp[], int spNumber)
{
this->cpNumber = cpNumber;
this->spNumber = spNumber;


for (int i = 0 ; i < cpNumber ; i++)
{
cp[i].x = cxp[i];
cp[i].y = cyp[i];
cp[i].flag = 0;
}


for (int i = 0 ; i < spNumber ; i++)
{
sp[i].x = sxp[i];
sp[i].y = syp[i];
sp[i].flag = 0;
}

while(!outPoint.empty())outPoint.pop();


}
//求交点
void CcgGJ2DtransView::InsertNewLine(point *p1,point *p2,point *p3,point *p4)
{
int i,j;
int m,n;
int count;


cpnewNumber=1;


for(i=0;i<cpNumber;i++)
{
count=1;


p3[cpnewNumber].x=p1[i].x;
p3[cpnewNumber].y=p1[i].y;
p3[cpnewNumber].flag=p1[i].flag;
cpnewNumber++;


for(j=0;j<spNumber;j++)
{
if(IsLineSegmentCross(p1[i],p1[i+1],p2[j],p2[j+1]))
{
GetCrossPoint(p1[i],p1[i+1],p2[j],p2[j+1]);
InOut[count].x=q[0].x;
InOut[count].y=q[0].y;
InOut[count].flag=q[0].flag;


count++;
}
}


if(p1[i].x<p1[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x>InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}
else if(p1[i].x>p1[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x<InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}


for(m=1;m<count;m++)
{
p3[cpnewNumber].x=InOut[m].x;
p3[cpnewNumber].y=InOut[m].y;
p3[cpnewNumber].flag=InOut[m].flag;


cpnewNumber++;
}
}


spnewNumber=1;
for(i=0;i<spNumber;i++)
{
count=1;
p4[spnewNumber].x=p2[i].x;
p4[spnewNumber].y=p2[i].y;
p4[spnewNumber].flag=p2[i].flag;
spnewNumber++;


for(j=0;j<cpNumber;j++)
{
if(IsLineSegmentCross(p1[j],p1[j+1],p2[i],p2[i+1]))
{
GetCrossPoint(p1[j],p1[j+1],p2[i],p2[i+1]);
InOut[count].x=q[0].x;
InOut[count].y=q[0].y;
InOut[count].flag=q[0].flag;


count++;
}
}


if(p2[i].x<p2[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x>InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}
else if(p2[i].x>p2[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x<InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}


for(m=1;m<count;m++)
{
p4[spnewNumber].x=InOut[m].x;
p4[spnewNumber].y=InOut[m].y;
p4[spnewNumber].flag=InOut[m].flag;


spnewNumber++;
}
}


}


/*求交点*/
void CcgGJ2DtransView::GetCrossPoint(point p1,point p2,point p3,point p4)
{
double dx1,dy1,dx2,dy2,p;

dx1=p2.x-p1.x; dy1=p2.y-p1.y;
dx2=p4.x-p3.x; dy2=p4.y-p3.y;
/*针对多边形点顺时针方向*/
//公式对于向量(x1,y1)->(x2,y2),判断点(x3,y3)在向量的左边,右边,还是线上.
//p=x1(y3-y2)+x2(y1-y3)+x3(y2-y1).p<0 左侧, p=0 线上, p>0 右侧
p=dx1*dy2-dy1*dx2;
if(p>0)
q[0].flag=1;//入点
else if(p<0)
q[0].flag=-1;//出点
else if(p==0)
q[0].flag=0;//交点在裁剪多边形的边上

/*求交点*/
q[0].x=((p1.y-p3.y)*dx1*dx2-p1.x*dy1*dx2+p3.x*dy2*dx1)/(dy2*dx1-dy1*dx2);
q[0].y=p1.y+(q[0].x-p1.x)*dy1/dx1;
}
/*判断两线段是否有交点*/
bool CcgGJ2DtransView::IsLineSegmentCross(point p1,point p2,point p3,point p4)
{
double X1max,Y1max,X1min,Y1min;
double X2max,Y2max,X2min,Y2min;
double dx1,dy1,dx2,dy2;


if(p1.x<p2.x)
{
X1max=p2.x;
X1min=p1.x;
}
else
{
X1max=p1.x;
X1min=p2.x;
}


if(p1.y<p2.y)
{
Y1max=p2.y;
Y1min=p1.y;
}
else
{
Y1max=p1.y;
Y1min=p2.y;
}


if(p3.x<p4.x)
{
X2max=p4.x;
X2min=p3.x;
}
else
{
X2max=p3.x;
X2min=p4.x;
}


if(p3.y<p4.y)
{
Y2max=p4.y;
Y2min=p3.y;
}
else
{
Y2max=p3.y;
Y2min=p4.y;
}


if(X1max<X2min||Y1max<Y2min||X1min>X2max||Y1min>Y2max)
return false;
else
{
dx1=p1.x-p2.x; dx2=p3.x-p4.x;
dy1=p1.y-p2.y; dy2=p3.y-p4.y;


if(Fxy(dx1,dy1,p1.x,p1.y,p3.x,p3.y,p4.x,p4.y)<=0&&Fxy(dx2,dy2,p3.x,p3.y,p1.x,p1.y,p2.x,p2.y)<=0)
return true;
else
return false;
}
}
double CcgGJ2DtransView::Fxy(double dx,double dy,double px,double py,double x1,double y1,double x2,double y2)
{
double ff;


ff=(dx*(y1-py)-dy*(x1-px))*(dx*(y2-py)-dy*(x2-px));


return ff;
}


// CcgGJ2DtransView 打印




void CcgGJ2DtransView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
AFXPrintPreview(this);
#endif
}


BOOL CcgGJ2DtransView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}


void CcgGJ2DtransView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}


void CcgGJ2DtransView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}


void CcgGJ2DtransView::OnRButtonUp(UINT /* nFlags */, CPoint point)
{
ClientToScreen(&point);
OnContextMenu(this, point);
}


void CcgGJ2DtransView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
{
#ifndef SHARED_HANDLERS
theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
#endif
}




// CcgGJ2DtransView 诊断


#ifdef _DEBUG
void CcgGJ2DtransView::AssertValid() const
{
CView::AssertValid();
}


void CcgGJ2DtransView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}


CcgGJ2DtransDoc* CcgGJ2DtransView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CcgGJ2DtransDoc)));
return (CcgGJ2DtransDoc*)m_pDocument;
}
#endif //_DEBUG




// CcgGJ2DtransView 消息处理程序




void CcgGJ2DtransView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);


m_wndHeight = cy;
m_wndWidth  = cx;
// TODO: 在此处添加消息处理程序代码
}




void CcgGJ2DtransView::LineCenter()
{


float maxX,maxY,minX,minY;


maxX = maxY = -5000;
minX = minY = 50000;


if (vx1 < minX) minX = vx1;
if (vx1 > maxX) maxX = vx1;
if (vx2 < minX) minX = vx2;
if (vx2 > maxX) maxX = vx2;
if (vy1 < minY) minY = vy1;
if (vy1 > maxY) maxY = vy1;
if (vy2 < minY) minY = vy2;
if (vy2 > maxY) maxY = vy2;


lcx = (maxX + minX) / 2.0f;
lcy = (maxY + minY) / 2.0f;
}


void CcgGJ2DtransView::PolygonCenter()
{
float maxX,maxY,minX,minY;


maxX = maxY = -5000;
minX = minY = 50000;


for (int i = 0; i < 6; i++) {
if (vx[i] < minX) minX = vx[i];
if (vx[i] > maxX) maxX = vx[i];
if (vy[i] < minY) minY = vy[i];
if (vy[i] > maxY) maxY = vy[i];
}
lcx = (maxX + minX) / 2.0f;
lcy = (maxY + minY) / 2.0f;
}
void CcgGJ2DtransView::PolygonNEWCenter()
{
float maxX,maxY,minX,minY;


maxX = maxY = -5000;
minX = minY = 50000;


for (int i = 0; i < 6; i++) {
if (NEWvx[i] < minX) minX = NEWvx[i];
if (NEWvx[i] > maxX) maxX = NEWvx[i];
if (NEWvy[i] < minY) minY = NEWvy[i];
if (NEWvy[i] > maxY) maxY = NEWvy[i];
}
lcx = (maxX + minX) / 2.0f;
lcy = (maxY + minY) / 2.0f;
}




// Please perfect the CalculatMatrix() for Scale transform part !!!


void CcgGJ2DtransView::CalculatMatrix(float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


if (pDoc->m_selfRotate) {
if (pDoc->m_transSelect == 0) LineCenter();
else if (pDoc->m_transSelect == 1) PolygonCenter();
else if (pDoc->m_transSelect == 2) PolygonNEWCenter();
}
switch (pDoc->m_transDir) {
case 0:  // -X
if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(-10, 0, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(-sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale


ScaleMatrix(0.8,1,transMatrix);


}
break;
case 1: // +X
if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(10, 0, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale
ScaleMatrix(1.2,1,transMatrix);
}
break;
case 2: // -Y
if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(0, -10, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(-sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale


// Please fill in the right code (1 Lines) here ...
ScaleMatrix(1,0.8,transMatrix);
}
break;
case 3: // +Y


if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(0, 10, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale


// Please fill in the right code (1 Lines) here ...
ScaleMatrix(1,1.2,transMatrix);
}
break;  
}
}


void CcgGJ2DtransView::TransformLine()
{
CcgGJ2DtransDoc* pDoc = GetDocument();


vx1 = pDoc->x1 * pDoc->m_lineTransMatrix[0][0] +
pDoc->y1 * pDoc->m_lineTransMatrix[1][0] + pDoc->m_lineTransMatrix[2][0];
vy1 = pDoc->x1 * pDoc->m_lineTransMatrix[0][1] +
pDoc->y1 * pDoc->m_lineTransMatrix[1][1] + pDoc->m_lineTransMatrix[2][1];
vx2 = pDoc->x2 * pDoc->m_lineTransMatrix[0][0] +
pDoc->y2 * pDoc->m_lineTransMatrix[1][0] + pDoc->m_lineTransMatrix[2][0];
vy2 = pDoc->x2 * pDoc->m_lineTransMatrix[0][1] +
pDoc->y2 * pDoc->m_lineTransMatrix[1][1] + pDoc->m_lineTransMatrix[2][1];


}


void CcgGJ2DtransView::TransformPolygon()
{
CcgGJ2DtransDoc* pDoc = GetDocument();


for (int i = 0; i < 6; i++) {


vx[i] = pDoc->x[i] * pDoc->m_polygonTransMatrix[0][0] +
pDoc->y[i] * pDoc->m_polygonTransMatrix[1][0] + 
pDoc->m_polygonTransMatrix[2][0];
vy[i] = pDoc->x[i] * pDoc->m_polygonTransMatrix[0][1] +
pDoc->y[i] * pDoc->m_polygonTransMatrix[1][1] + 
pDoc->m_polygonTransMatrix[2][1];
}


}






void CcgGJ2DtransView::TransformPolygonNEW()
{
CcgGJ2DtransDoc* pDoc = GetDocument();


for (int i = 0; i < 6; i++) {


NEWvx[i] = pDoc->NEWx[i] * pDoc->m_polygonNEWTransMatrix[0][0] +
pDoc->NEWy[i] * pDoc->m_polygonNEWTransMatrix[1][0] + 
pDoc->m_polygonNEWTransMatrix[2][0];
NEWvy[i] = pDoc->NEWx[i] * pDoc->m_polygonNEWTransMatrix[0][1] +
pDoc->NEWy[i] * pDoc->m_polygonNEWTransMatrix[1][1] + 
pDoc->m_polygonNEWTransMatrix[2][1];
}


}
void CcgGJ2DtransView::TranslateMatrix(float DX, float DY, float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


transMatrix[2][0] = transMatrix[2][0] + DX;
transMatrix[2][1] = transMatrix[2][1] + DY;
}


void CcgGJ2DtransView::RotateMatrix(float S, float C, float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


float temp;


if (pDoc->m_selfRotate && pDoc->m_transSelect <= 1) TranslateMatrix(-lcx, -lcy, transMatrix);
for (int i = 0; i < 3; i++) {


// Please fill in the right code (3-5 Lines) here ...
temp = transMatrix[i][0];
transMatrix[i][0] = temp * C - transMatrix[i][1] * S; 
transMatrix[i][1] = temp * S + transMatrix[i][1] * C;
}
if (pDoc->m_selfRotate && pDoc->m_transSelect <= 1) TranslateMatrix(lcx, lcy, transMatrix);
}


void CcgGJ2DtransView::ScaleMatrix(float SX, float SY, float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


// Please fill in the right code (3-5 Lines) here ...
for (int i=0;i<3;i++)
{
transMatrix[i][0] = transMatrix[i][0] * SX;
transMatrix[i][1] = transMatrix[i][1] * SY;
}
}


int CcgGJ2DtransView::ClipLine(int *x1, int *y1, int *x2, int *y2)
{


int visible;
CcgGJ2DtransDoc* pDoc = GetDocument();


for (int i = 0; i < 4; i++) { // Along the WIN Border
visible = LineVisible(x1, y1, x2, y2);
if (visible == 1) return 1;              // Total Visible
if (visible == 0) return 0;              // Total unvisible
if (LineCross(*x1, *y1, *x2, *y2, i))
{  // If the line cross the window, 
// calculate intersect point.
if (i < 2 && *x2-*x1) 
{ // Left 0 , Right 1
float m = (float)(*y2-*y1)/(*x2-*x1);
float iy = m * (pDoc->m_window[i] - *x1) + *y1;
// Please fill in the right code (4-6 Lines) here ...


if (pVisible(*x1,*y1,i) == 0)
{
*x1 = pDoc->m_window[i];
*y1 = iy;

else if (pVisible(*x2,*y2,i) == 0)
{
*x2 = pDoc->m_window[i];
*y2 = iy;
}


}
else if (*y2-*y1)
{ // Top 3    Bottom 4
float m = (float)(*x2-*x1)/(*y2-*y1);
float ix = m * (pDoc->m_window[i] - *y1) + *x1;
// Please fill in the right code (4-6 Lines) here ...


if (pVisible(*x1,*y1,i) == 0)
{
*x1 = ix;
*y1 = pDoc->m_window[i];

else if (pVisible(*x2,*y2,i) == 0)
{
*x2 = ix;
*y2 = pDoc->m_window[i];
}
}
}
}
return 1;
}


int CcgGJ2DtransView::LineVisible(int *x1, int *y1, int *x2, int *y2)
{
int pcode1,pcode2;


pcode1 = pCode(x1, y1);    pcode2 = pCode(x2, y2);


if (!pcode1 && !pcode2) return 1;   // Visible
if (pcode1&pcode2)      return 0;   // Unvisible
if (!pcode1) {
float temp;
temp = *x1;  *x1= *x2;  *x2 = temp;
temp = *y1;  *y1= *y2;  *y2 = temp;
}
return 2;
}


int CcgGJ2DtransView::pCode(int *x, int *y)
{
int code = 0;
CcgGJ2DtransDoc* pDoc = GetDocument();


if (*x <= pDoc->m_window[0])  code |= 1;
if (*x >= pDoc->m_window[1])  code |= 2;
if (*y >= pDoc->m_window[2])  code |= 4;
if (*y <= pDoc->m_window[3])  code |= 8;


return code;
}


int CcgGJ2DtransView::ClipPolygon(int n, int *x, int *y, int *cn, int cx[], int cy[])
{
int Nin,Nout,ix,iy,Sx,Sy;
CcgGJ2DtransDoc* pDoc = GetDocument();


Nin = n;// 初始图形的顶点个数
for (int i = 0; i < 4; i++)
{        // Along the window border
*cn = 0;
for (int j = 0; j < Nin; j++) 
{  // Scan polygon every point and line.
if (j > 0) 
{
if (LineCross(Sx, Sy, x[j], y[j], i)) //x[i-1],y[i-1] and x[i],y[i] 与窗口边界是否有交点
{
interSect(Sx, Sy, x[j], y[j], i, &ix, &iy);
outPut(ix, iy, cn, cx, cy);
}
}
Sx = x[j];    Sy = y[j];
if (pVisible(Sx, Sy, i)) outPut(Sx, Sy, cn, cx, cy);
}


Nin = *cn;
if (*cn == 0) return 0;
for (int j = 0; j < Nin; j++) { x[j] = cx[j];    y[j] = cy[j]; }


if (cx[0] != cx[Nin-1] || cy[0] != cy[Nin-1])
{//起始点和终点的值相同


x[Nin] = x[0];
y[Nin] = y[0];
cx[Nin] = cx[0];
cy[Nin] = cy[0];
// if (cx[0] == cx[Nin-1]) cy[Nin] = cy[Nin-1];
// if (cy[0] == cy[Nin-1]) cx[Nin] = cx[Nin-1];
Nin++;         *cn = Nin;
}
}
return 1;
}
void CcgGJ2DtransView::TransformWindow()
{
CcgGJ2DtransDoc *pDoc = (CcgGJ2DtransDoc *)GetDocument();


switch(pDoc->m_transDir)
{
case 0:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[0]  = pDoc->m_window[0]  - 10;
pDoc->m_window[1] = pDoc->m_window[1] - 10;
break;
case 2:
if (pDoc->m_window[0] >= pDoc->m_window[1])break;
pDoc->m_window[0]  = pDoc->m_window[0]  + 10;
pDoc->m_window[1] = pDoc->m_window[1] - 10;
break;
}
break;
case 1:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[0]  = pDoc->m_window[0]  + 10;
pDoc->m_window[1] = pDoc->m_window[1] + 10;
break;
case 2:
if (pDoc->m_window[0]  >= pDoc->m_window[1])break;
pDoc->m_window[0]  = pDoc->m_window[0]  - 10;
pDoc->m_window[1] = pDoc->m_window[1] + 10;
break;
}
break;
case 2:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[2]   = pDoc->m_window[2]   - 10;
pDoc->m_window[3] = pDoc->m_window[3] - 10;
break;
case 2:
if (pDoc->m_window[2]  <= pDoc->m_window[3])break;
pDoc->m_window[2]   = pDoc->m_window[2]   - 10;
pDoc->m_window[3] = pDoc->m_window[3] + 10;
break;
}
break;
case 3:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[2]   = pDoc->m_window[2]   + 10;
pDoc->m_window[3] = pDoc->m_window[3] + 10;
break;
case 2:
if (pDoc->m_window[2] <= pDoc->m_window[3])break;
pDoc->m_window[2]   = pDoc->m_window[2]   + 10;
pDoc->m_window[3] = pDoc->m_window[3] - 10;
break;
}
break;
}
}
int CcgGJ2DtransView::LineCross(int x1, int y1, int x2, int y2, int i)
{
int visible1,visible2;


visible1 = pVisible(x1,y1,i);
visible2 = pVisible(x2,y2,i);


if (visible2 == visible1) return 0;
else                      return 1;


return 1;
}


int CcgGJ2DtransView::pVisible(int x, int y, int i)
{
int visible = 0;
CcgGJ2DtransDoc* pDoc = GetDocument();


switch (i) {
case 0: // Left
if (x >= pDoc->m_window[0])  visible = 1; break;
case 1: // Right
if (x <= pDoc->m_window[1])  visible = 1; break;
case 2: // Top
if (y <= pDoc->m_window[2])  visible = 1; break;
case 3: // Bottom
if (y >= pDoc->m_window[3])  visible = 1; break;
}
return visible;
}


void CcgGJ2DtransView::interSect(int Sx, int  Sy, int Px, int Py,
int  i, int *ix, int *iy)
//用 (ix,iy)返回直线(sx,sy)-(px,py)与window[i]的交点
{
CcgGJ2DtransDoc* pDoc = GetDocument();


switch (i) {
case 0: // Left
*ix = pDoc->m_window[0];
*iy = (int) ((float)((*ix - Px)*(Sy - Py)/(Sx - Px) + Py + 0.5));
// Please fill in the right code (2 Lines) here ...
break;
case 1: // Right
*ix = pDoc->m_window[1];
*iy = (int) ((float)((*ix - Px)*(Sy - Py)/(Sx - Px) + Py + 0.5));


// Please fill in the right code (2 Lines) here ...


break;
case 2: // Top'
*iy = pDoc->m_window[2];
*ix = (int) ((float)((*iy - Py)*(Sx - Px)/(Sy - Py) + Px + 0.5));


// Please fill in the right code (2 Lines) here ...


break;
case 3: // Bottom
// Please fill in the right code (2 Lines) here ...
*iy = pDoc->m_window[3];
*ix = (int) ((float)((*iy - Py)*(Sx - Px)/(Sy - Py) + Px + 0.5));


break;
}
}


void CcgGJ2DtransView::outPut(int x, int y, int *Nout, int *tempX, int *tempY)
{
tempX[*Nout] = x;
tempY[*Nout] = y;
(*Nout)++;
}

void CcgGJ2DtransView::OnDraw(CDC* pDC)
{
CcgGJ2DtransDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;


// Draw XY Axis
pDC->MoveTo(          0,   m_wndHeight/2);
pDC->LineTo(m_wndWidth,    m_wndHeight/2);
pDC->MoveTo(m_wndWidth/2,              0);
pDC->LineTo(m_wndWidth/2,    m_wndHeight);


// First calculate transform matrix
switch (pDoc->m_transSelect) {
case 0: // Line
CalculatMatrix(pDoc->m_lineTransMatrix);
break;
case 1: // Polygon1
CalculatMatrix(pDoc->m_polygonTransMatrix);
break;
case 2: // Polygon2
CalculatMatrix(pDoc->m_polygonNEWTransMatrix);
break;
case 3: // window
TransformWindow();
break;
}


// Draw window
pDC->MoveTo(m_wndWidth/2 + pDoc->m_window[0], m_wndHeight/2 - pDoc->m_window[3]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[1], m_wndHeight/2 - pDoc->m_window[3]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[1], m_wndHeight/2 - pDoc->m_window[2]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[0], m_wndHeight/2 - pDoc->m_window[2]);
pDC->LineTo(m_wndWidth/2 + pDoc->m_window[0], m_wndHeight/2 - pDoc->m_window[3]);
// Second transform Line and polygon
TransformLine();
TransformPolygon();
TransformPolygonNEW();


// Draw Line and polygon on space.
pDC->MoveTo(m_wndWidth/2 + vx1, m_wndHeight/2 - vy1);
pDC->LineTo(m_wndWidth/2 + vx2, m_wndHeight/2 - vy2);


pDC->MoveTo(m_wndWidth/2 + vx[0], m_wndHeight/2 - vy[0]);
for (int i = 1; i < 6; i++)
pDC->LineTo(m_wndWidth/2 + vx[i], m_wndHeight/2 - vy[i]);


pDC->MoveTo(m_wndWidth/2 + NEWvx[0], m_wndHeight/2 - NEWvy[0]);
for (int i = 1; i < 6; i++)
pDC->LineTo(m_wndWidth/2 + NEWvx[i], m_wndHeight/2 - NEWvy[i]);


pDoc->m_lineVisible = false;
pDoc->cx1 = (int)(vx1+0.5);    pDoc->cy1 = (int)(vy1+0.5);
pDoc->cx2 = (int)(vx2+0.5);    pDoc->cy2 = (int)(vy2+0.5);


if (ClipLine(&pDoc->cx1, &pDoc->cy1, &pDoc->cx2, &pDoc->cy2))
{
CPen newPen;
CPen *oldPen;


// Create new color pen to Draw Clipping Line
newPen.CreatePen(PS_SOLID, 2, RGB(200, 20, 255) );
oldPen = (CPen *)pDC->SelectObject(&newPen);


pDC->MoveTo(pDoc->cx1+m_wndWidth/2, m_wndHeight/2-pDoc->cy1);
pDC->LineTo(pDoc->cx2+m_wndWidth/2, m_wndHeight/2-pDoc->cy2);


pDC->SelectObject(oldPen);
newPen.DeleteObject();


pDoc->m_lineVisible = true; 


}


if (pDoc->m_ClipPolygon == false)
{


int vvx[12],vvy[12];


for (int i = 0; i < 6; i++) {
vvx[i] = (int)(vx[i]+0.5);
vvy[i] = (int)(vy[i]+0.5);
}


pDoc->m_polygonVisible = false;


if (ClipPolygon(6, vvx, vvy, &pDoc->cn, pDoc->cx, pDoc->cy)) 


{
CPen newPen;
CPen *oldPen;


// Create new color pen to Draw Clipping Line
newPen.CreatePen(PS_SOLID, 2,  RGB(255, 0, 100));
oldPen = (CPen *)pDC->SelectObject(&newPen);


pDC->MoveTo(pDoc->cx[0]+m_wndWidth/2, m_wndHeight/2-pDoc->cy[0]);
for (int i = 1; i < pDoc->cn; i++) 
pDC->LineTo(pDoc->cx[i]+m_wndWidth/2, m_wndHeight/2-pDoc->cy[i]);


pDC->SelectObject(oldPen);
newPen.DeleteObject();


pDoc->m_polygonVisible = true; 
}






int NEWvvx[12],NEWvvy[12];


for (int i = 0; i < 6; i++) {
NEWvvx[i] = (int)(NEWvx[i]+0.5);
NEWvvy[i] = (int)(NEWvy[i]+0.5);
}


pDoc->m_polygonNEWVisible = false;


if (ClipPolygon(6, NEWvvx, NEWvvy, &pDoc->NEWcn, pDoc->NEWcx, pDoc->NEWcy)) 


{
CPen newPen;
CPen *oldPen;


// Create new color pen to Draw Clipping Line
newPen.CreatePen(PS_SOLID, 2,  RGB(0, 100, 200));
oldPen = (CPen *)pDC->SelectObject(&newPen);


pDC->MoveTo(pDoc->NEWcx[0]+m_wndWidth/2, m_wndHeight/2-pDoc->NEWcy[0]);
for (int i = 1; i < pDoc->NEWcn; i++) 
pDC->LineTo(pDoc->NEWcx[i]+m_wndWidth/2, m_wndHeight/2-pDoc->NEWcy[i]);


pDC->SelectObject(oldPen);
newPen.DeleteObject();


pDoc->m_polygonNEWVisible = true; 
}
}
//polygons clip
else
{
InitCpandSp(pDoc->cx,pDoc->cy,pDoc->cn,pDoc->NEWcx,pDoc->NEWcy,pDoc->NEWcn);
ClipPolygoneach(cp,cpNumber,sp,spNumber);


}
pDoc->UpdateAllViews(this);



}
void CcgGJ2DtransView::ClipPolygoneach(struct point cp[],int cpNumber,struct point sp[],int spNumber)
{
InsertNewLine(cp,sp,cpnew,spnew);


}


/*


void CClipPolyon::OutJd1(point *p3,point *p4,point *Q,point *inout)
{
int i=1;
int j=1;
ct=1;
int n=0;


command:
if(i<ct3)   
{   
if(p3[i].flag==1) 
{


inout[0].x=p3[i].x;
inout[0].y=p3[i].y;
inout[0].flag=p3[i].flag;


p3[i].flag=0;
Q[ct].x=p3[i].x;
Q[ct].y=p3[i].y;


ct++;
i++;
goto Q3;
}
else
{
i++;
goto command;
}
}
else
goto End;




Q3:
if(i==ct3)
i=1;
if(p3[i].flag!=-1)
{
Q[ct].x=p3[i].x;
Q[ct].y=p3[i].y;


ct++;
i++;


goto Q3;
}
else
goto Q4;


Q4:
for(j=1;j<ct4;j++)
{
if(p4[j].x==p3[i].x&&p4[j].y==p3[i].y&&p4[j].flag==p3[i].flag)
{
Q[ct].x=p4[j].x;
Q[ct].y=p4[j].y;
j++;
ct++;


goto Q5;
}
}


Q5:
if(j==ct4)
j=1;
if(p4[j].flag!=1)
{
Q[ct].x=p4[j].x;
Q[ct].y=p4[j].y;


j++;
ct++;


goto Q5;
}
else
{
if(p4[j].x==inout[0].x&&p4[j].y==inout[0].y&&p4[j].flag==1)
{


i=1;
j=1;


// Drawpoly(Q,ct,x0,y0,pDC);
// ct=1;
n++;
if(n==1)
ctt1=ct-1;
else if(n==2)
ctt2=ct-1;
else if(n==3)
ctt3=ct-1;
goto command;
}
else
goto Q6;
}


Q6:
for(i=1;i<ct3;i++)
{
if(p3[i].x==p4[j].x&&p3[i].y==p4[j].y&&p3[i].flag==p4[j].flag)
{
p3[i].flag=0;
Q[ct].x=p3[i].x;
Q[ct].y=p3[i].y;


ct++;
i++;


goto Q3;
}
}
End:   


{}
}




*/
void CcgGJ2DtransView::InitCpandSp( int cxp[], int cyp[], int cpNumber,int sxp[], int syp[], int spNumber)
{
this->cpNumber = cpNumber;
this->spNumber = spNumber;


for (int i = 0 ; i < cpNumber ; i++)
{
cp[i].x = cxp[i];
cp[i].y = cyp[i];
cp[i].flag = 0;
}


for (int i = 0 ; i < spNumber ; i++)
{
sp[i].x = sxp[i];
sp[i].y = syp[i];
sp[i].flag = 0;
}

while(!outPoint.empty())outPoint.pop();


}
//求交点
void CcgGJ2DtransView::InsertNewLine(point *p1,point *p2,point *p3,point *p4)
{
int i,j;
int m,n;
int count;


cpnewNumber=1;


for(i=0;i<cpNumber;i++)
{
count=1;


p3[cpnewNumber].x=p1[i].x;
p3[cpnewNumber].y=p1[i].y;
p3[cpnewNumber].flag=p1[i].flag;
cpnewNumber++;


for(j=0;j<spNumber;j++)
{
if(IsLineSegmentCross(p1[i],p1[i+1],p2[j],p2[j+1]))
{
GetCrossPoint(p1[i],p1[i+1],p2[j],p2[j+1]);
InOut[count].x=q[0].x;
InOut[count].y=q[0].y;
InOut[count].flag=q[0].flag;


count++;
}
}


if(p1[i].x<p1[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x>InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}
else if(p1[i].x>p1[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x<InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}


for(m=1;m<count;m++)
{
p3[cpnewNumber].x=InOut[m].x;
p3[cpnewNumber].y=InOut[m].y;
p3[cpnewNumber].flag=InOut[m].flag;


cpnewNumber++;
}
}


spnewNumber=1;
for(i=0;i<spNumber;i++)
{
count=1;
p4[spnewNumber].x=p2[i].x;
p4[spnewNumber].y=p2[i].y;
p4[spnewNumber].flag=p2[i].flag;
spnewNumber++;


for(j=0;j<cpNumber;j++)
{
if(IsLineSegmentCross(p1[j],p1[j+1],p2[i],p2[i+1]))
{
GetCrossPoint(p1[j],p1[j+1],p2[i],p2[i+1]);
InOut[count].x=q[0].x;
InOut[count].y=q[0].y;
InOut[count].flag=q[0].flag;


count++;
}
}


if(p2[i].x<p2[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x>InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}
else if(p2[i].x>p2[i+1].x)
{
for(m=1;m<count;m++)
{
for(n=m+1;n<count;n++)
{
if(InOut[m].x<InOut[n].x)
{
InOut[0].x=InOut[m].x;
InOut[0].y=InOut[m].y;
InOut[0].flag=InOut[m].flag;


InOut[m].x=InOut[n].x;
InOut[m].y=InOut[n].y;
InOut[m].flag=InOut[n].flag;


InOut[n].x=InOut[0].x;
InOut[n].y=InOut[0].y;
InOut[n].flag=InOut[0].flag;
}
}
}
}


for(m=1;m<count;m++)
{
p4[spnewNumber].x=InOut[m].x;
p4[spnewNumber].y=InOut[m].y;
p4[spnewNumber].flag=InOut[m].flag;


spnewNumber++;
}
}


}


/*求交点*/
void CcgGJ2DtransView::GetCrossPoint(point p1,point p2,point p3,point p4)
{
double dx1,dy1,dx2,dy2,p;

dx1=p2.x-p1.x; dy1=p2.y-p1.y;
dx2=p4.x-p3.x; dy2=p4.y-p3.y;
/*针对多边形点顺时针方向*/
//公式对于向量(x1,y1)->(x2,y2),判断点(x3,y3)在向量的左边,右边,还是线上.
//p=x1(y3-y2)+x2(y1-y3)+x3(y2-y1).p<0 左侧, p=0 线上, p>0 右侧
p=dx1*dy2-dy1*dx2;
if(p>0)
q[0].flag=1;//入点
else if(p<0)
q[0].flag=-1;//出点
else if(p==0)
q[0].flag=0;//交点在裁剪多边形的边上

/*求交点*/
q[0].x=((p1.y-p3.y)*dx1*dx2-p1.x*dy1*dx2+p3.x*dy2*dx1)/(dy2*dx1-dy1*dx2);
q[0].y=p1.y+(q[0].x-p1.x)*dy1/dx1;
}
/*判断两线段是否有交点*/
bool CcgGJ2DtransView::IsLineSegmentCross(point p1,point p2,point p3,point p4)
{
double X1max,Y1max,X1min,Y1min;
double X2max,Y2max,X2min,Y2min;
double dx1,dy1,dx2,dy2;


if(p1.x<p2.x)
{
X1max=p2.x;
X1min=p1.x;
}
else
{
X1max=p1.x;
X1min=p2.x;
}


if(p1.y<p2.y)
{
Y1max=p2.y;
Y1min=p1.y;
}
else
{
Y1max=p1.y;
Y1min=p2.y;
}


if(p3.x<p4.x)
{
X2max=p4.x;
X2min=p3.x;
}
else
{
X2max=p3.x;
X2min=p4.x;
}


if(p3.y<p4.y)
{
Y2max=p4.y;
Y2min=p3.y;
}
else
{
Y2max=p3.y;
Y2min=p4.y;
}


if(X1max<X2min||Y1max<Y2min||X1min>X2max||Y1min>Y2max)
return false;
else
{
dx1=p1.x-p2.x; dx2=p3.x-p4.x;
dy1=p1.y-p2.y; dy2=p3.y-p4.y;


if(Fxy(dx1,dy1,p1.x,p1.y,p3.x,p3.y,p4.x,p4.y)<=0&&Fxy(dx2,dy2,p3.x,p3.y,p1.x,p1.y,p2.x,p2.y)<=0)
return true;
else
return false;
}
}
double CcgGJ2DtransView::Fxy(double dx,double dy,double px,double py,double x1,double y1,double x2,double y2)
{
double ff;


ff=(dx*(y1-py)-dy*(x1-px))*(dx*(y2-py)-dy*(x2-px));


return ff;
}


// CcgGJ2DtransView 打印




void CcgGJ2DtransView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
AFXPrintPreview(this);
#endif
}


BOOL CcgGJ2DtransView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}


void CcgGJ2DtransView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}


void CcgGJ2DtransView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}


void CcgGJ2DtransView::OnRButtonUp(UINT /* nFlags */, CPoint point)
{
ClientToScreen(&point);
OnContextMenu(this, point);
}


void CcgGJ2DtransView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
{
#ifndef SHARED_HANDLERS
theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
#endif
}




// CcgGJ2DtransView 诊断


#ifdef _DEBUG
void CcgGJ2DtransView::AssertValid() const
{
CView::AssertValid();
}


void CcgGJ2DtransView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}


CcgGJ2DtransDoc* CcgGJ2DtransView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CcgGJ2DtransDoc)));
return (CcgGJ2DtransDoc*)m_pDocument;
}
#endif //_DEBUG




// CcgGJ2DtransView 消息处理程序




void CcgGJ2DtransView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);


m_wndHeight = cy;
m_wndWidth  = cx;
// TODO: 在此处添加消息处理程序代码
}




void CcgGJ2DtransView::LineCenter()
{


float maxX,maxY,minX,minY;


maxX = maxY = -5000;
minX = minY = 50000;


if (vx1 < minX) minX = vx1;
if (vx1 > maxX) maxX = vx1;
if (vx2 < minX) minX = vx2;
if (vx2 > maxX) maxX = vx2;
if (vy1 < minY) minY = vy1;
if (vy1 > maxY) maxY = vy1;
if (vy2 < minY) minY = vy2;
if (vy2 > maxY) maxY = vy2;


lcx = (maxX + minX) / 2.0f;
lcy = (maxY + minY) / 2.0f;
}


void CcgGJ2DtransView::PolygonCenter()
{
float maxX,maxY,minX,minY;


maxX = maxY = -5000;
minX = minY = 50000;


for (int i = 0; i < 6; i++) {
if (vx[i] < minX) minX = vx[i];
if (vx[i] > maxX) maxX = vx[i];
if (vy[i] < minY) minY = vy[i];
if (vy[i] > maxY) maxY = vy[i];
}
lcx = (maxX + minX) / 2.0f;
lcy = (maxY + minY) / 2.0f;
}
void CcgGJ2DtransView::PolygonNEWCenter()
{
float maxX,maxY,minX,minY;


maxX = maxY = -5000;
minX = minY = 50000;


for (int i = 0; i < 6; i++) {
if (NEWvx[i] < minX) minX = NEWvx[i];
if (NEWvx[i] > maxX) maxX = NEWvx[i];
if (NEWvy[i] < minY) minY = NEWvy[i];
if (NEWvy[i] > maxY) maxY = NEWvy[i];
}
lcx = (maxX + minX) / 2.0f;
lcy = (maxY + minY) / 2.0f;
}




// Please perfect the CalculatMatrix() for Scale transform part !!!


void CcgGJ2DtransView::CalculatMatrix(float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


if (pDoc->m_selfRotate) {
if (pDoc->m_transSelect == 0) LineCenter();
else if (pDoc->m_transSelect == 1) PolygonCenter();
else if (pDoc->m_transSelect == 2) PolygonNEWCenter();
}
switch (pDoc->m_transDir) {
case 0:  // -X
if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(-10, 0, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(-sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale


ScaleMatrix(0.8,1,transMatrix);


}
break;
case 1: // +X
if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(10, 0, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale
ScaleMatrix(1.2,1,transMatrix);
}
break;
case 2: // -Y
if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(0, -10, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(-sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale


// Please fill in the right code (1 Lines) here ...
ScaleMatrix(1,0.8,transMatrix);
}
break;
case 3: // +Y


if (pDoc->m_transMode == 0) {         // Translate
TranslateMatrix(0, 10, transMatrix);
} else if (pDoc->m_transMode == 1) { // Rotate
RotateMatrix(sin(DELTATHETA), cos(DELTATHETA), transMatrix);
} else if (pDoc->m_transMode == 2) { // Scale


// Please fill in the right code (1 Lines) here ...
ScaleMatrix(1,1.2,transMatrix);
}
break;  
}
}


void CcgGJ2DtransView::TransformLine()
{
CcgGJ2DtransDoc* pDoc = GetDocument();


vx1 = pDoc->x1 * pDoc->m_lineTransMatrix[0][0] +
pDoc->y1 * pDoc->m_lineTransMatrix[1][0] + pDoc->m_lineTransMatrix[2][0];
vy1 = pDoc->x1 * pDoc->m_lineTransMatrix[0][1] +
pDoc->y1 * pDoc->m_lineTransMatrix[1][1] + pDoc->m_lineTransMatrix[2][1];
vx2 = pDoc->x2 * pDoc->m_lineTransMatrix[0][0] +
pDoc->y2 * pDoc->m_lineTransMatrix[1][0] + pDoc->m_lineTransMatrix[2][0];
vy2 = pDoc->x2 * pDoc->m_lineTransMatrix[0][1] +
pDoc->y2 * pDoc->m_lineTransMatrix[1][1] + pDoc->m_lineTransMatrix[2][1];


}


void CcgGJ2DtransView::TransformPolygon()
{
CcgGJ2DtransDoc* pDoc = GetDocument();


for (int i = 0; i < 6; i++) {


vx[i] = pDoc->x[i] * pDoc->m_polygonTransMatrix[0][0] +
pDoc->y[i] * pDoc->m_polygonTransMatrix[1][0] + 
pDoc->m_polygonTransMatrix[2][0];
vy[i] = pDoc->x[i] * pDoc->m_polygonTransMatrix[0][1] +
pDoc->y[i] * pDoc->m_polygonTransMatrix[1][1] + 
pDoc->m_polygonTransMatrix[2][1];
}


}






void CcgGJ2DtransView::TransformPolygonNEW()
{
CcgGJ2DtransDoc* pDoc = GetDocument();


for (int i = 0; i < 6; i++) {


NEWvx[i] = pDoc->NEWx[i] * pDoc->m_polygonNEWTransMatrix[0][0] +
pDoc->NEWy[i] * pDoc->m_polygonNEWTransMatrix[1][0] + 
pDoc->m_polygonNEWTransMatrix[2][0];
NEWvy[i] = pDoc->NEWx[i] * pDoc->m_polygonNEWTransMatrix[0][1] +
pDoc->NEWy[i] * pDoc->m_polygonNEWTransMatrix[1][1] + 
pDoc->m_polygonNEWTransMatrix[2][1];
}


}
void CcgGJ2DtransView::TranslateMatrix(float DX, float DY, float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


transMatrix[2][0] = transMatrix[2][0] + DX;
transMatrix[2][1] = transMatrix[2][1] + DY;
}


void CcgGJ2DtransView::RotateMatrix(float S, float C, float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


float temp;


if (pDoc->m_selfRotate && pDoc->m_transSelect <= 1) TranslateMatrix(-lcx, -lcy, transMatrix);
for (int i = 0; i < 3; i++) {


// Please fill in the right code (3-5 Lines) here ...
temp = transMatrix[i][0];
transMatrix[i][0] = temp * C - transMatrix[i][1] * S; 
transMatrix[i][1] = temp * S + transMatrix[i][1] * C;
}
if (pDoc->m_selfRotate && pDoc->m_transSelect <= 1) TranslateMatrix(lcx, lcy, transMatrix);
}


void CcgGJ2DtransView::ScaleMatrix(float SX, float SY, float transMatrix[3][2])
{
CcgGJ2DtransDoc* pDoc = GetDocument();


// Please fill in the right code (3-5 Lines) here ...
for (int i=0;i<3;i++)
{
transMatrix[i][0] = transMatrix[i][0] * SX;
transMatrix[i][1] = transMatrix[i][1] * SY;
}
}


int CcgGJ2DtransView::ClipLine(int *x1, int *y1, int *x2, int *y2)
{


int visible;
CcgGJ2DtransDoc* pDoc = GetDocument();


for (int i = 0; i < 4; i++) { // Along the WIN Border
visible = LineVisible(x1, y1, x2, y2);
if (visible == 1) return 1;              // Total Visible
if (visible == 0) return 0;              // Total unvisible
if (LineCross(*x1, *y1, *x2, *y2, i))
{  // If the line cross the window, 
// calculate intersect point.
if (i < 2 && *x2-*x1) 
{ // Left 0 , Right 1
float m = (float)(*y2-*y1)/(*x2-*x1);
float iy = m * (pDoc->m_window[i] - *x1) + *y1;
// Please fill in the right code (4-6 Lines) here ...


if (pVisible(*x1,*y1,i) == 0)
{
*x1 = pDoc->m_window[i];
*y1 = iy;

else if (pVisible(*x2,*y2,i) == 0)
{
*x2 = pDoc->m_window[i];
*y2 = iy;
}


}
else if (*y2-*y1)
{ // Top 3    Bottom 4
float m = (float)(*x2-*x1)/(*y2-*y1);
float ix = m * (pDoc->m_window[i] - *y1) + *x1;
// Please fill in the right code (4-6 Lines) here ...


if (pVisible(*x1,*y1,i) == 0)
{
*x1 = ix;
*y1 = pDoc->m_window[i];

else if (pVisible(*x2,*y2,i) == 0)
{
*x2 = ix;
*y2 = pDoc->m_window[i];
}
}
}
}
return 1;
}


int CcgGJ2DtransView::LineVisible(int *x1, int *y1, int *x2, int *y2)
{
int pcode1,pcode2;


pcode1 = pCode(x1, y1);    pcode2 = pCode(x2, y2);


if (!pcode1 && !pcode2) return 1;   // Visible
if (pcode1&pcode2)      return 0;   // Unvisible
if (!pcode1) {
float temp;
temp = *x1;  *x1= *x2;  *x2 = temp;
temp = *y1;  *y1= *y2;  *y2 = temp;
}
return 2;
}


int CcgGJ2DtransView::pCode(int *x, int *y)
{
int code = 0;
CcgGJ2DtransDoc* pDoc = GetDocument();


if (*x <= pDoc->m_window[0])  code |= 1;
if (*x >= pDoc->m_window[1])  code |= 2;
if (*y >= pDoc->m_window[2])  code |= 4;
if (*y <= pDoc->m_window[3])  code |= 8;


return code;
}


int CcgGJ2DtransView::ClipPolygon(int n, int *x, int *y, int *cn, int cx[], int cy[])
{
int Nin,Nout,ix,iy,Sx,Sy;
CcgGJ2DtransDoc* pDoc = GetDocument();


Nin = n;// 初始图形的顶点个数
for (int i = 0; i < 4; i++)
{        // Along the window border
*cn = 0;
for (int j = 0; j < Nin; j++) 
{  // Scan polygon every point and line.
if (j > 0) 
{
if (LineCross(Sx, Sy, x[j], y[j], i)) //x[i-1],y[i-1] and x[i],y[i] 与窗口边界是否有交点
{
interSect(Sx, Sy, x[j], y[j], i, &ix, &iy);
outPut(ix, iy, cn, cx, cy);
}
}
Sx = x[j];    Sy = y[j];
if (pVisible(Sx, Sy, i)) outPut(Sx, Sy, cn, cx, cy);
}


Nin = *cn;
if (*cn == 0) return 0;
for (int j = 0; j < Nin; j++) { x[j] = cx[j];    y[j] = cy[j]; }


if (cx[0] != cx[Nin-1] || cy[0] != cy[Nin-1])
{//起始点和终点的值相同


x[Nin] = x[0];
y[Nin] = y[0];
cx[Nin] = cx[0];
cy[Nin] = cy[0];
// if (cx[0] == cx[Nin-1]) cy[Nin] = cy[Nin-1];
// if (cy[0] == cy[Nin-1]) cx[Nin] = cx[Nin-1];
Nin++;         *cn = Nin;
}
}
return 1;
}
void CcgGJ2DtransView::TransformWindow()
{
CcgGJ2DtransDoc *pDoc = (CcgGJ2DtransDoc *)GetDocument();


switch(pDoc->m_transDir)
{
case 0:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[0]  = pDoc->m_window[0]  - 10;
pDoc->m_window[1] = pDoc->m_window[1] - 10;
break;
case 2:
if (pDoc->m_window[0] >= pDoc->m_window[1])break;
pDoc->m_window[0]  = pDoc->m_window[0]  + 10;
pDoc->m_window[1] = pDoc->m_window[1] - 10;
break;
}
break;
case 1:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[0]  = pDoc->m_window[0]  + 10;
pDoc->m_window[1] = pDoc->m_window[1] + 10;
break;
case 2:
if (pDoc->m_window[0]  >= pDoc->m_window[1])break;
pDoc->m_window[0]  = pDoc->m_window[0]  - 10;
pDoc->m_window[1] = pDoc->m_window[1] + 10;
break;
}
break;
case 2:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[2]   = pDoc->m_window[2]   - 10;
pDoc->m_window[3] = pDoc->m_window[3] - 10;
break;
case 2:
if (pDoc->m_window[2]  <= pDoc->m_window[3])break;
pDoc->m_window[2]   = pDoc->m_window[2]   - 10;
pDoc->m_window[3] = pDoc->m_window[3] + 10;
break;
}
break;
case 3:
switch(pDoc->m_transMode)
{
case 0:
pDoc->m_window[2]   = pDoc->m_window[2]   + 10;
pDoc->m_window[3] = pDoc->m_window[3] + 10;
break;
case 2:
if (pDoc->m_window[2] <= pDoc->m_window[3])break;
pDoc->m_window[2]   = pDoc->m_window[2]   + 10;
pDoc->m_window[3] = pDoc->m_window[3] - 10;
break;
}
break;
}
}
int CcgGJ2DtransView::LineCross(int x1, int y1, int x2, int y2, int i)
{
int visible1,visible2;


visible1 = pVisible(x1,y1,i);
visible2 = pVisible(x2,y2,i);


if (visible2 == visible1) return 0;
else                      return 1;


return 1;
}


int CcgGJ2DtransView::pVisible(int x, int y, int i)
{
int visible = 0;
CcgGJ2DtransDoc* pDoc = GetDocument();


switch (i) {
case 0: // Left
if (x >= pDoc->m_window[0])  visible = 1; break;
case 1: // Right
if (x <= pDoc->m_window[1])  visible = 1; break;
case 2: // Top
if (y <= pDoc->m_window[2])  visible = 1; break;
case 3: // Bottom
if (y >= pDoc->m_window[3])  visible = 1; break;
}
return visible;
}


void CcgGJ2DtransView::interSect(int Sx, int  Sy, int Px, int Py,
int  i, int *ix, int *iy)
//用 (ix,iy)返回直线(sx,sy)-(px,py)与window[i]的交点
{
CcgGJ2DtransDoc* pDoc = GetDocument();


switch (i) {
case 0: // Left
*ix = pDoc->m_window[0];
*iy = (int) ((float)((*ix - Px)*(Sy - Py)/(Sx - Px) + Py + 0.5));
// Please fill in the right code (2 Lines) here ...
break;
case 1: // Right
*ix = pDoc->m_window[1];
*iy = (int) ((float)((*ix - Px)*(Sy - Py)/(Sx - Px) + Py + 0.5));


// Please fill in the right code (2 Lines) here ...


break;
case 2: // Top'
*iy = pDoc->m_window[2];
*ix = (int) ((float)((*iy - Py)*(Sx - Px)/(Sy - Py) + Px + 0.5));


// Please fill in the right code (2 Lines) here ...


break;
case 3: // Bottom
// Please fill in the right code (2 Lines) here ...
*iy = pDoc->m_window[3];
*ix = (int) ((float)((*iy - Py)*(Sx - Px)/(Sy - Py) + Px + 0.5));


break;
}
}


void CcgGJ2DtransView::outPut(int x, int y, int *Nout, int *tempX, int *tempY)
{
tempX[*Nout] = x;
tempY[*Nout] = y;
(*Nout)++;
}

control.cpp



void CCgtransControl::OnInitialUpdate()
{
CFormView::OnInitialUpdate();


// TODO: 在此添加专用代码和/或调用基类
CcgGJ2DtransDoc* pDoc = (CcgGJ2DtransDoc*)GetDocument();
CButton* axisRotate = (CButton*)GetDlgItem(IDC_AxisRotate);
CButton* selfRotate = (CButton*)GetDlgItem(IDC_SelfRotate);


m_transSelect.SetCurSel(0);


if (pDoc->m_selfRotate)
{
selfRotate->SetCheck(1);
} else {
axisRotate->SetCheck(1);
}
}




void CCgtransControl::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
// TODO: 在此添加专用代码和/或调用基类


CRect dcRect;
CcgGJ2DtransDoc* pDoc = (CcgGJ2DtransDoc*)GetDocument();
CStatic *pViewport = (CStatic *)GetDlgItem(IDC_ViewPort);


pViewport->GetClientRect(&dcRect); 
CDC *pViewportDC = pViewport->GetDC();


// Clear BackGround of DC
CBrush brBlack(RGB(255, 255, 255));
pViewportDC->FillRect(dcRect, &brBlack);


CPen newPen;
CPen *oldPen;


if (pDoc->m_ClipPolygon == 0)
{
// Create new color pen to Draw Clipping Line
newPen.CreatePen(PS_SOLID, 1,  RGB(255, 0, 100));
oldPen = (CPen *)pViewportDC->SelectObject(&newPen);


if (pDoc->m_polygonVisible)
{
viewTransPolygon(dcRect/*,pDoc->x,pDoc->y,pDoc->cn*/);
pViewportDC->MoveTo(pDoc->cx[0], dcRect.Height()-pDoc->cy[0]);
for (int i = 1; i < pDoc->cn; i++) 
pViewportDC->LineTo(pDoc->cx[i], dcRect.Height()-pDoc->cy[i]);
}
pViewportDC->SelectObject(oldPen);
newPen.DeleteObject();


//new polygon


newPen.CreatePen(PS_SOLID, 1,  RGB(0, 100, 200));
oldPen = (CPen *)pViewportDC->SelectObject(&newPen);


if (pDoc->m_polygonNEWVisible)
{
viewTransPolygonNEW(dcRect/*,pDoc->x,pDoc->y,pDoc->cn*/);
pViewportDC->MoveTo(pDoc->NEWcx[0], dcRect.Height()-pDoc->NEWcy[0]);
for (int i = 1; i < pDoc->NEWcn; i++) 
pViewportDC->LineTo(pDoc->NEWcx[i], dcRect.Height()-pDoc->NEWcy[i]);
}
pViewportDC->SelectObject(oldPen);
newPen.DeleteObject();
}
else
{
//clip polygon
}


newPen.CreatePen(PS_SOLID, 1,  RGB(200, 20, 255));
oldPen = (CPen *)pViewportDC->SelectObject(&newPen);


if (pDoc->m_lineVisible) {
viewTransLine(dcRect);
pViewportDC->MoveTo(pDoc->cx1, dcRect.Height()-pDoc->cy1);
pViewportDC->LineTo(pDoc->cx2, dcRect.Height()-pDoc->cy2);


}


// Remeber: must delete newPen everytime
pViewportDC->SelectObject(oldPen);
newPen.DeleteObject();




// Remeber: must release CDC *pViewportDC everytime
ReleaseDC(pViewportDC);
}
void CCgtransControl::viewTransLine(CRect dcRect)
{
CcgGJ2DtransDoc* pDoc = (CcgGJ2DtransDoc*)GetDocument();
float wndWidth = pDoc->m_window[1] - pDoc->m_window[0];
float wndHeight = pDoc->m_window[2] - pDoc->m_window[3];


float sx = dcRect.Width() / wndWidth;
float sy = dcRect.Height() / wndHeight;


pDoc->cx1 = (pDoc->cx1 - pDoc->m_window[0]) * sx ;
pDoc->cy1 = (pDoc->cy1 - pDoc->m_window[3]) * sy ;
pDoc->cx2 = (pDoc->cx2 - pDoc->m_window[0]) * sx ;
pDoc->cy2 = (pDoc->cy2 - pDoc->m_window[3]) * sy ;


}


void CCgtransControl::viewTransPolygon(CRect dcRect)
{
CcgGJ2DtransDoc* pDoc = (CcgGJ2DtransDoc*)GetDocument();
float wndWidth = pDoc->m_window[1] - pDoc->m_window[0];
float wndHeight = pDoc->m_window[2] - pDoc->m_window[3];


float sx = dcRect.Width() / wndWidth;
float sy = dcRect.Height() / wndHeight;


for (int i = 0; i < pDoc->cn; i++) {
pDoc->cx[i] = (pDoc->cx[i] - pDoc->m_window[0]) * sx ;
pDoc->cy[i] = (pDoc->cy[i] - pDoc->m_window[3]) * sy ;
}


}




void CCgtransControl::viewTransPolygonNEW(CRect dcRect)
{
CcgGJ2DtransDoc* pDoc = (CcgGJ2DtransDoc*)GetDocument();
float wndWidth = pDoc->m_window[1] - pDoc->m_window[0];
float wndHeight = pDoc->m_window[2] - pDoc->m_window[3];


float sx = dcRect.Width() / wndWidth;
float sy = dcRect.Height() / wndHeight;


for (int i = 0; i < pDoc->NEWcn; i++) {
pDoc->NEWcx[i] = (pDoc->NEWcx[i] - pDoc->m_window[0]) * sx ;
pDoc->NEWcy[i] = (pDoc->NEWcy[i] - pDoc->m_window[3]) * sy ;
}


}


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值