一般方程法:

直线的一般方程为F(x) = ax + by + c = 0。既然我们已经知道直线的两个点,假设为(x0,y0), (x1, y1),那么可以得到a = y0 – y1, b = x1 – x0, c = x0y1 – x1y0。

因此我们可以将两条直线分别表示为

F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0

那么两条直线的交点应该满足

a0*x + b0*y +c0 = a1*x + b1*y + c1

由此可推出

x = (b0*c1 – b1*c0)/D

y = (a1*c0 – a0*c1)/D

D = a0*b1 – a1*b0, (D为0时,表示两直线重合)

二者实际上就是连立方程组F0(x) = a0*x + b0*y + c0 = 0, F1(x) = a1*x + b1*y + c1 = 0的叉积应用

i     j     k

a0 b0 c0

a1 b1 c1

[cpp] view plaincopy print?
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. struct Point
  5. {
  6. double x;
  7. double y;
  8. };
  9. struct Line
  10. {
  11. Point p1,p2;
  12. double a,b,c;
  13. };
  14. void GetLinePara(Line &l)
  15. {
  16. l.a=l.p1.y-l.p2.y;
  17. l.b=l.p2.x-l.p1.x;
  18. l.c=l.p1.x*l.p2.y-l.p1.y*l.p2.x;
  19. }
  20. Point getCrossPoint(Line &l1,Line &l2)
  21. {
  22. GetLinePara(l1);
  23. GetLinePara(l2);
  24. double D=l1.a*l2.b-l2.a*l1.b;
  25. Point p;
  26. p.x=(l1.b*l2.c-l2.b*l1.c)/D;
  27. p.y=(l1.c*l2.a-l2.c*l1.a)/D;
  28. return p;
  29. }
  30. int main()
  31. {
  32. Line L1,L2;
  33. while(true)
  34. {
  35. cout<<"Line1:\n"<<"Point1.x: ";
  36. cin>>L1.p1.x;
  37. cout<<"Point1.y: ";
  38. cin>>L1.p1.y;
  39. cout<<"Line1:\n"<<"Point2.x: ";
  40. cin>>L1.p2.x;
  41. cout<<"Point2.y: ";
  42. cin>>L1.p2.y;
  43. cout<<"Line2:\n"<<"Point1.x: ";
  44. cin>>L2.p1.x;
  45. cout<<"Point1.y: ";
  46. cin>>L2.p1.y;
  47. cout<<"Line2:\n"<<"Point2.x: ";
  48. cin>>L2.p2.x;
  49. cout<<"Point2.y: ";
  50. cin>>L2.p2.y;
  51. cout<<endl;
  52. Point PointCross=getCrossPoint(L1,L2);
  53. cout<<"CrossPoint.x:"<<PointCross.x<<endl;
  54. cout<<"CrossPoint.y:"<<PointCross.y<<endl;
  55. cout<<endl;
  56. }
  57. }

ZOJ Problem Set - 1683

题目大意:

在1*1的正方形格子上给出每边的两个点,按顺序连接对边的点,求这样形成的一系列四边形中最大的面积。

思路:

1. 求交点

见函数GetCrossPoint (http://blog.csdn.NET/abcjennifer/article/details/7584628)

2. 求面积

四边形面积可由两个三角形面积相加而得,这里使用叉积,因为三角形的两个向量边叉乘的结果为其所形成的平行四边形面积,所以三角形面积为1/2×向量边1 x 向量边2

见函数GetArea()

Code:

[cpp] view plaincopy print?
  1. #include"iostream"
  2. #include"stdio.h"
  3. #include"math.h"
  4. using namespace std;
  5. #define N 40
  6. int n;
  7. struct Point {
  8. double x;
  9. double y;
  10. } pset[N + 1][N + 1];
  11. struct Line {
  12. void L(Point pp1, Point pp2) {
  13. p1 = pp1;
  14. p2 = pp2;
  15. }
  16. Point p1, p2;
  17. double a, b, c;
  18. } lineset[N][N];
  19. void GetLinePara(Line *l) {
  20. l->a = l->p1.y - l->p2.y;
  21. l->b = l->p2.x - l->p1.x;
  22. l->c = l->p1.x * l->p2.y - l->p2.x * l->p1.y;
  23. }
  24. Point GetCrossPoint(Line *l1, Line *l2) {
  25. GetLinePara(l1);
  26. GetLinePara(l2);
  27. double D = l1->a * l2->b - l2->a * l1->b;
  28. Point p;
  29. p.x = (l1->b * l2->c - l2->b * l1->c) / D;
  30. p.y = (l1->c * l2->a - l2->c * l1->a) / D;
  31. return p;
  32. }
  33. double Xmult(Point a, Point b, Point c)//get vector ac and bc 计算两个二维向量叉积,两条边界向量
  34. {
  35. return (c.x - a.x) * (c.y - b.y) - (c.y - a.y) * (c.x - b.x);
  36. }
  37. double GetArea(int i, int j) {
  38. double area1 = Xmult(pset[i][j], pset[i + 1][j], pset[i + 1][j + 1]) / 2;
  39. double area2 = Xmult(pset[i][j], pset[i][j + 1], pset[i + 1][j + 1]) / 2;
  40. return fabs(area1) + fabs(area2);
  41. }
  42. void Init_Points() {
  43. int i;
  44. for (i = 1; i <= n; i++)
  45. scanf("%lf", &pset[i][0].x), pset[i][0].y = 0;
  46. for (i = 1; i <= n; i++)
  47. scanf("%lf", &pset[i][n + 1].x), pset[i][n + 1].y = 1;
  48. for (i = 1; i <= n; i++)
  49. scanf("%lf", &pset[0][i].y), pset[0][i].x = 0;
  50. for (i = 1; i <= n; i++)
  51. scanf("%lf", &pset[n + 1][i].y), pset[n + 1][i].x = 1;
  52. pset[0][0].x = pset[0][0].y = 0;
  53. pset[n + 1][0].x = 1, pset[n + 1][0].y = 0;
  54. pset[0][n + 1].x = 0, pset[0][n + 1].y = 1;
  55. pset[n + 1][n + 1].x = pset[n + 1][n + 1].y = 1;
  56. }
  57. void Init_Lines() {
  58. int i, j;
  59. Line l1, l2;
  60. for (i = 1; i <= n; i++) {
  61. for (j = 1; j <= n; j++) {
  62. l1.L(pset[i][0], pset[i][n + 1]);
  63. l2.L(pset[0][j], pset[n + 1][j]);
  64. pset[i][j] = GetCrossPoint(&l1, &l2);
  65. }
  66. }
  67. }
  68. int main() {
  69. int i, j;
  70. while (cin >> n&&n) {
  71. Init_Points();
  72. Init_Lines();
  73. double maxarea = 0;
  74. double area;
  75. for (i = 0; i < n + 1; i++)
  76. for (j = 0; j < n + 1; j++) {
  77. area = GetArea(i, j);
  78. maxarea = area > maxarea ? area : maxarea;
  79. }
  80. printf("%lf\n", maxarea);
  81. }
  82. }

算法之美——求两直线交点(三维叉积)——求四边形面积(二维叉积)相关推荐

  1. java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码

    JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...

  2. 分别已知两直线上的两点,求两直线交点

    分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...

  3. js求两圆交点_谈谈求线段交点的几种算法(js实现,完整版)

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

  4. 求两直线交点程序 C

    const   double   EPS                 =   1e-5;           //   计算精度  const   int   CROSS             ...

  5. POJ 1269 求两直线交点

    题意:给出4个点,两个一组在两条直线上,求出这两条直线的重合部分,NONE就是平行,LINE就是重合,POINT就是有交点并且输出交点. 解析几何那么求,没什么好说的直接看代码吧. #include ...

  6. 记录:python 求两直线交点

    本人数学渣渣,公式来自知乎大佬,大佬真是太强了. https://www.zhihu.com/question/381406535/answer/1095948349 用方程法,避开了算K,真是太强了 ...

  7. matlab求两方程交点坐标,matlab求交点坐标

    b xi ? 0(i ? 1, 2, , n) 三.线性规划问题的求解方法二元线性规划问题的图解法 线性规划问题的理论解法 线性规划问题的MATLAB软件解法 线性规划问题的图解...... MATL ...

  8. js求两圆交点_如何求两个圆的交点坐标,请举例

    展开全部 将两个圆62616964757a686964616fe4b893e5b19e31333431363563的方程相减,就消掉了x²,y²项,剩下一个关于x, y的一次方程,可解得y=kx+b. ...

  9. OpenCV--直线拟合fitLine及求两直线对称轴

    文章目录 直线拟合fitLine 求两直线对称轴 倾斜校正 附1 实验代码 直线拟合fitLine void cv::fitLine( cv::InputArray points, // 二维点的数组 ...

最新文章

  1. 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
  2. 【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )
  3. js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法
  4. mysql 酒店管理设计_酒店管理系统的设计与实现(Myeclipse,MySQL)
  5. Python中Turtle绘图函数-绘制时钟程序
  6. BugkuCTF-MISC题只有黑棋的棋盘(writeup)
  7. weight_decay一般设置为多少_50岁的夫妻一般有多少存款?他们在为养老做准备吗?...
  8. 多个浏览器同时访问mysql_48- 多线程启动多个不同浏览器
  9. arma模型matlab代码_DCC GARCH模型
  10. 学习项目管理PRINCE2有什么用??
  11. 常用的一些类,少走弯路。待续...
  12. 线段树相关(研究总结,线段树)
  13. nyoj461 Fiboncci数列(4)解通项公式
  14. [RS] 地理空间数据云 使用ftp批量下载影像(以批量下载Landsat8数据为例)
  15. Kubernetes安装EFK日志收集
  16. C# Excel命名区域(一)-创建命名区域
  17. play框架使用起来(6)
  18. linux怎么发送邮件到qq邮箱,centos7命令行下用QQ邮箱发送邮件教程
  19. 异常点检测isolationforest
  20. python列表元组字典集合实验心得_python学习小总结(列表、元组、字典、集合、字符串)...

热门文章

  1. 6月30日.百位行业大咖齐聚,共庆链全财经成功签约WBO官方媒体
  2. 2021-08-02;Linux6~网络基础
  3. nested exception is feign.RetryableException: Incomplete output stream executing POST http://
  4. 如何将谷歌分析代码放入react项目中?
  5. 虚荣和骄傲会让你跌得很惨
  6. Multi-instance Multi-label Learning for Relation Extraction-2012
  7. 光谱特征选择---竞争自适应重加权采样CARS
  8. 蓝桥杯:每周一题之高斯的日记
  9. 抖音超级火的评测小程序独立源码内附详细教程文本
  10. Ubuntu 10.04 更新源(ubuntu yuan)