poj 1269 判断直线的位置关系
题目链接
题意
判断两条直线的位置关系,重合/平行/相交(求交点)。
直线以其上两点的形式给出(点坐标为整点)。
思路
写出直线的一般式方程(用\(gcd\)化为最简),
计算\(\begin{vmatrix}a1&b1\\a2&b2\end{vmatrix}\),
若不为\(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}}$$
若为\(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;
}
poj 1269 判断直线的位置关系的更多相关文章
- 判断两条直线的位置关系 POJ 1269 Intersecting Lines
两条直线可能有三种关系:1.共线 2.平行(不包括共线) 3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...
- POJ 1269 /// 判断两条直线的位置关系
题目大意: t个测试用例 每次给出一对直线的两点 判断直线的相对关系 平行输出NODE 重合输出LINE 相交输出POINT和交点坐标 1.直线平行 两向量叉积为0 2.求两直线ab与cd交点 设直线 ...
- Intersecting Lines---poj1269(求两直线的位置关系)
题目链接:http://poj.org/problem?id=1269 题意:给你两条直线上的任意不同的两点,然后求两条直线的位置关系,如果相交于一点输出该点坐标; #include<iostr ...
- TOYS(计算几何基础+点与直线的位置关系)
题目链接:http://poj.org/problem?id=2318 题面: TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
- POJ 2318 /// 判断点与直线的位置关系
题目大意: n块玩具箱隔板 m个玩具落地点 给定玩具箱的左上和右下两个端点 接下来给定n块隔板的上点的x和下点的x(因为y就是玩具箱的上下边缘) 接下来给定m个玩具落地点 输出n+1个区域各有的玩具数 ...
- Intersecting Lines (计算几何基础+判断两直线的位置关系)
题目链接:http://poj.org/problem?id=1269 题面: Description We all know that a pair of distinct points on a ...
- POJ 2398 map /// 判断点与直线的位置关系
题目大意: poj2318改个输出 输出 a: b 即有a个玩具的格子有b个 可以先看下poj2318的报告 用map就很方便 #include <cstdio> #include < ...
- POJ 2074 /// 判断直线与线段相交 视野盲区
题目大意: 将所有物体抽象成一段横向的线段 给定房子的位置和人行道的位置 接下来给定n个障碍物的位置 位置信息为(x1,x2,y) 即x1-x2的线段 y相同因为是横向的 求最长的能看到整个房子的一段 ...
- Segments - POJ 3304 (判断直线与线段是否相交)
题目大意:给出一些线段,然后判断这些线段的投影是否有可能存在一个公共点. 分析:如果这些线段的投影存在一个公共点,那么过这个公共点作垂线一定与所有的直线都想交,于是题目转化成是否存在一个直线可以经 ...
随机推荐
- oracle中print_table存储过程实例介绍
oracle中pro_print_table存储过程实例介绍 存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.这 ...
- Oracle 闪回 找回数据的实现方法
Oracle 闪回 找回数据的实现方法 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复.这篇文章主要介绍了Oracle 闪回 找回 ...
- CF-1143D. The Beatles
题意:有间隔为k的n个点在数轴上,下标为 \(1,k+1, 2*k+1,\cdots (n-1)*k+1\) 首尾相接.设起点为s,步长为L,而现在只知道s距离最近的点的距离为a,和(s+L)距离最近 ...
- 【linux】服务说明
引用自<鸟哥的linux私房菜> http://cn.linux.vbird.org/linux_server/0210network-secure_3.php 服务名称 服务内容 a ...
- gulp的安装和使用
安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 1.去nodejs官网安装nodejs 2. ...
- java 的多态(2013-10-11-163 写的日志迁移
java 的多态性:(所谓多态--就是指一个引用(类型)在不同情况下的多种状态) 1.方法的多态: 重载(overload) 重写(覆盖 override) 2.对象的多态性:(本人 ...
- python中的内建函数
本文用作记录python中的内建函数及其功能,本文内容随时补充. 完整的内建函数及其说明参考官方文档: https://docs.python.org/3.5/library/functions ...
- Python之简单Socket编程
Socket编程这块儿还是比较重要的,记录一下:实现服务器端和客户端通信(客户端发送系统指令,如ipconfig等,服务器端执行该指令,然后将指令返回结果给客户端再传过去,设置一次最多直接收1024字 ...
- (转)iOS获取设备型号
//获得设备型号 + (NSString *)getCurrentDeviceModel:(UIViewController *)controller { ]; size_t len; char *m ...
- NSNotificationCenter的用法
作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificationCenter defaultCenter] ...