简单的点与直线的几何模板

<span style="font-size:18px;">点到直线距离,直线相交交点,线段相交,向量点乘,向量叉乘,三角形有向面积,点到直线距离。</span>
struct point{
double x,y;
point(double x=0,double y=0):x(x),y(y) { }
};
typedef point V;
struct circle{
point c;
double r;
circle(point c,double r):c(c),r(r){}
point Point(double a){
return point(c.x+cos(a)*r,+c.y+sin(a)*r);
}
};
struct line{
point c;
V v;
};
V operator + (V a,V b){ return V(a.x+b.x,a.y+b.y);}
V operator - (V a,V b){ return V(a.x-b.x,a.y-b.y);}
V operator * (V a,double p){return V(a.x*p,a.y*p);}
V operator / (V a,double p){return V(a.x/p,a.y/p);}
bool operator < (const V& a,const V& b){
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
const double eps = 1e-10;
int dcmp(double x){
    if(fabs(x)<eps) return 0;
    else
        return x<0?-1:1;
}
bool operator == (const point& a,const point& b){
return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}

double dot(V a,V b){return a.x*b.x+a.y*b.y; }
double length(V a){return sqrt(dot(a,a));}
double angle(V a,V b){return acos(dot(a,b)/length(a)/length(b)); }
double cross(V a,V b){return a.x*b.y-a.y*b.x; }
double area2(point a,point b,point c){return cross(b-a,c-a); }

/*two line change point返回两线交点(保证有唯一交点)*/
point twolineispoint(point p,V v,point q,V w){
    V u=p-q;
    double t=cross(w,u)/cross(v,w);
    return p+v*t;
}
/*线段是否相交*/
bool segmentmeet(point a1,point a2,point b1,point b2){
    double c1=cross(a2-a1,b1-a1),c2=cross(a2-a1,b2-a1),
           c3=cross(b2-b1,a1-b1),c4=cross(b2-b1,a1-b1);
    return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
}
/*点到直线距离*/
point pointtoline(point p,point a,point b){
    V v1=b-a,v2=p-a;
    return fabs(cross(v1,v2))/length(v1);
}

时间: 2024-08-27 22:53:14

简单的点与直线的几何模板的相关文章

LA 4127 - The Sky is the Limit (离散化 扫描线 几何模板)

题目链接 非原创 原创地址:http://blog.csdn.net/jingqi814/article/details/26117241 题意:输入n座山的信息(山的横坐标,高度,山底宽度),计算他们的轮廓线, 即露出来的表面边长,有些山是重叠的不计.空白地带不计,每座山都是等腰三角形. 分析:大白书P414页. 求小山的总长度,用一些虚线将其离散化,分成一段一段的,特征点:山脚,山顶,交点.这样就能保 证相邻两个扫描点之间再无交点.然后一最上面的点就是分割点,维护上一个点lastp即可. 1

【几何模板加点小思路】hdu-4998 Rotate

用几何模板敲的,也有直接公式推的,追求短代码的可以点右上角小红了...... 题意就是想想一个物体分别做绕某一点(给出坐标)旋转p度(给出角度)后,其位置等价于绕哪一点旋转多少度,输出该等价点及其等价角度. 其实就是找两个定点,然后看这两个定点旋转后到了哪,分别连接原点与旋转后的点会得到两条线段,两条线段垂直平分线的交点即是等价后绕其旋转的点,再将该交点与任一原点及其旋转后的点连接得到的夹角(咖啡色角)即等价后的旋转角度. 附代码 1 #include <cstdio> 2 #include

iOS:quartz2D绘图(画一些简单的图形,如直线、三角形、圆、矩形、文字等)

前一篇几乎已经详细介绍了Quartz2D的所有知识,这一篇以及后面就不废话了,主要是用具体的实例来演示绘图效果. 这里我们先来绘制一些简单的图形(如直线.三角形.圆.矩形.文字.图像),它有两种方式可以绘制,一种是通过上下文绘制,另一种是通过路径绘制.下面对绘制三角形做了一个两种方式绘制的演示. 绘制基本的图形,需要在操作的视图类中重写- (void)drawRect:(CGRect)rect方法,并在在该方法中绘制图形.绘制图像既可以重写该方法绘制,也可以不用重写该方法,它有封装好的方法.这里

算法总结之几何模板

一 几何公式 三角形: 1. 半周长 P=(a+b+c)/2 2. 面积 S=aHa/2=absin(C)/2=sqrt(P(P-a)(P-b)(P-c)) 3. 中线 Ma=sqrt(2(b^2+c^2)-a^2)/2=sqrt(b^2+c^2+2bccos(A))/2 4. 角平分线 Ta=sqrt(bc((b+c)^2-a^2))/(b+c)=2bccos(A/2)/(b+c) 5. 高线 Ha=bsin(C)=csin(B)=sqrt(b^2-((a^2+b^2-c^2)/(2a))^2

HDU 5120 Intersection(几何模板题)

题意:给定两个圆环,求两个圆环相交的面积. 思路:由于圆心和半径不一样,分了好多种情况,后来发现只要把两个圆相交的函数写好之后就不需要那么复杂了.两个圆相交的面积的模板如下: double area_of_overlap(point c1, double r1, point c2, double r2) { double d = dist(c1, c2); if (sgn(d - r1 - r2) >= 0) return 0; if (sgn(fabs(r1 - r2) - d) >= 0)

hdoj 2050 折线分割平面 【几何模板】

折线分割平面 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17229    Accepted Submission(s): 11890 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平

hdoj 1290 献给杭电五十周年校庆的礼物 【几何模板】

献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7597    Accepted Submission(s): 4145 Problem Description 或许你曾经牢骚满腹 或许你依然心怀忧伤 或许你近在咫尺 或许你我天各一方 对于每一个学子 母校 永远航行在 生命的海洋 今年是我们杭电建校五十周年,

简单的企业会议管理cms后台模板——后台

链接:http://pan.baidu.com/s/1eRAVAka 密码:olr1

hdu 1213 (How Many Tables)(简单的并查集,纯模板)

How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14081    Accepted Submission(s): 6912 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinn