【计算几何】CDOJ1720 几何几何

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define EPS 0.00000001
struct Point{
	double x,y;
}a[2],b[2];
typedef Point Vector;
Vector operator * (const double &a,const Vector &v){
	return (Vector){a*v.x,a*v.y};
}
Vector operator - (const Point &a,const Point &b){
	return (Vector){a.x-b.x,a.y-b.y};
}
Vector operator + (const Vector &a,const Vector &b){
	return (Vector){a.x+b.x,a.y+b.y};
}
double Cross(const Vector &a,const Vector &b){
	return a.x*b.y-a.y*b.x;
}
Point GetIntersection(Point P,Vector v,Point Q,Vector w){
	return P+(Cross(w,P-Q)/Cross(v,w))*v;
}
bool inLine(Point p,Point a,Point b){
	if(a.x>b.x){
		swap(a,b);
	}
	if(p.x-a.x>-EPS && b.x-p.x>-EPS){
		return 1;
	}
	return 0;
}
int main(){
	while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a[0].x,&a[0].y,&a[1].x,&a[1].y,&b[0].x,&b[0].y,&b[1].x,&b[1].y)!=EOF){
		if(fabs(a[0].y-a[1].y)<EPS || fabs(b[0].y-b[1].y)<EPS){
			puts("0.00");
			continue;
		}
		if(fabs(Cross(a[0]-a[1],b[0]-b[1]))<EPS){
			puts("0.00");
			continue;
		}
		if(a[0].y<a[1].y){
			swap(a[0],a[1]);
		}
		if(b[0].y<b[1].y){
			swap(b[0],b[1]);
		}
		Point p=GetIntersection(a[0],a[1]-a[0],b[0],b[1]-b[0]);
		if((!inLine(p,a[0],a[1])) || (!inLine(p,b[0],b[1]))){
			puts("0.00");
			continue;
		}
		if(a[0].y<b[0].y){
			swap(a[0],b[0]);
			swap(a[1],b[1]);
		}
		if(fabs(a[0].y-b[0].y)<EPS){
			printf("%.2f\n",fabs(a[0].x-b[0].x)*0.5*fabs(p.y-a[0].y));
			continue;
		}
		if((!fabs(a[0].x-a[1].x)<EPS) && (!fabs(b[0].x-b[1].x)<EPS)){
			double ka=(a[0].y-a[1].y)/(a[0].x-a[1].x);
			double kb=(b[0].y-b[1].y)/(b[0].x-b[1].x);
			if((ka>EPS && kb>EPS) || (ka<EPS && kb<EPS)){
				if(fabs(ka)-fabs(kb)>EPS){
					if((a[0].x-b[0].x<EPS && p.x-b[0].x>-EPS) || (a[0].x-b[0].x>-EPS && p.x-b[0].x<EPS)){
						puts("0.00");
						continue;
					}
				}
			}
		}
		double rr=(b[0].y-p.y)/(a[0].y-p.y);
		Point bc=p+rr*(a[0]-p);
		printf("%.2f\n",0.5*(b[0].y-p.y)*fabs(bc.x-b[0].x));
	}
	return 0;
}
时间: 2025-01-08 03:12:16

【计算几何】CDOJ1720 几何几何的相关文章

计算几何--二维几何常用算法

内容参考书籍——<算法竞赛入门经典训练指南> 在程序中,用顶点数组表示多边形,其中各个顶点按照逆时针顺序排列. 判断点是否在多边形内.采用转角法,基本思想是计算多边形相对于判定点转了多少度,具体来说,将多边形每条边的转角加起来,如果是360°,说明在多边形内:如果是0°,说明在多边形如果是180°则在多边形边界上.该方法在处理一些弧形多边形时丝毫不受影响,只需要每一段的终点到起点的转角累加起来即可.另外这个三角形甚至可以不是简单多边形(即可以自交). 然而,直接计算会使用大量的反三角函数,不仅

UVA12304 2D Geometry 110 in 1! 计算几何

计算几何: 堆几何模版就可以了.... Description Problem E 2D Geometry 110 in 1! This is a collection of 110 (in binary) 2D geometry problems. CircumscribedCircle x1 y1 x2 y2 x3 y3 Find out the circumscribed circle of triangle (x1,y1)-(x2,y2)-(x3,y3). These three poi

计算几何 val.2

目录 计算几何 val.2 几何单位结构体板子 旋转卡壳 基础概念 求法 模板 半平面交 前置芝士:线段交 S&I算法 模板 最小圆覆盖 随机增量法 时间复杂度 模板 后记 计算几何 val.2 前置芝士:基础操作以及凸包 本文主要写旋转卡壳.半平面交.最小圆覆盖要注意的内容 几何单位结构体板子 不全(我知道 struct point{ double x,y; point(double x=0,double y=0): x(x),y(y){} //构造函数,非常方便 double operato

数学词汇

算数-整数 integer consecutive integer positive whole integer negative whole integer even / even integer odd /odd integer real number divisor remainder composite number quotient prime numberprime factorsuccessive adj 连续的score n 二十consecutive adj 连续的sonsta

LA 3263 好看的一笔画 欧拉几何+计算几何模板

题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> using namespace std; struct Point { double x, y; Point(double x = 0, double y = 0) : x(x) , y(y) { } }; typedef Point V

NOIP2002矩形覆盖[几何DFS]

题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴.当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4.问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢.约定:覆盖一个点的矩形面积为 0:覆盖平行于坐标轴

一天一道算法题--6.13---计算几何

感谢微信平台---一天一道算法题---每天多一点进步 本来 想在世界杯之前 可以 开开心心地A了今天的算法题  .... 竟然是计算几何 我高数 那么渣....... 这题 先放着吧..... 哎.... 链接 还是一样先放出来 . touch me 平常这个点 再过会 就应该要碎觉了 今天 = 个揭幕战 累死我的节奏,,, 现在去做点什么呢........... 一天一道算法题--6.13---计算几何,布布扣,bubuko.com

几个开源几何计算数学库

简单介绍几个计算几何的资源 a) Geos Geos的全称就是Geometry Engine Open Source,参考网站就是:http://geos.refractions.net,从名称就可以看出,Geos就是判断几何体的过程. Geos是用C++语言写的处理计算几何的开源库. b) CGAL CGAL的全称就是Computational Geometry Algorithms Library,参考网站就是:http://www.cgal.org,从名称就可以看出,CGAL就是计算几何的

问题:在什么场合应当用几何平均值,而不是用算术平均值?!

问题:在什么场合应当用几何平均值,而不是用算术平均值?! (7.6日注,也许题目改为在什么场合使用代数(几何,…)平均值合适?更妥当) 人们在很多场合(学生成绩统计.社会经济统计和科学实验等…)进行平均值的统计计算(先求N个样本的合计值再以样本数N除之).这种平均值称为代数(或者算术)平均值.其实数学还推荐几何平均值(它是样本值的连乘积再开N次方),以至调和平均值(样本值的倒数的代数平均).在没有计算器或者计算机的时代,自然是代数平均值最容易计算,人们就习以为常地使用代数平均值了.但是现在计算机