UVA378 Intersecting Lines 题解

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.hqwc.cn/news/522886.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

md5绕过

文章目录 \\和\\\md5数组绕过科学计数法绕过双md加密md5碰撞Hash长度攻击 下面会以同一道题给大家演示&#xff1a; (题目来源与nssctf) 和 在php代码中我们会看到和&#xff0c;虽然两个都是表示相等&#xff0c;但是在细节上会有所部区别 &#xff1a;是弱比较&#xff0c;只…

js 实现点击按钮小球加入购物车动画

本文旨在实现类似点击按钮实现小球加入购物车效果。 使用技术&#xff1a; Vue2使用 Pubsub 监听按钮点击事件&#xff08;如果不想用也可以自己改造下&#xff09;监听 onmousemove 来获取按钮点击时的鼠标位置 小球组件&#xff1a; html css&#xff1a; 小球父元素&am…

品牌如何玩转饥饿营销?媒介盒子分享

饥饿营销是许多品牌都会用的策略&#xff0c;从“限定发售”、“先到先得”、“季节限定”、“专属VIP”等都属于饥饿营销的范畴&#xff0c;为什么饥饿营销屡试不爽&#xff0c;原因就在于人们面对同等的收益和损失时&#xff0c;损失会令他们更加难以接受。今天媒介盒子就来和…

奖励建模(Reward Modeling)实现人类对智能体的反馈

奖励建模&#xff08;Reward Modeling&#xff09;是强化学习中的一个重要概念和技术&#xff0c;它主要用于训练智能体&#xff08;如AI机器人或大型语言模型&#xff09;如何更有效地学习和遵循人类期望的行为。在强化学习环境中&#xff0c;智能体通过尝试不同的行为获得环境…

电机控制系列模块解析(第八篇)—— 高频注入法

一、基本原理 在电机控制领域&#xff0c;高频方波注入法常用于估计转子的位置和转速。其工作原理是每隔一定的时间间隔在电机输出电压上叠加一个电压脉冲。然后&#xff0c;在两相静止坐标系下或者同步旋转坐标系下对采样时刻的电压和电流进行相应的计算&#xff0c;以实现对…

深入理解并发编程:解锁现代软件性能的关键

在当今快速发展的软件开发世界中&#xff0c;并发编程已经成为一种无法回避的重要议题。它涉及到如何在同一时间内处理多个任务&#xff0c;以此来提升应用程序的性能和响应速度。互联网服务的高并发需求以及多核处理器的普及使得并发编程成为了现代软件工程的一个核心组成部分…

如何使用python处理高光谱数据004-卷积神经网络

多光谱数据是指从不同波段的传感器中收集的数据。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,适用于处理图像和空间数据。 在多光谱数据中,每个波段代表了一种特定的光谱信息。卷积神经网络可以通过学习特征映射来识别不同波段之间的关系,并从中…

王道机试C++第 4 章 字符串:字符串内容详解及三个小程序 Day29

第 4 章 字符串 本章介绍一种基础数据类型——字符串&#xff0c;并且介绍一些字符串处理的方法及字符串匹配的方法。虽然字符串的内容非常基础&#xff0c;但是十分重要。希望读者能够好好学习本章的内容&#xff0c;为此后的学习打下良好的基础。 4.1 字符串内容详解 由于 …

Java的 Map以及实现一个简单的红黑树

Map是Java中的一种键值对&#xff08;Key-Value&#xff09;数据结构&#xff0c;它提供了高效的键值对的存储和访问。在Java中&#xff0c;常见的Map实现类有HashMap、LinkedHashMap和TreeMap等。这些实现类在底层使用不同的数据结构来存储键值对&#xff0c;以提供不同的性能…

STM32CubeIDE基础学习-相关工程文件介绍

STM32CubeIDE基础学习-相关工程文件介绍 前言 保存的工程要大致了解熟悉里面的文件代表的是什么意思、干什么用的&#xff0c;这样才方便后面使用或移植代码等。 当成功创建工程后&#xff0c;打开基础工程保存路径后可以看到所有文件如下图所示&#xff1a; 如果工程越复杂&a…

15. C++泛型与符号重载

【泛型编程】 若多组类型不同的数据需要使用相同的代码处理&#xff0c;在C语言中需要编写多组代码分别处理&#xff0c;这样做显然太过繁琐&#xff0c;C增加了虚拟类型&#xff0c;使用虚拟类型可以实现一组代码处理多种类型的数据。 虚拟类型是暂时不确定的数据类型&#…

CN错题1

千兆以太网的MAC子层仍然使用 CSMA/CD , 支持半双工 和 全双工通信 。 与INTERNET 连接有 局域网 和 拨号上网 两种方式。 在计算机网络中&#xff0c;服务器提供的共享资源主要是指 硬件 、软件 和 数据库 资源。 在局域网中&#xff0c;硬件地址又称为 MAC地址 或 物理地址 报…