算法之美——求两直线交点(三维叉积)——求四边形面积(二维叉积)
一般方程法:
直线的一般方程为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
- #include <iostream>
- #include <string>
- using namespace std;
- struct Point
- {
- double x;
- double y;
- };
- struct Line
- {
- Point p1,p2;
- double a,b,c;
- };
- void GetLinePara(Line &l)
- {
- l.a=l.p1.y-l.p2.y;
- l.b=l.p2.x-l.p1.x;
- l.c=l.p1.x*l.p2.y-l.p1.y*l.p2.x;
- }
- Point getCrossPoint(Line &l1,Line &l2)
- {
- GetLinePara(l1);
- GetLinePara(l2);
- double D=l1.a*l2.b-l2.a*l1.b;
- Point p;
- p.x=(l1.b*l2.c-l2.b*l1.c)/D;
- p.y=(l1.c*l2.a-l2.c*l1.a)/D;
- return p;
- }
- int main()
- {
- Line L1,L2;
- while(true)
- {
- cout<<"Line1:\n"<<"Point1.x: ";
- cin>>L1.p1.x;
- cout<<"Point1.y: ";
- cin>>L1.p1.y;
- cout<<"Line1:\n"<<"Point2.x: ";
- cin>>L1.p2.x;
- cout<<"Point2.y: ";
- cin>>L1.p2.y;
- cout<<"Line2:\n"<<"Point1.x: ";
- cin>>L2.p1.x;
- cout<<"Point1.y: ";
- cin>>L2.p1.y;
- cout<<"Line2:\n"<<"Point2.x: ";
- cin>>L2.p2.x;
- cout<<"Point2.y: ";
- cin>>L2.p2.y;
- cout<<endl;
- Point PointCross=getCrossPoint(L1,L2);
- cout<<"CrossPoint.x:"<<PointCross.x<<endl;
- cout<<"CrossPoint.y:"<<PointCross.y<<endl;
- cout<<endl;
- }
- }
ZOJ Problem Set - 1683
题目大意:
在1*1的正方形格子上给出每边的两个点,按顺序连接对边的点,求这样形成的一系列四边形中最大的面积。
思路:
1. 求交点
见函数GetCrossPoint (http://blog.csdn.NET/abcjennifer/article/details/7584628)
2. 求面积
四边形面积可由两个三角形面积相加而得,这里使用叉积,因为三角形的两个向量边叉乘的结果为其所形成的平行四边形面积,所以三角形面积为1/2×向量边1 x 向量边2
见函数GetArea()
Code:
- #include"iostream"
- #include"stdio.h"
- #include"math.h"
- using namespace std;
- #define N 40
- int n;
- struct Point {
- double x;
- double y;
- } pset[N + 1][N + 1];
- struct Line {
- void L(Point pp1, Point pp2) {
- p1 = pp1;
- p2 = pp2;
- }
- Point p1, p2;
- double a, b, c;
- } lineset[N][N];
- void GetLinePara(Line *l) {
- l->a = l->p1.y - l->p2.y;
- l->b = l->p2.x - l->p1.x;
- l->c = l->p1.x * l->p2.y - l->p2.x * l->p1.y;
- }
- Point GetCrossPoint(Line *l1, Line *l2) {
- GetLinePara(l1);
- GetLinePara(l2);
- double D = l1->a * l2->b - l2->a * l1->b;
- Point p;
- p.x = (l1->b * l2->c - l2->b * l1->c) / D;
- p.y = (l1->c * l2->a - l2->c * l1->a) / D;
- return p;
- }
- double Xmult(Point a, Point b, Point c)//get vector ac and bc 计算两个二维向量叉积,两条边界向量
- {
- return (c.x - a.x) * (c.y - b.y) - (c.y - a.y) * (c.x - b.x);
- }
- double GetArea(int i, int j) {
- double area1 = Xmult(pset[i][j], pset[i + 1][j], pset[i + 1][j + 1]) / 2;
- double area2 = Xmult(pset[i][j], pset[i][j + 1], pset[i + 1][j + 1]) / 2;
- return fabs(area1) + fabs(area2);
- }
- void Init_Points() {
- int i;
- for (i = 1; i <= n; i++)
- scanf("%lf", &pset[i][0].x), pset[i][0].y = 0;
- for (i = 1; i <= n; i++)
- scanf("%lf", &pset[i][n + 1].x), pset[i][n + 1].y = 1;
- for (i = 1; i <= n; i++)
- scanf("%lf", &pset[0][i].y), pset[0][i].x = 0;
- for (i = 1; i <= n; i++)
- scanf("%lf", &pset[n + 1][i].y), pset[n + 1][i].x = 1;
- pset[0][0].x = pset[0][0].y = 0;
- pset[n + 1][0].x = 1, pset[n + 1][0].y = 0;
- pset[0][n + 1].x = 0, pset[0][n + 1].y = 1;
- pset[n + 1][n + 1].x = pset[n + 1][n + 1].y = 1;
- }
- void Init_Lines() {
- int i, j;
- Line l1, l2;
- for (i = 1; i <= n; i++) {
- for (j = 1; j <= n; j++) {
- l1.L(pset[i][0], pset[i][n + 1]);
- l2.L(pset[0][j], pset[n + 1][j]);
- pset[i][j] = GetCrossPoint(&l1, &l2);
- }
- }
- }
- int main() {
- int i, j;
- while (cin >> n&&n) {
- Init_Points();
- Init_Lines();
- double maxarea = 0;
- double area;
- for (i = 0; i < n + 1; i++)
- for (j = 0; j < n + 1; j++) {
- area = GetArea(i, j);
- maxarea = area > maxarea ? area : maxarea;
- }
- printf("%lf\n", maxarea);
- }
- }
算法之美——求两直线交点(三维叉积)——求四边形面积(二维叉积)相关推荐
- java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码
JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...
- 分别已知两直线上的两点,求两直线交点
分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...
- js求两圆交点_谈谈求线段交点的几种算法(js实现,完整版)
"求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. ...
- 求两直线交点程序 C
const double EPS = 1e-5; // 计算精度 const int CROSS ...
- POJ 1269 求两直线交点
题意:给出4个点,两个一组在两条直线上,求出这两条直线的重合部分,NONE就是平行,LINE就是重合,POINT就是有交点并且输出交点. 解析几何那么求,没什么好说的直接看代码吧. #include ...
- 记录:python 求两直线交点
本人数学渣渣,公式来自知乎大佬,大佬真是太强了. https://www.zhihu.com/question/381406535/answer/1095948349 用方程法,避开了算K,真是太强了 ...
- matlab求两方程交点坐标,matlab求交点坐标
b xi ? 0(i ? 1, 2, , n) 三.线性规划问题的求解方法二元线性规划问题的图解法 线性规划问题的理论解法 线性规划问题的MATLAB软件解法 线性规划问题的图解...... MATL ...
- js求两圆交点_如何求两个圆的交点坐标,请举例
展开全部 将两个圆62616964757a686964616fe4b893e5b19e31333431363563的方程相减,就消掉了x²,y²项,剩下一个关于x, y的一次方程,可解得y=kx+b. ...
- OpenCV--直线拟合fitLine及求两直线对称轴
文章目录 直线拟合fitLine 求两直线对称轴 倾斜校正 附1 实验代码 直线拟合fitLine void cv::fitLine( cv::InputArray points, // 二维点的数组 ...
最新文章
- 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
- 【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )
- js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法
- mysql 酒店管理设计_酒店管理系统的设计与实现(Myeclipse,MySQL)
- Python中Turtle绘图函数-绘制时钟程序
- BugkuCTF-MISC题只有黑棋的棋盘(writeup)
- weight_decay一般设置为多少_50岁的夫妻一般有多少存款?他们在为养老做准备吗?...
- 多个浏览器同时访问mysql_48- 多线程启动多个不同浏览器
- arma模型matlab代码_DCC GARCH模型
- 学习项目管理PRINCE2有什么用??
- 常用的一些类,少走弯路。待续...
- 线段树相关(研究总结,线段树)
- nyoj461 Fiboncci数列(4)解通项公式
- [RS] 地理空间数据云 使用ftp批量下载影像(以批量下载Landsat8数据为例)
- Kubernetes安装EFK日志收集
- C# Excel命名区域(一)-创建命名区域
- play框架使用起来(6)
- linux怎么发送邮件到qq邮箱,centos7命令行下用QQ邮箱发送邮件教程
- 异常点检测isolationforest
- python列表元组字典集合实验心得_python学习小总结(列表、元组、字典、集合、字符串)...
热门文章
- 6月30日.百位行业大咖齐聚,共庆链全财经成功签约WBO官方媒体
- 2021-08-02;Linux6~网络基础
- nested exception is feign.RetryableException: Incomplete output stream executing POST http://
- 如何将谷歌分析代码放入react项目中?
- 虚荣和骄傲会让你跌得很惨
- Multi-instance Multi-label Learning for Relation Extraction-2012
- 光谱特征选择---竞争自适应重加权采样CARS
- 蓝桥杯:每周一题之高斯的日记
- 抖音超级火的评测小程序独立源码内附详细教程文本
- Ubuntu 10.04 更新源(ubuntu yuan)