计算几何模板
来源:互联网 发布:淘宝服装图片拍摄 编辑:程序博客网 时间:2024/06/17 20:34
#include <bits/stdc++.h>
using namespace std;
#define EPS 1e-10
double add(double a,double b)
{
if(abs(a+b)<EPS*(abs(a)+abs(b))) return 0;
return a+b;
}
struct P
{
double x,y;
P(){}
P(double x,double y): x(x),y(y){}
P operator +(P p) {
return P(add(x,p.x),add(y,p.y));
}
P operator -(P p) {
return P(add(x,-p.x),add(y,-p.y));
}
P operator *(double d) {
return P(x*d,y*d);
}
P operator /(double d) {
return P(x/d,y/d);
}
bool operator == (P p) { //判断两个向量是否相等;
return x==p.x&&y==p.y;
}
double dot(P p) { //向量内积,内积等于0表示两条实现垂直
return add(x*p.x,y*p.y);
}
double det(P p) { //向量叉积,外积等于0表示在一条直线上
return add(x*p.y,-y*p.x);
}
}p[500];
bool on_seg(P p1,P p2,P q)//判断点q是否在线段p1,p2上
{
return (p1-q).det(p2-q)==0&&(p1-q).dot(p2-q)<=0;
}
P intersection(P p1,P p2,P q1,P q2)//计算直线p1-p2与q1-q2的交点
{
return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
}
double length(P a) { return sqrt(a.dot(a)); } //求向量长度
double angle(P a, P b) {return acos(a.dot(b)/length(a)/length(b));}//求向量之间的夹角
double area3(P a, P b, P c) { return (b-a).det(c-a); } //求三角形面积
P Rotate(P a, double rad) {//rad是弧度,返回向量a旋转rad度后的向量
return P(a.x*cos(rad)-a.y*sin(rad), a.x*sin(rad)+a.y*cos(rad));
}
P normal(P a) { //向量单位法向量,调用前请确保a不是零向量
double l=length(a);
return P(-a.y/l, a.x/l);
}
//点p到直线ab的距离
double DistanceToLine(P p, P a, P b) {
P v1 = b-a,v2 =p-a;
return fabs(v1.det(v2) / length(v1)); //如果不取绝对值,得到的是有向距离
}
int dcmp(double x) { //判断x是正负0
if(fabs(x)<EPS) return 0; else return x < 0 ? -1 : 1;
}
//点p到线段ab距离
double DistanceToSegment(P p, P a, P b) {
if(a==b) return length(p-a);
P v1 = b-a,v2=p-a, v3 = p-b;
if(dcmp(v1.dot(v2))<0) return length(v2);
else if(dcmp(v1.dot(v3))>0) return length(v3);
else return fabs(v1.det(v2)) / length(v1);
}
P GetLineProjection(P p, P a, P b) {//点P在a,b上的投影
P v =b-a;
return a+v*(v.dot(p-a)/v.dot(v));
}
//线段相交判定
bool SegmentProperIntersection(P a1, P a2, P b1, P b2) {
double c1=(a2-a1).det(b1-a1), c2=(a2 - a1).det( b2 - a1),
c3 = (b2 - b1).det( a1 - b1), c4 = (b2 - b1).det( a2 - b1);
return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
}
double ConvexPolygonArea(P* p, int n) {
double area = 0;
for(int i = 1; i < n-1; i++)
area+=(p[i]-p[0]).det(p[i + 1]-p[0]);
return area / 2;
}
int main()
{
return 0;
}
using namespace std;
#define EPS 1e-10
double add(double a,double b)
{
if(abs(a+b)<EPS*(abs(a)+abs(b))) return 0;
return a+b;
}
struct P
{
double x,y;
P(){}
P(double x,double y): x(x),y(y){}
P operator +(P p) {
return P(add(x,p.x),add(y,p.y));
}
P operator -(P p) {
return P(add(x,-p.x),add(y,-p.y));
}
P operator *(double d) {
return P(x*d,y*d);
}
P operator /(double d) {
return P(x/d,y/d);
}
bool operator == (P p) { //判断两个向量是否相等;
return x==p.x&&y==p.y;
}
double dot(P p) { //向量内积,内积等于0表示两条实现垂直
return add(x*p.x,y*p.y);
}
double det(P p) { //向量叉积,外积等于0表示在一条直线上
return add(x*p.y,-y*p.x);
}
}p[500];
bool on_seg(P p1,P p2,P q)//判断点q是否在线段p1,p2上
{
return (p1-q).det(p2-q)==0&&(p1-q).dot(p2-q)<=0;
}
P intersection(P p1,P p2,P q1,P q2)//计算直线p1-p2与q1-q2的交点
{
return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
}
double length(P a) { return sqrt(a.dot(a)); } //求向量长度
double angle(P a, P b) {return acos(a.dot(b)/length(a)/length(b));}//求向量之间的夹角
double area3(P a, P b, P c) { return (b-a).det(c-a); } //求三角形面积
P Rotate(P a, double rad) {//rad是弧度,返回向量a旋转rad度后的向量
return P(a.x*cos(rad)-a.y*sin(rad), a.x*sin(rad)+a.y*cos(rad));
}
P normal(P a) { //向量单位法向量,调用前请确保a不是零向量
double l=length(a);
return P(-a.y/l, a.x/l);
}
//点p到直线ab的距离
double DistanceToLine(P p, P a, P b) {
P v1 = b-a,v2 =p-a;
return fabs(v1.det(v2) / length(v1)); //如果不取绝对值,得到的是有向距离
}
int dcmp(double x) { //判断x是正负0
if(fabs(x)<EPS) return 0; else return x < 0 ? -1 : 1;
}
//点p到线段ab距离
double DistanceToSegment(P p, P a, P b) {
if(a==b) return length(p-a);
P v1 = b-a,v2=p-a, v3 = p-b;
if(dcmp(v1.dot(v2))<0) return length(v2);
else if(dcmp(v1.dot(v3))>0) return length(v3);
else return fabs(v1.det(v2)) / length(v1);
}
P GetLineProjection(P p, P a, P b) {//点P在a,b上的投影
P v =b-a;
return a+v*(v.dot(p-a)/v.dot(v));
}
//线段相交判定
bool SegmentProperIntersection(P a1, P a2, P b1, P b2) {
double c1=(a2-a1).det(b1-a1), c2=(a2 - a1).det( b2 - a1),
c3 = (b2 - b1).det( a1 - b1), c4 = (b2 - b1).det( a2 - b1);
return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
}
double ConvexPolygonArea(P* p, int n) {
double area = 0;
for(int i = 1; i < n-1; i++)
area+=(p[i]-p[0]).det(p[i + 1]-p[0]);
return area / 2;
}
int main()
{
return 0;
}
0 0
- [模板]计算几何模板
- 经典计算几何模板
- 计算几何模板2
- 计算几何 模板
- 计算几何模板
- 计算几何经典模板
- 计算几何模板
- ACM计算几何模板
- 计算几何模板
- 计算几何模板
- 计算几何模板
- 计算几何 模板
- 计算几何初步模板
- 计算几何三维模板
- 二维计算几何模板
- 计算几何模板
- 计算几何模板
- 计算几何的模板
- dede二次开发--------常用标签总结1
- leetcode解题之122# Best Time to Buy and Sell Stock II
- HFUTOJ problem 1357实现总结
- java 中不支持多继承的原因
- GCC之C 语言编译过程
- 计算几何模板
- vb.net 教程 5-4 颜色
- String,StringBuffer与StringBuilder的区别
- [leetcode]190. Reverse Bits
- python之装饰器的学习
- maven web项目不能创建src/main/java等文件夹的问题
- 2017年最好的JavaScript插件
- 树的遍历(非递归实现)
- KMP算法学习