http://acm.hdu.edu.cn/showproblem.php?pid=2857
这题是求关于已知前后光路上的两点,和镜面位置,求出反射点的位置。这里需要有
1:两点求直线方程,即得到直线的三系数
已知x1,x2,y1,y2,则a=y2-y1;b=x1-x2;c=x2*y1-x1*y2;
2:已知两直线,求交点
struct line { double a,b,c; }p,s; void jiaodian() { if(fabs(p.b)<1e-6)//如果是平行于y轴,需要另外求 { ansx = -p.c / p.a; ansy = (-s.c - s.a * ansx) / s.b; } else//否则常规来 { ansx = (p.c * s.b - p.b * s.c) / (p.b * s.a - s.b * p.a); ansy = (-p.c- p.a* ansx) / p.b; } }
3:已知直线跟点,求对称点
struct line { double a,b,c; }p,s; void duichen() { double d; d=p.a*p.a+p.b*p.b; x=(p.b * p.b * xs - p.a * p.a * xs - 2 * p.a * p.b * ys - 2 * p.a * p.c) / d; y=(p.a * p.a * ys - p.b * p.b * ys - 2 * p.a * p.b * xs - 2 * p.b * p.c) / d; }
不得不说……这题目太恶心了
#include<stdio.h> #include<math.h> struct line { double a,b,c; }p,s; double x3, y3, x2, y2, x, y;//表示对称的那个点 double xs,xe,ys,ye,ansx,ansy; void jiaodian() { s.a=y-ye; s.b=xe-x; s.c=x*ye-y*xe;//求直线模板 if(fabs(p.b)<1e-6)//如果是平行于y轴,需要另外求 { ansx = -p.c / p.a; ansy = (-s.c - s.a * ansx) / s.b; } else//否则常规来 { ansx = (p.c * s.b - p.b * s.c) / (p.b * s.a - s.b * p.a); ansy = (-p.c- p.a* ansx) / p.b; } } void duichen() { double d; p.a=y3-y2; p.b=x2-x3; p.c=x3*y2-y3*x2;//求直线模板 d=p.a*p.a+p.b*p.b; x=(p.b * p.b * xs - p.a * p.a * xs - 2 * p.a * p.b * ys - 2 * p.a * p.c) / d; y=(p.a * p.a * ys - p.b * p.b * ys - 2 * p.a * p.b * xs - 2 * p.b * p.c) / d; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf",&x3,&y3,&x2,&y2); scanf("%lf%lf%lf%lf",&xs,&ys,&xe,&ye); duichen(); jiaodian(); if(fabs(ansx)<1e-6)ansx=fabs(ansx); if(fabs(ansy)<1e-6)ansy=fabs(ansy); printf("%.3lf %.3lf\n",ansx,ansy); } return 0; }