试题 算法提高 WYF的交易地点(简单计算几何)
问题描述
WYF酷爱玩魔兽世界。这天他要去4个不同的地方A、B、C、D。现在CWZ要WYF给他500金。WYF不情愿地答应了。他告诉CWZ,在直线AC和BD的交点E等他。CWZ立刻前往交易地点。突然WYF发现一个致命的问题——他的智商严重不够,算不出AC、BD的交点E的位置......。于是——现在问题来了——他找到了机智的你,要你求出AC、BD的交点E。如果没有交点或AC、BD重合,请输出“LLJJ”。
输入格式
输入共四行,每行为2个实数,保留2位小数。
第一行为Xa,Ya;
第一行为Xb,Yb;
第一行为Xc,Yc;
第一行为Xd,Yd。
第一行为Xa,Ya;
第一行为Xb,Yb;
第一行为Xc,Yc;
第一行为Xd,Yd。
输出格式
输出仅一行,为交点的坐标Xe,Ye,保留5位小数。
样例输入
1.00 1.00
1.00 -1.00
-1.00 -1.00
-1.00 1.00
1.00 -1.00
-1.00 -1.00
-1.00 1.00
样例输出
0.00000 0.00000
数据规模和约定
|X|,|Y|<=290。
思路
由点斜式y=kx+b,已知两点坐标可得k=(y1-y2)/(x1-x2),b=(x2*y1-x1*y2)/(x2-x1);
当斜率相同时即没有交点,否则一定相交。
由k1x+b1=k2x+b2,很容易得到x=(b2-b1)/(k1-k2),代回原直线即得y坐标。
#include<bits/stdc++.h> using namespace std; int main(){ double x,y,x1,x2,x3,x4,y1,y2,y3,y4,k1,k2,b1,b2; cin>>x1>>y1; cin>>x2>>y2; cin>>x3>>y3; cin>>x4>>y4; k1=(y1-y3)/(x1-x3); k2=(y2-y4)/(x2-x4); b1=(x3*y1-x1*y3)/(x3-x1); b2=(x4*y2-x2*y4)/(x4-x2); if(k1==k2){ cout<<"LLJJ"<<endl; } else{ x=(b2-b1)/(k1-k2); y=k1*x+b1; printf("%.5f %.5f\n",x,y); } return 0; }