博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1269 Intersecting Lines——叉积求直线交点坐标
阅读量:6083 次
发布时间:2019-06-20

本文共 2085 字,大约阅读时间需要 6 分钟。

题目:

相关知识:

叉积

求面积:
什么是叉积:
        其二维:
计算交点:
    方法1:面积的比例:
    方法2:叉积:
            (其原因:)
例题:POJ1269:

此题的链接使用的就是那个面积比例的方法。但自己不是很懂,所以用了那个另一种方法。

利用面积算交点坐标应该还可以:

  设直线有两个参数:p->起点坐标;t->终点坐标减起点坐标。设有线段 a 和 b 。设交点为 r 。

  double d=( (a.p-b.p)×a.t ) / ( b.t×a.t ) ,r = a.p + d * a.t ;

  那个 d 就是面积比,即交点与一条线段的相对该线段起点的坐标值之比。

    画一画,分子就是三角形面积的两倍,分母是那样的平行四边形的面积,但连一下发现它就是两线交叉的那个四边形的面积的两倍。面积比即高的比即那两段线段之比。

关于这种方法的 a、b、c 怎么算,可以这样想:y=k*x+b 又 a*x+b*y+c=0 ,所以 a : b : c = -k : 1 : b;

  已知一条直线的两个点的坐标,联立可得 k=( y1-y2 ) / ( x1-x2 ) ; b=( x1*y2 - y1*x2 ) / ( x1-x2 ) ;

  所以 a : b : c = ( y2-y1) : ( x1-x2 ) : ( x1*y2 - y1*x2 ) 。可以说它们就等于这个,因为另一侧是0,可以随便乘。

#include
#include
#include
#include
#define db doubleusing namespace std;int T,tx,ty;struct Pt{ db x,y; Pt(db x=0,db y=0):x(x),y(y) {}}ta,tb;struct Line{ Pt p,t;}a,b;int operator* (const Pt &a,const Pt &b){
return a.x*b.y-a.y*b.x;}Pt operator- (const Pt &a,const Pt &b){
return Pt(a.x-b.x,a.y-b.y);}int check(Line a,Line b){ int d1=(b.p-a.p)*(a.t-a.p); int d2=(b.t-a.p)*(a.t-a.p); if(!d1&&!d2) return -1;//line if(d1==d2) return 1;//none if(d1*d2<=0) return 0;//point ==0 for 端点相交}Pt find(Line a,Line b){ db x1=a.p.x,y1=a.p.y,x2=a.t.x,y2=a.t.y; db a0=y2-y1,b0=x1-x2,c0=y1*x2-x1*y2; x1=b.p.x,y1=b.p.y,x2=b.t.x,y2=b.t.y; db a1=y2-y1,b1=x1-x2,c1=y1*x2-x1*y2; int tmp=a0*b1-a1*b0; return Pt((b0*c1-b1*c0)/tmp,(-a0*c1+a1*c0)/tmp);}int main(){ scanf("%d",&T); puts("INTERSECTING LINES OUTPUT"); while(T--) { scanf("%d%d",&tx,&ty); ta=Pt(tx,ty); scanf("%d%d",&tx,&ty); tb=Pt(tx,ty); a.p=ta; a.t=tb; scanf("%d%d",&tx,&ty); ta=Pt(tx,ty); scanf("%d%d",&tx,&ty); tb=Pt(tx,ty); b.p=ta; b.t=tb; int d=check(a,b); if(d==-1) puts("LINE"); else if(d==1) puts("NONE"); else { printf("POINT "); Pt c=find(a,b); printf("%.2lf %.2lf\n",c.x,c.y); } } puts("END OF OUTPUT"); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/9678068.html

你可能感兴趣的文章
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
2018 年最值得关注的 JavaScript 趋势
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
Linux中的帮助功能
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
Xcode 4.3 使用xcodebuild命令编译项目环境设置
查看>>
上传jar包到nexus私服
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
Project:如何分析项目中的资源分配情况
查看>>
HDU 4803 Poor Warehouse Keeper (贪心+避开精度)
查看>>
python全栈_011_Python3基本数据类型--字典
查看>>
json
查看>>
linux tomcat 用/etc/init.d/tomcat start启动报错
查看>>
高性能javascript学习笔记系列(2)-数据存取
查看>>
Spark之scala
查看>>
JSON使用
查看>>
Java 一些缩写的解释
查看>>