小马过河题解
小马过河
题解:
1.本题就是求点在直线上的投影
关键代码:
Point GetLineProjection(Point P,Point A,Point B) { Vector v=B-A; return A+v*(Dot(v,P-A)/Dot(v,v)); }
2.要实现这个代码需要将点积的代码和点的定义的代码都写出来
全部代码:
#include <cstdio> #include <cmath> #include <iostream> #include <algorithm> using namespace std; struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y) { } }; typedef Point Vector; Vector operator +(Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); } Vector operator -(Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); } Vector operator *(Vector A,double p) { return Vector(A.x*p,A.y*p); } Vector operator /(Vector A,double p) { return Vector(A.x/p,A.y/p); } const double eps=1e-10; int dcmp(double x) { if(fabs(x)<eps) return 0; else return x<0?-1:1; } double Dot(Vector A,Vector B) { return A.x*B.x+A.y*B.y; } double Length(Vector A) { return sqrt(Dot(A,A)); } double Cross(Vector A,Vector B) { return A.x*B.y-A.y*B.x; } Point GetLineProjection(Point P,Point A,Point B) { Vector v=B-A; return A+v*(Dot(v,P-A)/Dot(v,v)); } int main() { int T; scanf("%d",&T); while(T--) { Point P,A,B; scanf("%lf%lf%lf%lf%lf%lf",&P.x,&P.y,&A.x,&A.y,&B.x,&B.y); Vector Q=GetLineProjection(P,A,B); printf("%.10f %.10f\n",Q.x,Q.y); } return 0; }