hdu 1086 求线段交点
2013-08-02 16:51
309 查看
原址: http://blog.csdn.net/nywsp/article/details/8521559
hdu 1086 求线段焦点数
因为 两向量叉乘==两向量构成的平行四边形(以两向量为邻边)的面积 , 所以上面的公式也不难理解.
而且由于向量是有方向的, 所以面积也是有方向的, 通常我们以逆时针为正, 顺时针为负数.
改良算法关键点就是:
如果"线段ab和点c构成的三角形面积"与"线段ab和点d构成的三角形面积" 构成的三角形面积的正负符号相异,
那么点c和点d位于线段ab两侧. 如下图所示:
View Code
hdu 1086 求线段焦点数
因为 两向量叉乘==两向量构成的平行四边形(以两向量为邻边)的面积 , 所以上面的公式也不难理解.
而且由于向量是有方向的, 所以面积也是有方向的, 通常我们以逆时针为正, 顺时针为负数.
改良算法关键点就是:
如果"线段ab和点c构成的三角形面积"与"线段ab和点d构成的三角形面积" 构成的三角形面积的正负符号相异,
那么点c和点d位于线段ab两侧. 如下图所示:
#include<iostream> #include<math.h> #include<stdio.h> using namespace std; struct as { double x; double y; }p[210]; int is_cm(as a,as b,as c,as d)//判断是否相交 { double Sabc=(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); double Sabd=(b.x-a.x)*(d.y-a.y)-(b.y-a.y)*(d.x-a.x); if(Sabc*Sabd>0) return 0; double Scda=(d.x-c.x)*(a.y-c.y)-(d.y-c.y)*(a.x-c.x); double Scdb=(d.x-c.x)*(b.y-c.y)-(d.y-c.y)*(b.x-c.x); if(Scda*Scdb<=0) return 1; else return 0; } int main() { int n,i,j,sum; while(cin>>n,n) { sum=0; for(i=0;i<2*n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); for(i=0;i<2*n;i+=2) for(j=i+2;j<2*n;j+=2) if(is_cm(p[i],p[i+1],p[j],p[j+1])) sum++; cout<<sum<<endl; } }
View Code
相关文章推荐
- HDU 1086 计算几何 求线段交点(吉大模板)
- HDU 1086 You can Solve a Geometry Problem too(线段交点个数)
- HDU 1086 You can Solve a Geometry Problem too(求线段交点数)
- hdu 1086 计算几何 求线段有多少个交点
- hdu 1086 You can Solve a Geometry Problem too(线段相交的交点个数)
- 向量判断HDU 1086 线段交点 You can Solve a Geometry Problem too
- hdu 1086(计算几何入门题——计算线段交点个数)
- hdu 1086 求线段交点
- hdu 1086 判断交点
- hdu 1086(判断线段相交)
- 【计算几何初步-线段相交】【HDU1089】线段交点
- hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)
- hdu 1086 You can Solve a Geometry Problem too 线段相交 包含端点
- hdu 1086 判断两线段是否相交 (线段和直接是否相交)
- HDU 1086 You can Solve a Geometry Problem too(判断两线段是否相交)跨立实验
- HDU 1086 线段相交(不规范相交模板)
- hdu 1086:You can Solve a Geometry Problem too(计算几何,判断两线段相交,水题)
- HDU 1086 You can Solve a Geometry Problem too (判断线段相交)
- hdu 1086线段相交模板
- HDU 1086 You can Solve a Geometry Problem too(简单的线段相交)