1 0.000 0.000 4.000 0.000 1.000 1.000 3.000 1.000
2.000 0.000
模板:
const double eps=1e-6; struct point { double x,y; }; struct line//直线ax+by+c=0 { double a,b,c; }; line LineFromSegment(point p1,point p2)//两个点求直线 { line temp; temp.a=p2.y-p1.y; temp.b=p1.x-p2.x; temp.c=p2.x*p1.y-p1.x*p2.y; return temp; } point LineInter(line l1,line l2)//两条直线求交点 { point temp; double a1=l1.a; double b1=l1.b; double c1=l1.c; double a2=l2.a; double b2=l2.b; double c2=l2.c; if(fabs(b1)<eps) { temp.x=-c1/a1; temp.y=(-c2-a2*temp.x)/b2; } else { temp.x=(c1*b2-b1*c2)/(b1*a2-b2*a1); temp.y=(-c1-a1*temp.x)/b1; } return temp; } point symmetrical(point p, line L)//求一个点关于一条直线的对称点 { point p2; double d; d = L.a * L.a + L.b * L.b; p2.x = (L.b * L.b * p.x - L.a * L.a * p.x - 2 * L.a * L.b * p.y - 2 * L.a * L.c) / d; p2.y = (L.a * L.a * p.y - L.b * L.b * p.y - 2 * L.a * L.b * p.x - 2 * L.b * L.c) / d; return p2; }
本题代码:
#include <iostream> #include <cmath> #include <iomanip> using namespace std; const double eps=1e-6; struct point { double x,y; }; struct line//直线ax+by+c=0 { double a,b,c; }; line LineFromSegment(point p1,point p2)//两个点求直线 { line temp; temp.a=p2.y-p1.y; temp.b=p1.x-p2.x; temp.c=p2.x*p1.y-p1.x*p2.y; return temp; } point LineInter(line l1,line l2)//两条直线求交点 { point temp; double a1=l1.a; double b1=l1.b; double c1=l1.c; double a2=l2.a; double b2=l2.b; double c2=l2.c; if(fabs(b1)<eps) { temp.x=-c1/a1; temp.y=(-c2-a2*temp.x)/b2; } else { temp.x=(c1*b2-b1*c2)/(b1*a2-b2*a1); temp.y=(-c1-a1*temp.x)/b1; } return temp; } point symmetrical(point p, line L)//求一个点关于一条直线的对称点 { point p2; double d; d = L.a * L.a + L.b * L.b; p2.x = (L.b * L.b * p.x - L.a * L.a * p.x - 2 * L.a * L.b * p.y - 2 * L.a * L.c) / d; p2.y = (L.a * L.a * p.y - L.b * L.b * p.y - 2 * L.a * L.b * p.x - 2 * L.b * L.c) / d; return p2; } int main() { int t; cin>>t; for(int i=1;i<=t;i++) { point p[4]; for(int j=0;j<4;j++) cin>>p[j].x>>p[j].y; point tmp; line l1,l2; l1=LineFromSegment(p[0],p[1]);//两点求直线 tmp=symmetrical(p[3],l1);//直线外一点与一条直线,求该点关于直线的对称点,这里是求的反射点的对称点 l2=LineFromSegment(tmp,p[2]);//对称点与入射点求直线 tmp=LineInter(l1,l2);//求反射点(两条直线相交的点) cout<<setiosflags(ios::fixed)<<setprecision(3)<<tmp.x<<" "<<tmp.y<<endl; } return 0; }
辅助图(根据所写代码画的)