求出所有线段的交点,然后利用叉乘求四边形面积即可。

  1. //
  2. // main.cpp
  3. // poj1408
  4. //
  5. // Created by 陈加寿 on 15/12/31.
  6. // Copyright (c) 2015年 chenhuan001. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <cmath>
  11. #include <vector>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <algorithm>
  15. using namespace std;
  16.  
  17. #define MAX_N 110
  18.  
  19. ///////////////////////////////////////////////////////////////////
  20. //常量区
  21. const double INF = 1e10; // 无穷大
  22. const double EPS = 1e-; // 计算精度
  23. const double PI = acos(-1.0);// PI
  24. const int PINXING = ; // 平行
  25. const int XIANGJIAO = ; // 相交
  26. const int XIANGLI = ; // 相离
  27. const int GONGXIAN = ; // 共线
  28. const int CHONGDIE = -; // 重叠
  29.  
  30. ///////////////////////////////////////////////////////////////////
  31.  
  32. ///////////////////////////////////////////////////////////////////
  33. //类型定义区
  34. struct Point { // 二维点或矢量
  35. double x, y;
  36. double angle, dis;
  37. Point() {}
  38. Point(double x0, double y0): x(x0), y(y0) {}
  39. };
  40. struct Point3D { //三维点或矢量
  41. double x, y, z;
  42. Point3D() {}
  43. Point3D(double x0, double y0, double z0): x(x0), y(y0), z(z0) {}
  44. };
  45. struct Line { // 二维的直线或线段
  46. Point p1, p2;
  47. Line() {}
  48. Line(Point p10, Point p20): p1(p10), p2(p20) {}
  49. };
  50. struct Line3D { // 三维的直线或线段
  51. Point3D p1, p2;
  52. Line3D() {}
  53. Line3D(Point3D p10, Point3D p20): p1(p10), p2(p20) {}
  54. };
  55. struct Rect { // 用长宽表示矩形的方法 w, h分别表示宽度和高度
  56. double w, h;
  57. Rect() {}
  58. Rect(double _w,double _h) : w(_w),h(_h) {}
  59. };
  60. struct Rect_2 { // 表示矩形,左下角坐标是(xl, yl),右上角坐标是(xh, yh)
  61. double xl, yl, xh, yh;
  62. Rect_2() {}
  63. Rect_2(double _xl,double _yl,double _xh,double _yh) : xl(_xl),yl(_yl),xh(_xh),yh(_yh) {}
  64. };
  65. struct Circle { //圆
  66. Point c;
  67. double r;
  68. Circle() {}
  69. Circle(Point _c,double _r) :c(_c),r(_r) {}
  70. };
  71.  
  72. typedef vector<Point> Polygon; // 二维多边形
  73. typedef vector<Point> Points; // 二维点集
  74.  
  75. ///////////////////////////////////////////////////////////////////
  76.  
  77. ///////////////////////////////////////////////////////////////////
  78. //基本函数区
  79. inline double max(double x,double y)
  80. {
  81. return x > y ? x : y;
  82. }
  83. inline double min(double x, double y)
  84. {
  85. return x > y ? y : x;
  86. }
  87. inline bool ZERO(double x) // x == 0
  88. {
  89. return (fabs(x) < EPS);
  90. }
  91. inline bool ZERO(Point p) // p == 0
  92. {
  93. return (ZERO(p.x) && ZERO(p.y));
  94. }
  95. inline bool ZERO(Point3D p) // p == 0
  96. {
  97. return (ZERO(p.x) && ZERO(p.y) && ZERO(p.z));
  98. }
  99. inline bool EQ(double x, double y) // eqaul, x == y
  100. {
  101. return (fabs(x - y) < EPS);
  102. }
  103. inline bool NEQ(double x, double y) // not equal, x != y
  104. {
  105. return (fabs(x - y) >= EPS);
  106. }
  107. inline bool LT(double x, double y) // less than, x < y
  108. {
  109. return ( NEQ(x, y) && (x < y) );
  110. }
  111. inline bool GT(double x, double y) // greater than, x > y
  112. {
  113. return ( NEQ(x, y) && (x > y) );
  114. }
  115. inline bool LEQ(double x, double y) // less equal, x <= y
  116. {
  117. return ( EQ(x, y) || (x < y) );
  118. }
  119. inline bool GEQ(double x, double y) // greater equal, x >= y
  120. {
  121. return ( EQ(x, y) || (x > y) );
  122. }
  123. // 注意!!!
  124. // 如果是一个很小的负的浮点数
  125. // 保留有效位数输出的时候会出现-0.000这样的形式,
  126. // 前面多了一个负号
  127. // 这就会导致错误!!!!!!
  128. // 因此在输出浮点数之前,一定要调用次函数进行修正!
  129. inline double FIX(double x)
  130. {
  131. return (fabs(x) < EPS) ? : x;
  132. }
  133. //////////////////////////////////////////////////////////////////////////////////////
  134.  
  135. /////////////////////////////////////////////////////////////////////////////////////
  136. //二维矢量运算重载
  137. bool operator==(Point p1, Point p2)
  138. {
  139. return ( EQ(p1.x, p2.x) && EQ(p1.y, p2.y) );
  140. }
  141. bool operator!=(Point p1, Point p2)
  142. {
  143. return ( NEQ(p1.x, p2.x) || NEQ(p1.y, p2.y) );
  144. }
  145. bool operator<(Point p1, Point p2)
  146. {
  147. if (NEQ(p1.x, p2.x)) {
  148. return (p1.x < p2.x);
  149. } else {
  150. return (p1.y < p2.y);
  151. }
  152. }
  153. Point operator+(Point p1, Point p2)
  154. {
  155. return Point(p1.x + p2.x, p1.y + p2.y);
  156. }
  157. Point operator-(Point p1, Point p2)
  158. {
  159. return Point(p1.x - p2.x, p1.y - p2.y);
  160. }
  161. double operator*(Point p1, Point p2) // 计算叉乘 p1 × p2
  162. {
  163. return (p1.x * p2.y - p2.x * p1.y);
  164. }
  165. double operator&(Point p1, Point p2) { // 计算点积 p1·p2
  166. return (p1.x * p2.x + p1.y * p2.y);
  167. }
  168. double Norm(Point p) // 计算矢量p的模
  169. {
  170. return sqrt(p.x * p.x + p.y * p.y);
  171. }
  172.  
  173. /*-------------------基本函数区------------------*/
  174.  
  175. // 把矢量p旋转角度angle (弧度表示)
  176. // angle > 0表示逆时针旋转
  177. // angle < 0表示顺时针旋转
  178. Point Rotate(Point p, double angle)
  179. {
  180. Point result;
  181. result.x = p.x * cos(angle) - p.y * sin(angle);
  182. result.y = p.x * sin(angle) + p.y * cos(angle);
  183. return result;
  184. }
  185.  
  186. // 判断二维平面上点是否在线段上
  187. // 输入:任意点p,和任意直线L
  188. // 输出:p在直线上返回1,否则返回0
  189. bool OnSeg(Point p, Line L)
  190. {
  191. return ( ZERO( (L.p1 - p) * (L.p2 - p) ) &&
  192. LEQ((p.x - L.p1.x)*(p.x - L.p2.x), ) &&
  193. LEQ((p.y - L.p1.y)*(p.y - L.p2.y), ) );
  194. }
  195.  
  196. //求两条直线之间的关系(二维)
  197. //输入:两条不为点的直线
  198. //输出:相交返回XIANGJIAO和点p,平行返回PINGXING,共线返回GONGXIAN
  199. int LineAndLine(Line L1,Line L2,Point &p)
  200. {
  201. Point px,py;
  202. px = L1.p1 - L1.p2;
  203. py = L2.p1 - L2.p2;
  204. if( EQ(px*py,) )//平行或者共线
  205. {
  206. if( ZERO( (L2.p1-L1.p1)*py ) ) //共线
  207. {
  208. return GONGXIAN;
  209. }
  210. return PINXING;
  211. }
  212.  
  213. double xa,xb,xc,ya,yb,yc;
  214. xa=(L1.p2.y-L1.p1.y); xb=(L1.p1.x-L1.p2.x); xc=(L1.p1.y*L1.p2.x-L1.p1.x*L1.p2.y);
  215. ya=(L2.p2.y-L2.p1.y); yb=(L2.p1.x-L2.p2.x); yc=(L2.p1.y*L2.p2.x-L2.p1.x*L2.p2.y);
  216.  
  217. p.y = (xa*yc-xc*ya)/(xb*ya-xa*yb);
  218. p.x = (xb*yc-xc*yb)/(xa*yb-xb*ya);
  219.  
  220. return XIANGJIAO;
  221. }
  222.  
  223. /*---------------------代码区---------------------------*/
  224.  
  225. int SegAndSeg(Line L1,Line L2,Point &p)
  226. {
  227.  
  228. double signx,signy;
  229.  
  230. //跨立实验
  231. if( LEQ(signx=( ((L1.p2-L1.p1)*(L1.p1-L2.p1))*((L1.p2-L1.p1)*(L1.p1-L2.p2)) ),) &&
  232. LEQ(signy=( ((L2.p2-L2.p1)*(L2.p1-L1.p1))*((L2.p2-L2.p1)*(L2.p1-L1.p2)) ),) )
  233. {
  234. if( ZERO(signx) && ZERO(signy) )
  235. {
  236. //线段共线
  237. signx = min( max(L1.p1.x,L1.p2.x),max(L2.p1.x,L2.p2.x) )-
  238. max( min(L1.p1.x,L1.p2.x),min(L2.p1.x,L2.p2.x) );
  239.  
  240. signy = min( max(L1.p1.y,L1.p2.y),max(L2.p1.y,L2.p2.y) )-
  241. max( min(L1.p1.y,L1.p2.y),min(L2.p1.y,L2.p2.y) );
  242.  
  243. if( ZERO(signx) && ZERO(signy) ) //说明共线,且相交一点
  244. {
  245. if(L1.p1==L2.p1||L1.p1==L2.p2) p=L1.p1;
  246. if(L1.p2==L2.p1||L1.p2==L2.p2) p=L1.p2;
  247. return XIANGJIAO;
  248. }
  249. else if( GEQ(signx, ) && GEQ(signy, ) )
  250. {
  251. return CHONGDIE;
  252. }
  253. else
  254. {
  255. return XIANGLI;
  256. }
  257. }
  258. return LineAndLine(L1, L2, p);
  259. }
  260. return XIANGLI;
  261. }
  262.  
  263. int main(int argc, const char * argv[]) {
  264. /*
  265. Line a,b;
  266. while(cin>>a.p1.x>>a.p1.y>>a.p2.x>>a.p2.y)
  267. {
  268. cin>>b.p1.x>>b.p1.y>>b.p2.x>>b.p2.y;
  269. Point p;
  270. int sign=SegAndSeg(a, b, p);
  271. if(sign==XIANGJIAO)
  272. {
  273. printf("相交:(%lf,%lf)\n",p.x,p.y);
  274. }
  275. else if(sign==CHONGDIE) printf("重叠\n");
  276. else if(sign==XIANGLI) printf("相离\n");
  277. }
  278. */
  279. int n;
  280. Line ls[],ls1[];
  281. Point ps[][];
  282. while(scanf("%d",&n) && n)
  283. {
  284. ps[][].x=;
  285. ps[][].y=;
  286. for(int i=;i<n;i++)
  287. {
  288. scanf("%lf",&ls[i].p1.x);
  289. ls[i].p1.y=;
  290.  
  291. ps[][i+].x = ls[i].p1.x;
  292. ps[][i+].y = ;
  293. }
  294. ps[][n+].x=;
  295. ps[][n+].y=;
  296.  
  297. for(int i=;i<n;i++)
  298. {
  299. scanf("%lf",&ls[i].p2.x);
  300. ls[i].p2.y=;
  301. }
  302. for(int i=;i<n;i++)
  303. {
  304. scanf("%lf",&ls1[i].p1.y);
  305. ls1[i].p1.x=;
  306. }
  307. for(int i=;i<n;i++)
  308. {
  309. scanf("%lf",&ls1[i].p2.y);
  310. ls1[i].p2.x=;
  311. }
  312.  
  313. ls1[n].p1.x=; ls1[n].p1.y=;
  314. ls1[n].p2.x=; ls1[n].p2.y=;
  315.  
  316. int a=,b=;
  317. double mi = -;
  318. for(int i=;i<=n;i++)
  319. {
  320. ps[b][] = ls1[i].p1;
  321. for(int j=;j<n;j++)
  322. {
  323. SegAndSeg(ls1[i], ls[j], ps[b][j+]);
  324. }
  325. ps[b][n+] = ls1[i].p2;
  326.  
  327. for(int j=;j<=n;j++)
  328. {
  329. double tmp = fabs( (ps[b][j]-ps[b][j+])*(ps[a][j+]-ps[b][j+]) )/+
  330. fabs( (ps[b][j]-ps[a][j])*(ps[a][j+]-ps[a][j]) )/;
  331. mi=max(tmp,mi);
  332. }
  333. swap(a,b);
  334. }
  335.  
  336. printf("%.6lf\n",mi);
  337. }
  338. return ;
  339. }

poj1408(求线段交点)的更多相关文章

  1. 谈谈"求线段交点"的几种算法(js实现,完整版)

    "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助.  ...

  2. nyoj-1132-promise me a medal(求线段交点)

    题目链接 /* Name:nyoj-1132-promise me a medal Copyright: Author: Date: 2018/4/26 20:26:22 Description: 向 ...

  3. hdu 2857:Mirror and Light(计算几何,点关于直线的对称点,求两线段交点坐标)

    Mirror and Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)

    Area Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 【计算几何初步-线段相交】【HDU1089】线段交点

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  6. js判断向量叉点 并求出交点坐标

     代码如下可以直接运行,判断向量相交并求出交点坐标 <!DOCTYPE html> <html> <head> <meta http-equiv=" ...

  7. UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)

    Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...

  8. POJ_1269_Intersecting Lines_求直线交点

    POJ_1269_Intersecting Lines_求直线交点 Description We all know that a pair of distinct points on a plane ...

  9. sgu 129 Inheritance 凸包,线段交点,计算几何 难度:2

    129. Inheritance time limit per test: 0.25 sec. memory limit per test: 4096 KB The old King decided ...

随机推荐

  1. 为什么代理属性设置成assign为了防止生成保留环来

    循环引用 全部的引用计数系统, 都存在循环应用的问题, 比如以下的引用关系: 1. 对象a创建并引用到了对象b 2. 对象b创建并引用到了对象c 3. 对象c创建并引用到了对象b 这时候b和c的引用计 ...

  2. JPEG编码(二)

    来自CSDN评论区http://bbs.csdn.net/topics/190980 1. 色彩模型 JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, ...

  3. Android——Activity的生命周期

    一,Demo測试Activity的生命周期 写两个Activity: package com.example.activity_04; import android.os.Bundle; import ...

  4. Python线程操作

    一.全局锁 1.在Python中,Python代码的执行由Python虚拟机来控制,而在Python虚拟机中,同一时刻只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序, ...

  5. RFS 理解

    1.背景 网卡接收一个数据包的情况下,会经过三个阶段:   - 网卡产生硬件中断通知CPU有包到达 - 通过软中断处理此数据包 - 在用户态程序处理此数据包   在SMP体系下,这三个阶段有可能在3个 ...

  6. Linux服务器安全登录设置

    在日常运维工作中,对加固服务器的安全设置是一个机器重要的环境.比较推荐的做法是:1)严格限制ssh登陆(参考:Linux系统下的ssh使用(依据个人经验总结)):     修改ssh默认监听端口    ...

  7. node - 关于package.json

    2018-8-3(首次更新) 一.关于版本号: 文章来自:https://blog.csdn.net/yancloudfrontend/article/details/72867314 指定版本:比如 ...

  8. Transform.eulerAngles 欧拉角

    var eulerAngles : Vector3 Description描述 The rotation as Euler angles in degrees. 旋转作为欧拉角度. The x, y, ...

  9. 使用Gulp定制前端开发环境

    1.安装package.json中依赖了的组件 npm install 2.来到本地路径,创建工程配置文件 npm init 3.本地安装gulp npm install gulp --save-de ...

  10. STL学习笔记(移除性算法)

    本节所列的算法是根据元素值或某一准则,在一个区间内移除某些元素. 这些算法并不能改变元素的数量,它们只是将原本置于后面的“不移除元素”向前移动,覆盖那些被移除的元素. 这些算法都返回逻辑上的新终点 移 ...