1 0.000 0.000 4.000 0.000 1.000 1.000 3.000 1.000
2.000 0.000
公式:
·已知直线上的两点(x1, y1)(x2, y2),求直线ax+by+c=0
a = y2-y1; b = x1-x2; c = y1*x2-x1*y2;
·已知(x0, y0),求关于直线ax+by+c=0的对称点(x, y)
k = -2 * (a*x0+b*y0+c)/(a*a+b*b);
x = x0 + k*a;
y = y0 + k*b;
·已知直线
如果b1==0则
否则
参考博客:
#include<cstdio>
#include<string>
#include<cmath>
#define eps 1e-4
using namespace std;
struct point
{
double x,y;
};
point symmetric_point(point p1, point l1, point l2)// 求p1的对称点
{
point ret;
if (l1.x > l2.x - eps && l1.x < l2.x + eps)//斜率不存在
{
ret.x = (2 * l1.x - p1.x);
ret.y = p1.y;
}
else
{
double k = (l1.y - l2.y ) / (l1.x - l2.x);
if(k + eps > 0 && k - eps < 0)//斜率为零
{
ret.x = p1.x;
ret.y = l1.y - (p1.y - l1.y);
}
else
{
ret.x = (2*k*k*l1.x + 2*k*p1.y - 2*k*l1.y - k*k*p1.x + p1.x) / (1 + k*k);
ret.y = p1.y - (ret.x - p1.x ) / k;
}
}
return ret;
}
point intersection(point u1,point u2,point v1,point v2)//求两直线的交点
{
point ret=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x+=(u2.x-u1.x)*t;
ret.y+=(u2.y-u1.y)*t;
return ret;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
point m1,m2,l1,l2;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&m1.x,&m1.y,&m2.x,&m2.y,&l1.x,&l1.y,&l2.x,&l2.y);
point tmp=symmetric_point(l1,m1,m2);
point ans=intersection(tmp,l2,m1,m2);
printf("%.3lf %.3lf\n",ans.x,ans.y);
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- kqyc.cn 版权所有 赣ICP备2024042808号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务