还是求点。已经一条直线上两点,和直线外一点

来源:百度知道 编辑:UC知道 时间:2024/05/29 05:40:11
三点A,B,C (坐标A.x, A.y ......)
A、B是矩形的两端点
且C在与AB平行的 矩形另一边上 或其延长线上
求矩形另外两端点M、N
再求与MN夹角为45度,与M距离为10的点P
以及与MN夹角45度,与N距离为10的点Q
注:P、Q都在矩形内部
都是基础数学题,送分。200分。嘿嘿

void F(const CPoint &A, const CPoint &B, const CPoint &C,
CPoint &M, CPoint &N, CPoint &P, CPoint &Q)
{
double k; CPoint T;//设AB斜率k,垂足坐标T

//1. 计算AB斜率k和垂足坐标T
if (A.x==B.x) { T.x=A.x; T.y=C.y;}
else { k=double((A.y-B.y))/(A.x-B.x);
double Tx=(k * k * A.x + k * (C.y - A.y) + C.x) / (k * k + 1);
T.x=(long)Tx;
T.y=(long)( k * (Tx - A.x) + A.y);
}

//2. 计算M,N
M=C-T+A;
N=C-T+B;

double t,r;
struct point {double x,y;};
//3. 计算P;
//做矩形(A b P m), b在AB上,m在AM上。
point b,m;

//3.1 平移坐标原点到A,计算平移后B,M坐标
b.x=B.x-A.x; b.y=B.y-A.y; //B坐标
m.x=M.x-A.x; m.y=M.y-A.y; //M坐标

//3.2 B缩放变换到b点
r=sqrt(b.x*b.x+b.y+b.y);
t=10/r;
b.x*=t; b.y*=t;

//3.3 M缩放变换到m点
r=sqrt(m.x*m.x+m.y*m.y);
t=(r-10)/r;
m.x*=t; m.y*=t;

//3.4 计算坐标原点平移后的P点坐标
P.x=long(b.x+m.x);
P.y=long(b.y+m.y);