如何判断点和多边形的位置(2018.9.13)

下面是我实现判断点和多边形位置 的代码

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();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值