九野的计算几何模版

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
#define point Point
const double eps = 1e-8;
const double PI = acos(-1.0);
double ABS(double x){return x>0?

x:-x;}
int sgn(double x){
	if(fabs(x) < eps)return 0;
	if(x < 0)return -1;
	else return 1;
}
struct Point
{
	double x,y;
	void put(){printf("(%.0lf,%.0lf)\n",x,y);}
	Point(){}
	Point(double _x,double _y){
	x = _x;y = _y;
	}
	Point operator -(const Point &b)const{
		return Point(x - b.x,y - b.y);
	}
	//叉积
	double operator ^(const Point &b)const{
		return x*b.y - y*b.x;
	}
	//点积
	double operator *(const Point &b)const{
		return x*b.x + y*b.y;
	}
	//绕原点旋转角度B(弧度值),后x,y的变化
	void transXY(double B){
		double tx = x,ty = y;
		x = tx*cos(B) - ty*sin(B);
		y = tx*sin(B) + ty*cos(B);
	}
};
struct Line
{
	Point s,e;
	void put(){s.put();e.put();}
	Line(){}
	Line(Point _s,Point _e)
	{
	s = _s;e = _e;
	}
	//两直线相交求交点
	//第一个值为0表示直线重合。为1表示平行,为0表示相交,为2是相交
	//仅仅有第一个值为2时,交点才有意义
	pair<int,Point> operator &(const Line &b)const{
		Point res = s;
		if(sgn((s-e)^(b.s-b.e)) == 0)
		{
		if(sgn((s-b.e)^(b.s-b.e)) == 0)
		return make_pair(0,res);//重合
		else return make_pair(1,res);//平行
		}
		double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
		res.x += (e.x-s.x)*t;
		res.y += (e.y-s.y)*t;
		return make_pair(2,res);
	}
};
double dist(Point a,Point b){return sqrt((a-b)*(a-b));}
//*推断线段相交
bool inter(Line l1,Line l2){
	return
	max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&
	max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&
	max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&
	max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&
	sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= 0 &&
	sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= 0;
}
point symmetric_point(point p1, point l1, point l2){ //p1关于直线(l1,l2)的对称点
	point ret;
	if(ABS(l1.x-l2.x)<eps){
		ret.y = p1.y;
		ret.x = 2*l1.x - p1.x;
		return ret;
	}
	if(ABS(l1.y-l2.y)<eps) {
		ret.x = p1.x;
		ret.y = 2*l1.y - p1.y;
		return ret;
	}
	if (l1.x > l2.x - eps && l1.x < l2.x + eps)
	{
	ret.x = (2 * l1.x - p1.x);
	ret.y = p1.y;
	}
	else
	{
	double k = (l1.y - l2.y ) / (l1.x - l2.x);
	ret.x = (2*k*k*l1.x + 2*k*p1.y - 2*k*l1.y - k*k*p1.x + p1.x) / (1 + k*k);
	ret.y = p1.y - (ret.x - p1.x ) / k;
	}
	return ret;
}
bool gongxian(Point a, Point b, Point c){
	return ABS((a.y-b.y)*(a.x-c.x) - (a.y-c.y)*(a.x-b.x))<eps;
}
时间: 2024-10-10 05:19:47

九野的计算几何模版的相关文章

三维计算几何模版

网上找了一个三维计算几何模版,完善了一下,使它能使用了... #include <cstdio> #include <cstring> #include <algorithm> using namespace std; /***********基础*************/ const double EPS=0.000001; typedef struct Point_3D { double x, y, z; Point_3D(double xx = 0, doubl

计算几何模版

此模板包含了一些基本简单的二维几何问题, 1三角形外接圆            2三角形内切圆 3过圆外某点切线的角度    4过某条直线外一点半径为r的圆 5和两条相交直线相切的半径为r的圆         6和两个相离的圆相切的圆 1.计算向量点积, 叉积, 长度, 夹角, 向量的旋转(逆时针), 向量的单位法线 2.计算两点距离, 点到直线距离,两直线交点, 点到线段距离, 点在直线的投影,将直线AB沿法线方向平移d得到的直线EF 3. 圆与直线的交点(相离,没有交点, 相切一个交点, 相

计算几何好模板

来自九野大神的博 #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double EPS = 1e-9; const int MAXN = 40; struct Point3 //空间点 { double x, y, z; Point3( double x=

SPOJ 375 树链剖分

点击打开链接 题意:给个树和树上的权值,两个操作,Q u v,问u到v的边上的最大权值,C u v,将第u条边的权值改为v 思路:今天学了学树链剖分,这题是个检验模版的题目,理论我是解释不清楚的,自己在九野聚聚那学来的一份模版 #include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <a

POJ 3070 Fibonacci (初学矩阵快速幂)

按往常一样,记下一些好的资料: http://www.matrix67.com/blog/archives/276 这是矩阵乘法10个经典的题目,其中最后一题的最后一段在该文的评论中给出. 矩阵乘法满足结合律保证了矩阵快速幂的正确性. 目前的代码风格是学了九野的模版风格(http://blog.csdn.net/acmmmm/article/details/10041141) #define Matr 10 //矩阵大小,注意能小就小 struct mat//矩阵结构体,a表示内容,size大小

hdu 2295 &amp;&amp;hdu 5046

第一个题目的意思是有n个城市和m个雷达.你最多可以用k个雷达,问使用最小多少的半径可以使k个雷达覆盖n个城市. 第二个是九野要从n个城市选择k个城市建造机场,问最小的最大城市距离是多少 都是舞蹈链+剪枝+二分计算路径 贴第二题代码 #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int M = 110;

寒假总结。。。

虽然刷了4章usaco,但跟没有刷一样,唯一有印象的就是判大素数模版,反着做背包的dp,反着做数位dp(逆向思维),对lis统计的判重,还有连通分量有了一点大概的印象,还有更加坚信了构造就是找规律,然后提高了一下代码能力,没了. 这个寒假最失败的一点就是把白天和夜晚倒过来过,白天睡觉,晚上刷题,这样好累,做题的效率好低..今天一定要把时间调整过来. 还有三天,我的寒假还没有结束!三天搞6个专题(其实是5个半,splay再写几道经典题就结束了,然后LCT应该很好学,和splay有联系),我的寒假才

hdu 4496 D-City

这题是并查集的应用 . 如果看出来怎么解答确实很快.套模板就可以了. 可惜自己太菜,没想出来. 比赛的时候想到要反向,不过事实证明还是思路错了. 做的题目太少的缘故,多做点题目,多见见世面. 题目的意思大概是每次删除一些边,然后问你有多少块.明显的并查集. 可以通过反向建图,就是对所有的状态取反,所以要从最后一条边开始建图. 感谢 http://blog.csdn.net/acmmmm/article/details/10820117 九野的博客  点明了想法. 1 #include<algor

(二)Spring框架之JDBC的基本使用

案例一: 用Spring IOC方式使用JDBC Test_2.java package jdbc; import java.lang.Thread.State; import java.sql.Connection; import java.sql.Statement; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.co