题目来源:POJ 1269
简单题目分析:
求两条直线的位置关系(相交、平行、重合),若相交则求出交点坐标。
思路:计算几何入门,我的代码不具有任何参考价值!(因为用的是最简单的办法,高中那一套理论)
#include <iostream>
#include <stdio.h>
using namespace std;
struct point
{
double x,y;
}pp[5];
struct line
{
double k,b;
}ll[3];
bool isK[3];
void getK()
{
if(pp[1].x!=pp[2].x)
{
ll[1].k=(pp[1].y-pp[2].y)/(pp[1].x-pp[2].x);
isK[1]=true;
}
else
isK[1]=false;
if(pp[3].x!=pp[4].x)
{
ll[2].k=(pp[3].y-pp[4].y)/(pp[3].x-pp[4].x);
isK[2]=true;
}
else
isK[2]=false;
}
void getB()
{
if(isK[1]&&isK[2])
{
ll[1].b=pp[1].y-ll[1].k*pp[1].x;
ll[2].b=pp[3].y-ll[2].k*pp[3].x;
}
}
int main()
{
int T;
scanf("%d",&T);
printf("INTERSECTING LINES OUTPUT\n");
while(T--)
{
for(int i=1;i<=4;++i)
scanf("%lf %lf",&pp[i].x,&pp[i].y);
getK();getB();
if(!isK[1]&&!isK[2])
{
if(pp[1].x==pp[3].x)
{
printf("LINE\n");
continue;
}
else
{
printf("NONE\n");
continue;
}
}
if(isK[1]&&!isK[2])
{
printf("POINT %.2lf %.2lf\n",pp[3].x,pp[1].y+ll[1].k*(pp[3].x-pp[1].x));
continue;
}
if(!isK[1]&&isK[2])
{
printf("POINT %.2lf %.2lf\n",pp[1].x,pp[3].y+ll[2].k*(pp[1].x-pp[3].x));
continue;
}
if(isK[1]&&isK[2])
{
if(ll[1].k==ll[2].k)
{
if(ll[1].b==ll[2].b)
{
printf("LINE\n");
continue;
}
else
{
printf("NONE\n");
continue;
}
}
else
{
double px=(ll[1].b-ll[2].b)/(ll[2].k-ll[1].k);
double py=ll[1].k*px+ll[1].b;
printf("POINT %.2lf %.2lf\n",px,py);
continue;
}
}
}
printf("END OF OUTPUT\n");
return 0;
}
这两天心情浮躁,愈发感觉自己会的东西太少太少,眼界太低太低。
见识过太多的大佬,有搞acm的,也有高中学OI的,原来,自己和他们的差距,远不止自己所想象的那么近。
共勉,共勉!