?? suanfa.cpp
字號:
#include "stdafx.h"
#include "suanfa.h"
//在指定的pDC設備中,畫多邊形
bool CGraphics::DrawPloyon(CDC* pDC)
{
if(PointCount < 3)
return false;
//若多邊形小于三個點則返回
pDC->MoveTo(Point[0]);
for(int i=1;i<PointCount;i++)
{
pDC->LineTo(Point[i]);
}
pDC->LineTo(Point[0]);
//在pDC中畫出多邊形
return true;
}
bool CGraphics::CutRect(CRect rect)
{
CPoint rectPoint[4];
rectPoint[0].x = rect.left;
rectPoint[0].y = rect.top;
rectPoint[1].x = rect.right;
rectPoint[1].y = rect.top;
rectPoint[3].x = rect.left;
rectPoint[3].y = rect.bottom;
rectPoint[2].x = rect.right;
rectPoint[2].y = rect.bottom;
//獲取裁減矩形的四個點的坐標,第一個點為左上,第二個點為右上,第三個點為右下,第四個點為左下
int i;
CArray<CPoint,CPoint&> myArray;//裁減后,保存的多邊形的依次各點的坐標
for(int rectNum=0;rectNum<4;rectNum++)
{
//對裁減矩形的四條邊進行循環
for(i=0;i<PointCount;i++)
{
//對每條邊進行循環
CPoint PointCross;
int beforeI=BeforeIndex(i),afterI=AfterIndex(i);
int afterrectNum = ((rectNum == 3)?0:rectNum+1);
//判斷是否跟線段相交
if(InterCross(Point[beforeI],Point[i],rectPoint[rectNum],rectPoint[afterrectNum],PointCross))
{
if(PointCross==Point[i])
{
myArray.Add(Point[i]);//交點在線段頂點上,直接添加頂點坐標在保存多邊形的數組中
}
else
if(PointCross==Point[beforeI])
{
if(IsInSquareRgn(rect,Point[i],rectNum))
myArray.Add(Point[i]);//判斷是否可視,若是,則添加點坐標
}
else
{
myArray.Add(PointCross);//跟線段相交,但交點不在頂點上,添加交點坐標
if(IsInSquareRgn(rect,Point[i],rectNum))
myArray.Add(Point[i]);//判斷是否可視,若是,則添加點坐標
}
}
else
if(IsInSquareRgn(rect,Point[i],rectNum))
myArray.Add(Point[i]);//線段不相交,但需判斷是否可視,若是,則添加點坐標
}
PointCount=myArray.GetSize();
if(Point)
delete Point;
Point = new CPoint[PointCount];
for(i=0;i<PointCount;i++)
Point[i]=myArray.GetAt(i);//重新賦予點坐標的值
myArray.RemoveAll();
}
return true;
}
bool CGraphics::InterCross(CPoint objectP1,CPoint objectP2,CPoint scanP1,CPoint scanP2,CPoint& coordinate)
{
//objectP1、objectP2是一條線段的頂點坐標,而scanP1、scanP2是另一條線段的頂點坐標
if(objectP1 == objectP2)
return false;//若objectP1、objectP2相等,則構不成線段,退出
if(scanP1 == scanP2)
return false;//若scanP1、scanP2等,則構不成線段,退出
if( ( objectP1.y - objectP2.y ) * ( scanP1.x - scanP2.x )
== ( scanP1.y - scanP2.y ) * ( objectP1.x - objectP2.x))
{
//對斜率相等的情況下的處理
if((objectP1.y-objectP2.y)*(scanP1.x-objectP1.x)==(objectP1.x-objectP2.x)*(scanP1.y-objectP1.y))
{
//判斷兩條線段是不是同一條線段
coordinate=objectP2;
return true;
}
else
return false;
}
if(objectP1.x == objectP2.x)
{
//當第一條線段斜率不存在時,處理辦法
double x,y;
x = objectP1.x;
y = (scanP1.y-scanP2.y)*1.0/(scanP1.x-scanP2.x)*(objectP1.x-scanP1.x)+scanP1.y;
y = (float)((int)(y+0.5));
if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))
{
//判斷交點是不是在該兩條線段上
coordinate.x = objectP1.x;
coordinate.y = (int)(y+0.5);
return true;
}
return false;
}
else
{
if(scanP1.x == scanP2.x)
{
//當第二條線段斜率不存在時,處理辦法
double x,y;
x = scanP1.x;
y = (objectP1.y-objectP2.y)*1.0/(objectP1.x-objectP2.x)*(scanP1.x-objectP1.x)+objectP1.y;
y = (float)((int)(y+0.5));
if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))
{
//判斷交點是不是在該兩條線段上
coordinate.x = scanP1.x;
coordinate.y = (int)(y+0.5);
return true;
}
return false;
}
else
{
//兩條線段斜率都存在時的處理辦法
double k1,k2;
k1 = ( objectP1.y - objectP2.y ) * 1.0 / ( objectP1.x - objectP2.x);
k2 = ( scanP1.y - scanP2.y ) * 1.0 / ( scanP1.x - scanP2.x );
//k1,k2為計算的兩線段的斜率
double x,y;
x = (scanP1.y-objectP1.y-k2*scanP1.x+k1*objectP1.x)/(k1-k2);
y = (k1*k2*scanP1.x-k1*k2*objectP1.x+k2*objectP1.y-k1*scanP1.y)/(k2-k1);
x=(float)((int)(x+0.5));
y = (float)((int)(y+0.5));
if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))
{
//判斷交點是不是在該兩條線段上
coordinate.x = (int)(x+0.5);
coordinate.y = (int)(y+0.5);
return true;
}
return false;
}
}
return true;
}
bool CGraphics::IsInSquareRgn(CRect rect,CPoint Point,int flag)
{
//對多邊形裁減時,判斷線段端點是否在可視一側,判斷就是直接判斷點坐標的關系
switch(flag)
{
case 0:
if(Point.y > rect.top)
return true;
else
return false;
break;
case 1:
if(Point.x < rect.right)
return true;
else
return false;
break;
case 2:
if(Point.y < rect.bottom)
return true;
else
return false;
break;
case 3:
if(Point.x > rect.left)
return true;
else
return false;
break;
default:
break;
}
return true;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -