POJ 2540 Hotter Colder(半平面交求可行域)

本文介绍了一种通过中垂线方程逐步缩小目标位置可能范围的方法,并实现了一个算法来计算每一步的目标区域面积。该算法涉及点到直线的距离计算、半平面交集计算以及凸多边形面积计算。

转载请注明出处,谢谢http://blog.youkuaiyun.com/acm_cxlove/article/details/7854526 by---cxlove

题目:从0,0出发,走到某一点,会告诉你目标点是更近了还是更远了,每走一步求出目标的可能范围区域面积

http://poj.org/problem?id=2540

给出两点,已知哪点更近,也就是将区域用中垂线分开,便可以确定解在哪个区域范围之内

首先是根据两个点要求出中垂线的方程,自己YY吧,不过我的做法可能比较传统,然后还需要考虑斜率不存在的情况。

有了方程,还要注意不等式的正负,也就是区域的方向。

不断地加上新的半平面,切割原有的凸多边形。

注意:出现same的话,说明目标在中垂线上,而题目要求的是面积,所以答案为0.而且之后的所有输出都应该为0.

当之前出现了面积为0的情况,说明之前一组就已经找不到可行区域了,之后的所有答案也应为0

POJ,ZOJ,FZU都有这题,数据也有些不同,可以都尝试一下。

#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<sstream>
#include<cassert>
#define LL long long
#define eps 1e-8
#define inf 10000
#define zero(a) fabs(a)<eps
#define N 20005
using namespace std;
struct Point{
    double x,y;
    Point(){}
    Point(double tx,double ty){x=tx;y=ty;}
}pre,cur,p[105],tp[105];
double xmul(Point p0,Point p1,Point p2){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
//给出两点,算出中垂线的标准方程
void Get_midperpendicular(Point p1,Point p2,double &a,double &b,double &c){
    //中垂线斜率为0
    if(zero(p1.x-p2.x)) a=0,b=1;
    //中垂线斜率不存在
    else if(zero(p1.y-p2.y)) a=1,b=0;
    //一般情况
    else b=p2.y-p1.y,a=p2.x-p1.x;
    c=-a*(p2.x+p1.x)/2-b*(p2.y+p1.y)/2;
}
Point Get_Intersection(Point p1,Point p2,double a,double b,double c){
    double u=fabs(a*p1.x+b*p1.y+c),v=fabs(a*p2.x+b*p2.y+c);
    return Point((p1.x*v+p2.x*u)/(u+v),(p1.y*v+p2.y*u)/(u+v));
}
void Cut(double a,double b,double c,Point p[],int &cnt){
    int tmp=0;
    for(int i=1;i<=cnt;i++){
        if(a*p[i].x+b*p[i].y+c>-eps) tp[++tmp]=p[i];
        else{
            if(a*p[i-1].x+b*p[i-1].y+c>eps)
                tp[++tmp]=Get_Intersection(p[i-1],p[i],a,b,c);
            if(a*p[i+1].x+b*p[i+1].y+c>eps)
                tp[++tmp]=Get_Intersection(p[i+1],p[i],a,b,c);
        }
    }
    for(int i=1;i<=tmp;i++)
        p[i]=tp[i];
    p[0]=tp[tmp];p[tmp+1]=p[1];
    cnt=tmp;
}
double Get_Area(Point p[],int n){
    double area=0;
    for(int i=2;i<n;i++)
        area+=xmul(p[1],p[i],p[i+1]);
    return fabs(area)/2.0;
}
int main(){
    pre.x=pre.y=0;
    char str[10];
    p[1].x=0;p[1].y=0;
    p[2].x=0;p[2].y=10;
    p[3].x=10;p[3].y=10;
    p[4].x=10;p[4].y=0;
    p[0]=p[4];p[5]=p[1];
    int cnt=4;
    double area=1.0;
    while(scanf("%lf%lf%s",&cur.x,&cur.y,str)!=EOF){
        double a,b,c;
        Get_midperpendicular(pre,cur,a,b,c);
        //确定不等式,使得区域范围为ax+by+c>0
        if(strcmp(str,"Colder")==0){
            if(a*pre.x+b*pre.y+c<-eps){a=-a;b=-b;c=-c;}
        }
        else if(strcmp(str,"Hotter")==0){
            if(a*cur.x+b*cur.y+c<-eps){a=-a;b=-b;c=-c;}
        }
        else
            area=0;
        //如果出现了same或者之前面积为0,之后都为0
        if(zero(area)){
            printf("0.00\n");
            continue;
        }
        Cut(a,b,c,p,cnt);
        area=Get_Area(p,cnt);
        printf("%.2f\n",area);
        pre=cur;
    }
    return 0;
}


【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究(Matlab代码实现)内容概要:本文围绕“评估多目标跟踪方法”,重点研究9个高度敏捷目标在编队飞行中的轨迹生成与测量过程,并提供完整的Matlab代码实现。文中详细模拟了目标的动态行为、运动约束及编队结构,通过仿真获取目标的状态信息与观测数据,用于验证和比较不同多目标跟踪算法的性能。研究内容涵盖轨迹建模、噪声处理、传感器测量模拟以及数据可视化等关键技术环节,旨在为雷达、无人机编队、自动驾驶等领的多目标跟踪系统提供可复现的测试基准。; 适合人群:具备一定Matlab编程基础,从事控制工程、自动化、航空航天、智能交通或人工智能等相关领的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于多目标跟踪算法(如卡尔曼滤波、粒子滤波、GM-CPHD等)的性能评估与对比实验;②作为无人机编队、空中交通监控等应用场景下的轨迹仿真与传感器数据分析的教学与研究台;③支持对高度机动目标在复杂编队下的可观测性与跟踪精度进行深入分析。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注轨迹生成逻辑与测量模型构建部分,可通过修改目标数量、运动参数或噪声水来拓展实验场景,进一步提升对多目标跟踪系统设计与评估的理解。
本软件实现了一种基于时有限差分法结合时间反转算法的微波成像技术,旨在应用于乳腺癌的早期筛查。其核心流程分为三个主要步骤:数据采集、信号处理与三维可视化。 首先,用户需分别执行“WithTumor.m”与“WithoutTumor.m”两个脚本。这两个程序将在模拟生成的三维生物组织环境中进行电磁仿真,分别采集包含肿瘤模型与不包含肿瘤模型的场景下的原始场数据。所获取的数据将自动存储为“withtumor.mat”与“withouttumor.mat”两个数据文件。 随后,运行主算法脚本“TR.m”。该程序将加载上述两组数据,并实施时间反转算法。算法的具体过程是:提取两组仿真信号之间的差异成分,通过一组专门设计的数字滤波器对差异信号进行增强与净化处理,随后在数值模拟的同一组织环境中进行时间反向的电磁波传播计算。 在算法迭代计算过程中,系统会按预设的周期(每n次迭代)自动生成并显示三维模拟空间内特定二维切面的电场强度分布图。通过对比观察这些动态更新的二维场分布图像,用户有望直观地识别出由肿瘤组织引起的异常电磁散射特征,从而实现病灶的视觉定位。 关于软件的具体配置要、参数设置方法以及更深入的技术细节,请参阅软件包内附的说明文档。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值