`
xxx0624
  • 浏览: 31746 次
文章分类
社区版块
存档分类
最新评论

POJ3525+半平面交

 
阅读更多

题意:求出给定的凸多边形的内接圆

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn = 155;
const int maxm = 1005;
const double Min = 0.0;
const double Max = 10000000000.0;
const double eps = 1e-8;
const double pi = acos(-1.0);
struct Point{
	double x,y;
};
struct Line{
	Point a,b;
};
Point pnt[ maxn ],res[ maxm ],tp[ maxm ];
double xmult( Point op,Point sp,Point ep ){
	return (sp.x-op.x)*(ep.y-op.y)-(sp.y-op.y)*(ep.x-op.x);
}
double dist( Point a,Point b ){
	return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );
}
void Get_equation( Point p1,Point p2,double &a,double &b,double &c ){
	a = p2.y-p1.y;
	b = p1.x-p2.x;
	c = p2.x*p1.y-p1.x*p2.y;
}//直线
Point Intersection( Point p1,Point p2,double a,double b,double c ){
	double u = fabs( a*p1.x+b*p1.y+c );
	double v = fabs( a*p2.x+b*p2.y+c );
	Point tt;
	tt.x = (p1.x*v+p2.x*u)/(u+v);
	tt.y = (p1.y*v+p2.y*u)/(u+v);
	return tt;
}//交点
double GetArea( Point p[],int n ){
	double sum = 0;
	for( int i=2;i<n;i++ ){
		sum += xmult( p[1],p[i],p[i+1] );
	}
	return -sum/2.0;
}//面积
void cut( double a,double b,double c,int &cnt ){
	int temp = 0;
	for( int i=1;i<=cnt;i++ ){
		if( a*res[i].x+b*res[i].y+c>-eps ){//>=0
			tp[ ++temp ] = res[i];
		}
		else{
			if( a*res[i-1].x+b*res[i-1].y+c>eps ){
				tp[ ++temp ] = Intersection( res[i-1],res[i],a,b,c );
			}
			if( a*res[i+1].x+b*res[i+1].y+c>eps ){
				tp[ ++temp ] = Intersection( res[i],res[i+1],a,b,c );
			}
		}
	}
	for( int i=1;i<=temp;i++ )
		res[i] = tp[i];
	res[ 0 ] = res[ temp ];
	res[ temp+1 ] = res[ 1 ];
	cnt = temp;
}
bool solve( int n,double r ){
	for( int i=0;i<=n+1;i++ )
		res[ i ] = pnt[ i ];
	int cnt = n;
	for(int i=1;i<=n;i++){  
        double a,b,c;  
        Point p1,p2,p3;  
        p1.y=pnt[i].x-pnt[i+1].x;p1.x=pnt[i+1].y-pnt[i].y;  
        double k=r/sqrt(p1.x*p1.x+p1.y*p1.y);  
        p1.x=k*p1.x;p1.y=p1.y*k;  
        p2.x=p1.x+pnt[i].x;p2.y=p1.y+pnt[i].y;  
        p3.x=p1.x+pnt[i+1].x;p3.y=p1.y+pnt[i+1].y; 
		
        Get_equation( p2,p3,a,b,c );  
        cut(a,b,c,cnt);  
    }  
	if( cnt<=1 ) return false;
	else return true;
}

int main(){
	int n;
	while( scanf("%d",&n)==1,n ){
		for( int i=1;i<=n;i++ )
			scanf("%lf%lf",&pnt[i].x,&pnt[i].y);
		if( GetArea( pnt,n)<eps )
			reverse( pnt+1,pnt+1+n );
		pnt[0] = pnt[n];
		pnt[n+1] = pnt[1];
		double L,R,mid,ans;
		L = Min;
		R = Max;
		while( R-L>=eps ){//R>L
			mid = (L+R)/2.0;
			if( solve( n,mid )==true ){
				ans = mid;
				L = mid;
			}
			else{
				R = mid;
			}
		}
		printf("%.6lf\n",ans);
	}
	return 0;
}


分享到:
评论

相关推荐

    poj2451半平面交

    计算几何半平面交,poj2451 一题是模版题,这里的代码可以作为模版使用,速度比较快

    poj 800+ 题目源代码,多年做题积累

    《POJ 800+题目源代码:多年编程经验的结晶》 在编程的世界里,POJ(Programming Online Judge)是一个备受程序员喜爱的在线评测系统,它提供了大量的算法题目供用户挑战,以提升编程技能和算法理解能力。这份"poj ...

    acm之半平面交,很少有的好资源

    在计算机科学领域,尤其是在算法竞赛中,掌握半平面交算法对于解决复杂的几何问题至关重要。本文将深入探讨半平面交算法,剖析其在ACM竞赛中的应用,并通过实例进一步说明其应用价值。 首先,我们要明确什么是半...

    半平面相关题解1

    本文将讨论半平面交及其在解决各种几何问题中的应用。 半平面交是指在二维平面上,由一组有向直线所定义的半平面(即直线一侧的区域)的交集。这个问题的关键在于确定这些半平面在特定区域内(例如题目中的正方形[0...

    POJ 新手题目+部分难题 基本数论+图论+组合数学

    2505 2521 2538 2546 2551 2590 2593 2601 2665 2680 2739 2752 2761 2762 2777 2800 2891 2893 2992 3030 3041 3132 3159 3187 3204 3270 3277 3281 3297 3321 3414 3436 3461 3650 3663 3664 3672 3740

    poj2775.rar_poj_poj 27_poj27_poj2775

    标签"poj poj_27 poj27 poj2775"进一步确认了这是一道关于POJ平台的编程挑战,其中"poj_27"可能是表示第27类问题或者某种分类,而"poj27"可能是对"poj2775"的简写。 压缩文件中的"www.pudn.com.txt"可能是一个链接...

    西北工业大学POJ试题C++答案代码+课程设计

    "西北工业大学POJ试题C++答案代码+课程设计"这一标题表明了资源的主要内容,涉及两个核心部分:一是西北工业大学的编程竞赛(POJ,Problem Oriented Judge System)的C++解题代码,二是与这些题目相关的课程设计。...

    ACM-POJ 算法训练指南

    2. **线段交**:计算线段是否相交及交点位置(poj3176, poj1080, poj1159)。 ### 七、概率统计 1. **概率计算**:计算随机事件的概率(POJ3252, poj1850, poj1019, poj1942)。 2. **期望值**:计算期望值问题...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    poj题目分类

    * 较为复杂的动态规划:例如 poj1191、poj1054、poj3280、poj2029、poj2948、poj1925、poj3034。 数学 1. 组合数学: * 加法原理和乘法原理。 * 排列组合。 * 递推关系:例如 poj3252、poj1850、poj1019、poj...

    POJ3009-Curling 2.0【DFS+Vector+回溯+剪枝】

    《POJ3009-Curling 2.0:深度优先搜索、向量、回溯与剪枝的综合应用》 北京大学在线编程平台上的POJ3009题目名为"Curling 2.0",它是一道涉及到算法与数据结构的复杂问题,主要考察了参赛者对深度优先搜索(DFS)、...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    poj各种分类

    标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...

    极角排序:POJ 1696(叉积+深搜)

    标题中的“极角排序”是一种特殊的排序算法,主要用于解决特定问题,例如在平面上的点集按照极角顺序排列。这种排序方式对于处理图形问题,尤其是计算几何领域的问题非常有用。在POJ 1696这个编程题目中,很可能需要...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

    poj训练计划.doc

    根据给定的文件信息,我们可以总结出一份详细的IT知识训练计划,主要针对编程竞赛和算法学习,特别是聚焦于POJ(Problem Online Judge)平台上的题目训练。这份计划分为两个阶段,初级阶段和中级阶段,共计涉及了165...

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

Global site tag (gtag.js) - Google Analytics