小马过河题解

小马过河

题解:

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;
}
全部评论

相关推荐

07-15 14:14
门头沟学院 Java
7.10投递7.15感谢信
投递地平线等公司7个岗位
点赞 评论 收藏
分享
07-16 14:10
门头沟学院 Java
点赞 评论 收藏
分享
程序员小白条:主要没亮点,项目也是网上的,平平无奇,那只能海投了,奖项总得有一些,然后就是现在最好是前后端都会,自己能做项目并且运维的,要么找星球项目改改,要么找个开源项目改改,自己能拓展功能才是主要的,跟做效率很低很低
点赞 评论 收藏
分享
05-24 14:12
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务