三点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分。嘿嘿
还是求点。已经一条直线上两点,和直线外一点
答案:6 悬赏:0 手机版
解决时间 2021-02-06 21:04
- 提问者网友:锁深秋
- 2021-02-06 11:49
最佳答案
- 五星知识达人网友:玩家
- 2021-02-06 12:13
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);
//3.5 平移坐标原点到原来坐标系原点
P+=A;
//4. 同样以B为坐标原点计算Q
//做矩形(B a Q n), a在AB上,n在BN上。
//平移坐标原点到B,下面计算平移后a,n坐标
point a,n;
a.x=A.x-B.x; a.y=A.y-B.y;
r=sqrt(a.x*a.x+a.y+a.y);
t=10/r;
a.x*=t; a.y*=t;
n.x=N.x-B.x; n.y=N.y-B.y;
r=sqrt(n.x*n.x+n.y*n.y);
t=(r-10)/r;
n.x*=t; n.y*=t;
Q.x=long(a.x+n.x);
Q.y=long(a.y+n.y);
Q+=B;
}
void main()
{
CPoint A(189,460);
CPoint B(278,29);
CPoint C(400,300);
CPoint M,N;
CPoint P,Q;
F(A,B,C,M,N,P,Q);
cout<<"A("<<A.x<<','<<A.y<<")\n";
cout<<"B("<<B.x<<','<<B.y<<")\n";
cout<<"M("<<M.x<<','<<M.y<<")\n";
cout<<"N("<<N.x<<','<<N.y<<")\n";
cout<<"P("<<P.x<<','<<P.y<<")\n";
cout<<"Q("<<Q.x<<','<<Q.y<<")\n";
cout<<"C("<<C.x<<','<<C.y<<")\n";
}
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);
//3.5 平移坐标原点到原来坐标系原点
P+=A;
//4. 同样以B为坐标原点计算Q
//做矩形(B a Q n), a在AB上,n在BN上。
//平移坐标原点到B,下面计算平移后a,n坐标
point a,n;
a.x=A.x-B.x; a.y=A.y-B.y;
r=sqrt(a.x*a.x+a.y+a.y);
t=10/r;
a.x*=t; a.y*=t;
n.x=N.x-B.x; n.y=N.y-B.y;
r=sqrt(n.x*n.x+n.y*n.y);
t=(r-10)/r;
n.x*=t; n.y*=t;
Q.x=long(a.x+n.x);
Q.y=long(a.y+n.y);
Q+=B;
}
void main()
{
CPoint A(189,460);
CPoint B(278,29);
CPoint C(400,300);
CPoint M,N;
CPoint P,Q;
F(A,B,C,M,N,P,Q);
cout<<"A("<<A.x<<','<<A.y<<")\n";
cout<<"B("<<B.x<<','<<B.y<<")\n";
cout<<"M("<<M.x<<','<<M.y<<")\n";
cout<<"N("<<N.x<<','<<N.y<<")\n";
cout<<"P("<<P.x<<','<<P.y<<")\n";
cout<<"Q("<<Q.x<<','<<Q.y<<")\n";
cout<<"C("<<C.x<<','<<C.y<<")\n";
}
全部回答
- 1楼网友:逐風
- 2021-02-06 16:52
可以借鉴作图法的原理
加上解析几何相佐即可求得
直线AB的方程式很容易写得出吧
过C点与AB斜率相等的直线方程式也容易得到
它就是MN的方程式
过A点与AB垂直的直线、过B点与AB垂直的直线
与MN的交点容易求得(就是M、N两点)
P、Q两点也是用类似方法求得
- 2楼网友:野味小生
- 2021-02-06 16:20
可以借鉴作图法的原理
加上解析几何相佐即可求得
直线AB的方程式很容易写得出吧
过C点与AB斜率相等的直线方程式也容易得到
它就是MN的方程式
过A点与AB垂直的直线、过B点与AB垂直的直线
与MN的交点容易求得(就是M、N两点)
P、Q两点也是用类似方法求得
- 3楼网友:野慌
- 2021-02-06 14:53
可以借鉴作图法的原理
加上解析几何相佐即可求得
直线AB的方程式很容易写得出吧
过C点与AB斜率相等的直线方程式也容易得到
它就是MN的方程式
过A点与AB垂直的直线、过B点与AB垂直的直线
与MN的交点容易求得(就是M、N两点)
P、Q两点也是用类似方法求得
- 4楼网友:一叶十三刺
- 2021-02-06 14:05
小学文化做这题切不是对牛谈清
- 5楼网友:山河有幸埋战骨
- 2021-02-06 12:57
连接直线外的两点为一条线段,找到该线段的中点,在中点上画一条垂直于该线段的直线,这条直线与最初的直线相交的点,就是你想要的那个点。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯