判断是否所有直线交于一点
程序员文章站
2022-03-13 12:04:18
...
t,样例个数
n,直线条数
p,交点
代码:
//此程序可以判断是否所有直线交于一点
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
#include<vector>
#include<cmath>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
const double esp = 1e-7;
const int ff = 0x3f3f3f3f;
struct node
{
double x;
double y;
node(double x = 0,double y = 0):x(x),y(y){}
};
struct line
{
node a,b;
} l[520];
int n,flag;
int fork(node p0,node p1,node p2)
{
return (p0.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p0.y-p1.y);//计算向量叉乘
}
node calculate(double k1,double b1,double k2,double b2)
{
node p;
p.x = (b2-b1)/(k1-k2);
p.y = p.x*k1+b1;
return p;
}
node find()//返回两条相交直线的交点
{
for(int i = 1;i< n;i++)
{
double k1 = (l[i].a.y - l[i].b.y)/(l[i].a.x - l[i].b.x);
double b1 = l[i].a.y - l[i].a.x*k1;
int tmp1 = 0,tmp2 = 0;
if(fabs(l[i].a.x - l[i].b.x)< esp)
tmp1 = 1;
for(int j = i+1;j<= n;j++)
{
double k2 = (l[j].a.y - l[j].b.y)/(l[j].a.x - l[j].b.x);
double b2 = l[j].a.y - l[j].a.x*k2;
if(fabs(l[j].a.x - l[j].b.x)< esp)
tmp2 = 1;
if(tmp1&&tmp2||(fabs(k1-k2)< esp&&fabs(b1-b2)< esp))
continue;
if(tmp1)
return node(l[i].a.x,l[j].a.x*k2+b2);
else if(tmp2)
return node(l[j].a.x,l[i].a.x*k1+b1);
return calculate(k1,b1,k2,b2);
}
}
return node(l[1].a.x,l[1].a.y);
}
void init()
{
mem(l,0);
flag = 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
init();
scanf("%d",&n);
for(int i = 1;i<= n;i++)
scanf("%lf %lf %lf %lf",&l[i].a.x,&l[i].a.y,&l[i].b.x,&l[i].b.y);
node p = find();
for(int i = 1;i<= n;i++)//判断是否此点在所有直线上
if(fork(p,l[i].a,l[i].b)!= 0)
flag = 1;
if(flag)
cout<<"No!"<<endl;
else
{
cout<<"Yes!"<<endl;
cout<<p.x<<' '<<p.y<<endl;
}
}
return 0;
}
上一篇: php foreach怎么删除数组
下一篇: 泛型的几个注意点!
推荐阅读
-
python判断一个集合是否包含了另外一个集合中所有项的方法
-
Python判断直线和矩形是否相交的方法
-
Java 判断实体对象及所有属性是否为空的操作
-
python判断一个集合是否包含了另外一个集合中所有项的方法
-
判断所有input单选框是否全部选中
-
判断某一点是否在几何图形内部
-
1)的累加和(累乘积(阶乘))。其中n的值从键盘输入。输入一个2000年以后的年份n,输出所有介于2">
PTA判断输入的整数是否是素数,如果是则输出"1",否则输出"0." 编写程序,求自然数1至n(n>1)的累加和(累乘积(阶乘))。其中n的值从键盘输入。输入一个2000年以后的年份n,输出所有介于2
-
如何判断一个文件夹中符合判断的所有文件是否全部存在
-
判断是否有部属栏目,有就显示所有下级栏目,没有就显示同级栏目
-
如何判断一个文件夹中符合判断的所有文件是否全部存在