UVA378 Intersecting Lines 题解

news2024/12/24 2:23:48

UVA378 Intersecting Lines 题解

怎么这么多点斜式邪教啊。

解法

在计算几何中,我们应该尽可能地避免使用浮点数的计算,尽可能地使用向量计算。

本篇题解默认读者具有向量基础。

为了方便讲解,我们将输入的四个点分别记作 A , B , C , D A,B,C,D A,B,C,D

考虑两条直线 A B , C D AB,CD AB,CD 何时平行。根据向量叉乘的几何意义,如果 A B → × C D → = 0 \overrightarrow{AB} \times \overrightarrow{CD}=0 AB ×CD =0,则两直线平行。

直线重合是在直线平行的基础上,如果 C , D C,D C,D 中任一点在直线 A B AB AB 上,则两直线平行。即 A B → × A C → = 0 \overrightarrow{AB} \times \overrightarrow{AC}=0 AB ×AC =0(这里取点 C C C)。

剩下的情况就是直线相交了。如图,设两直线交点为 E E E

图

根据小学四年级(雾)学的燕尾模型, A E E B = S Δ A D C S Δ B D C \dfrac{AE}{EB}=\dfrac{S_{\Delta ADC}}{S_{\Delta BDC}} EBAE=SΔBDCSΔADC,所以 A E A B = S Δ A D C S Δ A D C + S Δ B D C \dfrac{AE}{AB}=\dfrac{S_{\Delta ADC}}{S_{\Delta ADC}+S_{\Delta BDC}} ABAE=SΔADC+SΔBDCSΔADC,三角形面积可以用叉积轻松求出。

所以两直线交点为 ( X A + ( X B − X A ) × A E A B , Y A + ( Y B − Y A ) × A E A B ) (X_A+(X_B-X_A) \times \dfrac{AE}{AB},Y_A+(Y_B-Y_A) \times \dfrac{AE}{AB}) (XA+(XBXA)×ABAE,YA+(YBYA)×ABAE)

最后提一句,这道题是早期 UVA 题,没有自动忽略文末换行,这题需要有文末换行。

代码

#include<bits/stdc++.h>
namespace fast_IO
{
	/**
	 * 省略了一部分
	*/
	inline void read(int &x,char c=Getchar())
	{
		bool f=c!=45;
		x=0;
		while(c<48 or c>57) c=Getchar(),f&=c!=45;
		while(c>=48 and c<=57) x=(x<<3)+(x<<1)+(c^48),c=Getchar();
		x=f?x:-x;
	}
	inline void write(int x)
	{
		if(x<0) Putchar(45),x=-x;
		if(x>=10) write(x/10),x%=10;
		Putchar(x^48);
	}
	inline void read(__int128 &x,char c=Getchar())
	{
		bool f=c!=45;
		x=0;
		while(c<48 or c>57) c=Getchar(),f&=c!=45;
		while(c>=48 and c<=57) x=(x<<3)+(x<<1)+(c^48),c=Getchar();
		x=f?x:-x;
	}
	inline void write(__int128 x)
	{
		if(x<0) Putchar(45),x=-x;
		if(x>=10) write(x/10),x%=10;
		Putchar(x^48);
	}
	inline bool inrange(const char &ch)
	{
		if(ch>=33 && ch<=126) return true;
		return false;
	}
	inline void read(std::string &st,char c=Getchar())
	{
		st.clear();
		while(!inrange(c)) c=Getchar();
		while(inrange(c)) st+=c,c=Getchar();
	}
	inline void write(std::string st)
	{
		for(int i=0;i<st.size();i++) Putchar(st[i]);
	}
	inline void read(char &ch)
	{
		ch=Getchar();
		while(!inrange(ch)) ch=Getchar();
	}
	inline void write(const char &ch)
	{
		Putchar(ch);
	}
	inline void write(double x,int fix=2)
	{
		x+=x>0?my_round[fix+1]:-my_round[fix+1],write((__int128)x),x=x>0?x:-x,x-=(__int128)x;
		if(fix)
		{
			Putchar(46);
			while(fix--) x*=10,Putchar(((int)x)^48),x-=(int)x;
		}
	}
	class fastin
	{
	public:
		template<typename T>
		inline fastin &operator>>(T &x)
		{
			read(x);
			return *this;
		}
	};
	class fastout
	{
	public:
		template<typename T>
		inline fastout &operator<<(T x)
		{
			write(x);
			return *this;
		}
	};
	fastin in;
	fastout out;
};
using namespace fast_IO;
int n;
struct point
{
	int x,y;
	point()
	{
		x=y=0;
	}
	point(int x,int y)
	{
		this->x=x,this->y=y;
	}
	inline point operator-(const point &rhs) const
	{
		return point(x-rhs.x,y-rhs.y);
	}
	inline int operator*(const point &rhs)
	{
		return x*rhs.y-y*rhs.x;
	}
};
inline int sgn(int x)
{
	return x==0?0:(x>0?1:-1);
}
struct seg
{
	point s,t;
};
seg a,b;
inline void calc()
{
	double ix,iy,rat;
	rat=(b.t-a.s)*(b.s-a.s)*1.0/((b.t-a.s)*(b.s-a.s)-(b.t-a.t)*(b.s-a.t));
	ix=a.s.x*1.0+(a.t.x-a.s.x)*rat,iy=a.s.y*1.0+(a.t.y-a.s.y)*rat;
	out<<"POINT "<<ix<<' '<<iy<<'\n';
}
int main()
{
	in>>n,out<<"INTERSECTING LINES OUTPUT\n";
	for(int i=1;i<=n;i++)
	{
		in>>a.s.x>>a.s.y>>a.t.x>>a.t.y>>b.s.x>>b.s.y>>b.t.x>>b.t.y;
		if((a.t-a.s)*(b.t-b.s)==0)
		{
			if((a.t-a.s)*(b.s-a.s)==0) out<<"LINE\n";
			else out<<"NONE\n";
		}else calc();
	}
	out<<"END OF OUTPUT\n";
	fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1501261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本鲸多方位助力创业者高效对接创新创业机遇

在科技创新的浪潮中&#xff0c;创业者们不断探索着新的商业机会&#xff0c;寻求着创新创业的道路。然而&#xff0c;面对复杂多变的市场环境和激烈的竞争压力&#xff0c;如何高效对接创新创业机遇成为了摆在创业者面前的重要课题。 本鲸依托海南本鲸投资有限公司和重庆本鲸…

关于Vivado的实施过程、SDC和XDC约束支持、Vivado实施子流程、Tcl API支持脚本

关于Vivado的实施过程 AMD Vivado™设计套件可实现以下AMD设备体系结构&#xff1a;AMD Versal™自适应计算加速平台&#xff08;自适应SoC&#xff09;&#xff0c;AMDUltraScale™、AMD UltraScale™和AMD 7系列FPGA。各种设计来源如下支持&#xff0c;包括&#xff1a; •…

WebGPU vs. 像素流

在构建 Bzar 之前&#xff0c;我们讨论过我们的技术栈是基于在云上渲染内容的像素流&#xff0c;还是基于使用设备自身计算能力的本地渲染技术。 由于这种选择会极大地影响项目的成本、可扩展性和用户体验&#xff0c;因此在开始编写一行代码之前&#xff0c;从一开始就采取正确…

typeorm-入门

简述 typeorm是一个数据库orm框架&#xff0c;在nestjs官网中有提到&#xff0c;可以充分发挥利用typescript的特性&#xff0c;当然也支持js其中涉及的概念包括 DataSource 数据源&#xff0c;Connection 连接数据库Entity 实体&#xff0c;实体类映射数据库表Relation 关系…

30个炫酷光效视频转场PR模板剪辑素材下载

视频转场Premiere模板&#xff0c;包含30个炫酷光效视频转场过渡效果PR项目模板下载。 适用软件&#xff1a;Premiere Pro 2023 | 分辨率&#xff1a;3840x2160 (4K) | 无需插件 | 文件大小&#xff1a;56.33MB 来自PR转场&#xff0c;下载地址&#xff1a;https://prmuban.com…

Windows下Node.js安装保姆级教程

一、Node.js 下载 访问Node.js官网&#xff0c;点击下载Node.js 下载完成后即可在下载文件中查看安装包 二、安装 一&#xff09;点击安装包开始安装&#xff0c;进入Weclcome界面点击Next 二&#xff09;勾选同意协议&#xff0c;点击Next 三&#xff09;根据需要选择安装路…

Neo4j安装 Linux:CentOS、openEuler 适配langchain应用RAG+知识图谱开发 适配昇腾910B

目录 Neo4j下载上传至服务器后进行解压运行安装JAVA再次运行在windows端打开网页导入数据 Neo4j下载 进入Neo4j官网下载页面 向下滑动找到 Graph Database Self-Managed 选择 社区版&#xff08;COMMUNITY&#xff09; 选择 Linux / Mac Executable Neo4j 5.17.0 (tar) 单机下…

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动&#xff0c;使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”&#xff0c;查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

egg如何写单元测试

优秀的代码需要有单元测试进行质量保证&#xff0c;每个测试用例都给应用的稳定性提供了一层保障。 测试目录结构 我们约定 test 目录为存放所有测试脚本的目录&#xff0c;测试所使用到的 fixtures 和相关辅助脚本都应该放在此目录下。 测试文件的目录和我们需要测试的文件目…

unicloud where 使用

where介绍 在uniCloud中&#xff0c;WHERE是一个用于指定查询条件的关键字。它允许用户根据特定的条件来筛选和查询云数据库中的数据。WHERE语句的基本语法格式是WHERE condition&#xff0c;其中condition表示查询条件&#xff0c;可以是一个或多个逻辑表达式组成的条件。 在…

深入了解304缓存原理:提升网站性能与加载速度

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

探索HTTP协议:网络通信的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

web基础04-flex布局

1.概述 Flexbox​ 是 ​flexible box​ 的简称&#xff08;注&#xff1a;意思是“​灵活的盒子容器​”&#xff09;&#xff0c;是 CSS3 引入的新的布局模式。 它决定了元素如何在页面上排列&#xff0c;使它们能在不同的屏幕尺寸和设备下可预测地展现出来。 它之所以被称…

C++错误总结(1)

1.定义函数类型时&#xff0c;如果没有返回值&#xff0c;用void void swap(int &x, int &y){ int tem x; x y; y tem; } 2.输入时&#xff0c;不加换行符 cin >> a >> b >> c >> endl ;(红色标记的是错误的部分) 3.【逆序出入…

【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目&#xff1a; 654. 最大二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树 目录 LC 654. 最大二叉树 【easy】 Problem&#xff1a;根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐LC 105. 从前序与中…

华为设备小型园区网方案(有线+无线+防火墙)

&#xff08;一&#xff09;配置有线部分 1.配置LSW2 &#xff08;1&#xff09;创建相关vlan [LSW2]vlan batch 10 3000 &#xff08;2&#xff09;配置连接LSW1的Eth-Trunk1&#xff0c;透传VLAN 10 3000 [LSW2]int Eth-Trunk 1 [LSW2-Eth-Trunk1]port link-type trunk [LSW2…

微信小程序(五十四)腾讯位置服务示范(2024/3/8更新)

教程如下&#xff1a; 上一篇 1.先在官网注册一下账号&#xff08;该绑定的都绑定一下&#xff09; 腾讯位置服务官网 2.进入控制台 3.创建应用 3. 额度分配 4.下载微信小程序SDK 微信小程序SDK下载渠道 5.解压将俩js文件放在项目合适的地方 6.加入安全域名or设置不验证合…

自动化工程师涨薪难,原因出在这里

大家好&#xff0c;今天说说真实的工控行业&#xff0c;摒弃虚无的鸡汤&#xff0c;聊点实在的。 举个例子&#xff0c;某工做销售&#xff0c;卖电控器件&#xff0c;眼见PLC收入可观&#xff0c;开始感到压力。于是&#xff0c;他下定决心学PLC&#xff0c;报了培训班。毕业后…