ZOJ1081 Points Within

简介:
计算几何问题,基本思想从要判断的点引一条射线看和多边形交点的个数,如果是奇数个,那么就在多边形内,否则在多边形外。先判断点是否在多边形边上的情况判掉,再判断线段相交。

复制代码
#include <iostream>
#include <vector>
using namespace std;

const int MAXSIZE = 100;
const double Max = 100000000;

struct Point
{
    double x;
    double y;
}points[MAXSIZE];

Point pc;//选择的射线点

double CrossMultiply(const Point& a,const Point& b,const Point& c)  
{//叉乘
    double x1,y1,x2,y2;
    x1= b.x - a.x;
    y1 = b.y - a.y;
    x2 = c.x - b.x;
    y2 = c.y - b.y;
    return x1 * y2 - x2 * y1;
}   
double interSect(const Point& a,const Point& b,const Point& c,const Point& d)
{
    double d1,d2,d3,d4;
    d1 = CrossMultiply(a,b,c),
        d2 = CrossMultiply(a,b,d),
        d3 = CrossMultiply(c,d,a),
        d4 = CrossMultiply(c,d,b);
    if((d1 * d2) < 0 && (d3 * d4) < 0) 
        return 1.;
    else if((d1 * d2) == 0 || (d3 * d4) == 0) 
        return 0;
    else
        return -1.;
}
bool IsOnEdge(const Point& p,const vector<Point>& ptVect)
{//点是否在边上
    int i,j,size,minX,maxX,minY,maxY;
    size = ptVect.size();//点的数目
    for (i=0;i<size;++i)
    {
        j= i+1;
        if (j==size)
        {
            j=0;
        }
        if (CrossMultiply(ptVect[i],ptVect[j],p)==0)
        {//在同一直线上
            if (p.x>=min(ptVect[i].x,ptVect[j].x)&&p.x<=max(ptVect[i].x,ptVect[j].x)&&p.y>=min(ptVect[i].y,ptVect[j].y)&&p.y<=max(ptVect[i].y,ptVect[j].y))
            {//在线段内
                return true;
            }
        }
    }
    return false;
}
bool isInside(const Point& p,const vector<Point>& ptVect)
{//判断点是否在多边形内部
    int i,j,num,size;
    double d;
    num = 0; //射线与线段相交的点的个数
    size = ptVect.size();
    for(i = 0 ; i <size; ++i)
    {   //处理每条线段
        j= i+1;
        if (j==size)
        {
            j=0;
        }
        d = interSect(p,pc,ptVect[i],ptVect[j]);
        if(d > 0)
            num++; //严格相交
        else if(d == 0)
        { //有一端点在另一直线上
            if(ptVect[i].y > 0 || ptVect[j].y > 0) 
                num++;
        }
    }
    if(num % 2 == 0) 
        return false;
    else
        return true;
}
int main(void)
{
    int N,M,i,pX,pY,cases=0;
    while (cin>>N&&N!=0)
    {
        cin>>M;
        if(cases != 0) 
            cout << endl;
        vector<Point> pointVect;
        for (i=0;i<N;++i)
        {
            cin>>points[i].x>>points[i].y;
            pointVect.push_back(points[i]);
        }
        cout << "Problem " << ++cases<< ":" << endl;
        for (i=0;i<M;++i)
        {
            Point p;
            cin>>p.x>>p.y;
            pc.x = Max,pc.y = p.y;//故意把射线点选择在同一水平线,无穷远处
            if (IsOnEdge(p,pointVect))
            {//在一条边上
                cout<<"Within"<<endl;
                continue;
            }
            else if (isInside(p,pointVect))
            {//在多边形内部
                cout<<"Within"<<endl;
            }
            else
            {
                cout<<"Outside"<<endl;
            }
        }
    }
    return 0;
}
复制代码


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/30/1323289.html,如需转载请自行联系原作者
目录
相关文章
|
机器学习/深度学习 算法 搜索推荐
【机器学习】十大算法之一 “KNN”
KNN(k-nearest neighbors)算法是一种监督学习算法,也是机器学习中比较基础的算法之一。它主要应用于分类和回归。KNN算法的基本思想是在训练集中搜索k个距离测试样本最近的样本,并对这些邻居样本中的大多数进行分类或回归。KNN算法是一种非参数算法,不需要对数据分布进行任何假设,具有很强的鲁棒性和普适性。KNN算法可以用于图像识别、语音识别、推荐系统等常见的机器学习应用领域。KNN算法在实际应用中具有很高的可扩展性,几乎可以应用于任何领域。
1559 0
【机器学习】十大算法之一 “KNN”
|
传感器 编解码 算法
【航空和卫星图像中检测建筑物】使用gabor特征和概率的城市区域和建筑物检测研究(Matlab代码实现)
【航空和卫星图像中检测建筑物】使用gabor特征和概率的城市区域和建筑物检测研究(Matlab代码实现)
256 0
|
5天前
|
人工智能 安全 API
CoPaw:5分钟部署你的 AI助理
源自阿里巴巴开源生态的个人 AI 助理——CoPaw。作为阿里倾力打造的开源力作,CoPaw 完美打通钉钉、飞书、Discord 等多平台对话通道,支持定时任务自动化。内置 PDF/Office 深度处理、新闻摘要等强大技能,更开放自定义扩展接口。坚持数据全程私有化部署,绝不上传云端,让每一位用户都能在大厂技术加持下,拥有安全、专属的智能助手。
|
8天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
9468 76
|
6天前
|
人工智能 安全 JavaScript
阿里云上+本地部署OpenClaw(小龙虾)新手攻略:解锁10大必备Skills,零基础也能玩转AI助手
2026年,开源AI代理工具OpenClaw(昵称“小龙虾”)凭借“能实际做事”的核心优势,在GitHub斩获25万+星标,成为现象级AI工具。它最强大的魅力在于可扩展的Skills(技能包)系统——通过ClawHub插件市场的数百个技能,能让AI助手从简单聊天升级为处理办公、学习、日常事务的全能帮手。
4851 13
|
7天前
|
人工智能 自然语言处理 机器人
保姆级教程:Mac本地搭建OpenClaw及阿里云上1分钟部署OpenClaw+飞书集成实战指南
OpenClaw(曾用名Clawdbot、Moltbot)作为2026年最热门的开源个人AI助手平台,以“自然语言驱动自动化”为核心,支持对接飞书、Telegram等主流通讯工具,可替代人工完成文件操作、日历管理、邮件处理等重复性工作。其模块化架构适配多系统环境,既可以在Mac上本地化部署打造私人助手,也能通过阿里云实现7×24小时稳定运行,完美兼顾隐私性与便捷性。
4990 12
|
9天前
|
人工智能 JSON JavaScript
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
手把手教你用 OpenClaw(v2026.2.22-2)+ 飞书,10分钟零代码搭建专属AI机器人!内置飞书插件,无需额外安装;支持Claude等主流模型,命令行一键配置。告别复杂开发,像聊同事一样自然对话。
5291 13
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
|
8天前
|
人工智能 监控 机器人
2026年零门槛部署 OpenClaw(Clawdbot)接入A股数据,实现24小时股票分析保姆级教程
在AI赋能金融分析的浪潮中,OpenClaw(原Clawdbot/Moltbot)凭借开源灵活的架构,成为个人投资者打造专属智能分析助手的首选。通过接入A股实时数据,它能实现24小时市场监控、涨跌预警、潜力股推荐等核心功能,彻底解放人工盯盘的繁琐。而阿里云的稳定部署环境,更让这套系统实现全天候不间断运行,成为真正的“金融AI助手”。 本文基于OpenClaw v2026.1.25稳定版与QVeris免费A股数据接口,详细拆解阿里云OpenClaw部署步骤、A股数据接入流程、高级分析功能配置及多平台联动技巧,所有代码命令均可直接复制复用,即使无技术基础也能在1小时内完成从部署到实战的全流程。
3689 12