题目链接

题意

判断两条直线的位置关系,重合/平行/相交(求交点)。

直线以其上两点的形式给出(点坐标为整点)。

思路

写出直线的一般式方程(用\(gcd\)化为最简),

计算\(\begin{vmatrix}a1&b1\\a2&b2\end{vmatrix}\),

  1. 若不为\(0\),则两直线有交点,$$x=\frac{\begin{vmatrix}-c1&b1\-c2&b2\end{vmatrix}}{\begin{vmatrix}a1&b1\a2&b2\end{vmatrix}},y=\frac{\begin{vmatrix}a1&-c1\a2&-c2\end{vmatrix}}{\begin{vmatrix}a1&b1\a2&b2\end{vmatrix}}$$

  2. 若为\(0\),若\(c1==c2\),则共线,否则平行。

Code

#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
struct Line {
int a, b, c;
Line(int _a=0, int _b=0, int _c=0) : a(_a), b(_b), c(_c) {}
};
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int abs(int x) { return x > 0 ? x : -x; }
Line make_line(int x1, int y1, int x2, int y2) {
if (x1 == x2) return Line(1, 0, -x1);
if (y1 == y2) return Line(0, 1, -y1);
int div = gcd(abs(x2-x1), abs(y2-y1));
int b = (x2-x1) / div, a = (y1-y2) / div;
if (a < 0) a = -a, b = -b;
int c = -a * x1 - b * y1;
return Line(a, b, c);
}
void work() {
int x1, y1, x2, y2, x3, y3, x4, y4;
scanf("%d%d%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
Line l1 = make_line(x1, y1, x2, y2), l2 = make_line(x3, y3, x4, y4);
int det = l1.a * l2.b - l2.a * l1.b;
if (det) {
int dx = l2.c * l1.b - l1.c * l2.b,
dy = l2.a * l1.c - l1.a * l2.c;
printf("POINT %.2f %.2f\n", 1.0*dx/det, 1.0*dy/det);
}
else {
if (l1.c == l2.c) printf("LINE\n");
else printf("NONE\n");
}
}
int main() {
printf("INTERSECTING LINES OUTPUT\n");
int n;
scanf("%d", &n);
while (n--) work();
printf("END OF OUTPUT\n");
return 0;
}

最新文章

  1. 镁光c400-MTFDDAK064M固态硬盘更新固件
  2. 如何清除WebBrowser的Cookies
  3. PNG图片压缩工具
  4. nginx伪静态
  5. Apache开启不了------The requested operation has failed!
  6. iOS开发--_weak typeof(self) weakSelf = self
  7. 彻底删除sql server的方法
  8. JS获取select的值
  9. poj2488 A Knight&#39;s Journey
  10. 一个只能用在Win下的密码验证函数(显示星号,可删除)
  11. Build path contains duplicate entry
  12. Node.js 控制台
  13. ruby klb.rb irb
  14. 巩固java(三)---java修饰符
  15. .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC
  16. 第一章 Java程序设计概述
  17. 蓝屏代码PAGE_FAULT_IN_NONPAGED_AREA的解决方法
  18. Bootstrap Web框架
  19. pjax转发
  20. vue.js建立一个简单的表格

热门文章

  1. Oracle 闪回 找回数据的实现方法
  2. Oracle11g 数据库的导入导出
  3. [51Nod] 1218 最长递增子序列 V2
  4. sphinx增量索引使用
  5. Win10家庭版找不到组策略gpedit.msc
  6. vue 配置多页面应用
  7. 如何编写自己的C语言头文件
  8. python3.7 文件操作
  9. python模块之sys
  10. Divisibility by 25 CodeForces - 988E