点在线段上的投影问题:已知一条线段,以及线外的一个点p,求p在线段上的投影点。
这个问题可以这样处理:
把p与线段上的一个点相连,求连接生成的这个向量在线段上的投影的长度,然后用这个投影的长度与线段长度作比,再对x,y坐标分别加上去就可以了。
题目: CGL_1_A
AC代码
#include <iostream>
#include <algorithm>
#include<math.h>
#include<iomanip>
#include<cstdio>
using namespace std;
class Point
{
public:
double x, y;
Point()
{
}
Point(double x, double y)
{
(*this).x = x;
(*this).y = y;
}
double operator^(const Point &p) const //叉乘
{
return x * p.y - y * p.x;
}
double operator*(const Point &p) const //点乘
{
return x * p.x + y * p.y;
}
Point operator*(const double &d) const
{
return Point(x * d, y * d);
}
Point operator/(const double &d) const
{
return Point (x/d,y/d);
}
Point operator-(const Point &p) const
{
return Point(x - p.x, y - p.y);
}
Point operator+(const Point &p) const
{
return Point(x+p.x,y+p.y);
}
double sqr()
{
return x * x + y * y;
}
double abs()
{
return sqrt(sqr());
}
void print()
{
printf("%.10lf %.10lf\n",x,y);
}
};
int main()
{
double x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
Point p1 = Point(x1, y1);
Point p2 = Point(x2, y2);
Point line = p2 - p1;
int q;
cin >> q;
double x0, y0;
Point p;
while (q--)
{
cin >> x0 >> y0;
p = Point(x0, y0);
Point ans;
ans = p1 + line * ((p - p1) * line) / line.sqr();
ans.print();
}
}
转载请注明来源:https://www.longjin666.top/?p=778
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~