试题 算法提高 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。
输出格式
  输出仅一行,为交点的坐标Xe,Ye,保留5位小数。
样例输入
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;
}

 

posted @ 2020-08-30 01:10  mohari  阅读(324)  评论(0编辑  收藏  举报