下面是我实现判断点和多边形位置 的代码
include
define Pi 3.1415926
double BianChang(POINT A,POINT B)
{
return sqrt((A.x-B.x)(A.x-B.x)+(A.y-B.y)(A.y-B.y));
}
double JiaoDu(POINT A, POINT B, POINT C)
{
if((A.x - B.x) * (C.y - A.y) - (A.y - B.y) * (C.x - A.x)<0)
{
return acos((BianChang(A,C)*BianChang(A,C)+BianChang(A,B)*BianChang(A,B)-BianChang(B,C)*BianChang(B,C))/(2*BianChang(A,C)*BianChang(A,B)))*180/Pi;
}
else
{
return -acos((BianChang(A,C)*BianChang(A,C)+BianChang(A,B)*BianChang(A,B)-BianChang(B,C)*BianChang(B,C))/(2*BianChang(A,C)*BianChang(A,B)))*180/Pi;
}
}
int num=0,abc=1;
POINT p[50];
POINT dian1,dian2;
void CSxhView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
if(abc==1)
{
if(num>2)
{
for(int i=0;i<num-2;i++)
{
if(ShiFouXiangJiao(p[i],p[i+1],p[num-1],point))
{
AfxMessageBox("您所画多边形的边是不能相交滴!");
return;
}
}
}
if(num==0)
{
dian1=point;
dian2=point;
}
else
{
dian1=dian2;
dian2=point;
}
p[num].x=point.x;
p[num].y=point.y;
num++;
}
if(abc==2)
{
dc.Arc(point.x-2,point.y-2,point.x+2,point.y+2,point.x-2,point.y,point.x-2,point.y);
double JD=0;
for(int i=0;i<num;i++)
{
JD+=JiaoDu(point,p[i],p[i+1]);
}
JD+=JiaoDu(point,p[num],p[0]);
if((JD>359&&JD<361)||(JD>-361&&JD<-359))
{
AfxMessageBox("您画的点在多边形之内(nei)!(右击结束选点)");
return;
}
else
{
AfxMessageBox("您画的点在多边形之外(wai)!(右击结束选点)");
return;
}
}
}
void CSxhView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.SetROP2(R2_NOT);
if(abc==1)
{
if(num>0)
{
dc.MoveTo(dian1);
dc.LineTo(dian2);
dc.MoveTo(dian1);
dc.LineTo(point);
dian2=point;
}
}
}
void CSxhView::OnRButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
switch(abc)
{
case 1:
{
if(num<2)
{
AfxMessageBox("您目前不能完成画多边形,请您再多加一个点吧!");
return;
}
if(num>2)
{
for(int i=1;i<=num-2;i++)
{
if(ShiFouXiangJiao(p[i],p[i+1],point,p[0]))
{
AfxMessageBox("您目前不能完成画多边形,请您再多加一个点吧!");
return;
}
}
for(i=0;i<=num-3;i++)
{
if(ShiFouXiangJiao(p[i],p[i+1],point,p[num-1]))
{
AfxMessageBox("您目前不能完成画多边形,请您再多加一个点吧!");
return;
}
}
}
dc.MoveTo(p[0]);
dc.LineTo(point);
p[num].x=point.x;
p[num].y=point.y;
abc=2;
AfxMessageBox("您已经画完多边形,开始选点吧!");
}break;
case 2:
{
abc=1;
num=0;
AfxMessageBox("您已经结束选点,可以再画多边形了!");
}break;
}
}
void CSxhView::Onclear()
{
num=0;
abc=1;
Invalidate();
}