急求:在直角坐标系中有ABCD四点的矩形,已知对角线AC的坐标分别为(xa,ya)和(xc,yc),还知道对角线AC与边线之间的夹角为θ,怎么求BD点的坐标(xb,yb)和(xd,yd),最好有代码,谢谢!矩形坐标对角线c++

解决方案 »

  1.   

    θ是AC与AB的夹角还是AC与AD的夹角假设角CAB=θLac:AC距离,根据两点坐标求出则矩形边长1 Lbc=Lac*sinθ
      矩形边长2 Lab=Lac*cosθ下面的计算可采用向量旋转法求得AB和AD的方向后求出当然也可列代数方程直接求解
      

  2.   

    2楼,这两句可否详细点
    ”下面的计算可采用向量旋转法求得AB和AD的方向后求出当然也可列代数方程直接求解“俺还是不清楚怎么求,谢谢
      

  3.   

    AC表示为向量: (Xc-Xa,Yc-Ya),单位化 转为长度为1的向量  (Vacx,Vacy)旋转矩阵
    [   cost  sint   ]
    [   -sint cost   ]把θ和θ-90度代入t,得到两个旋转矩阵,乘以(Vacx,Vacy)可以得到AB和AD的方向单位向量B=A+Vab*Lab  
      

  4.   


    那你就列方程完了Xb,Yb  分别与A,C求出距离,等于之前求出的边长就可以了
      

  5.   

    谢谢,明白代数的方式了
    不过方程好难解
    (xd-xa)2+(yd-ya)2 = ((xc-xa)2+(yc-ya)2)*cos2θ
    (xd-xc)2+(yd-yc)2 = ((xc-xa)2+(yc-ya)2)*sin2θ
    xa,ya,xc,yc,角度θ都是已知的,求xd,yd
    晕,这个没法写平方,所有的2,都是平方好复杂,怎么解
      

  6.   

    楼上的,A,C两点的坐标已知,还有角度θ已知,求B,D两点的坐标
      

  7.   


    #include <math.h>const double PI = 3.1415926;typedef struct POSITION
    {
    double x;
    double y;
    public:
    POSITION(double xx,double yy)
    {
    x = xx;
    y=yy;
    }
    } POSITION;typedef POSITION VECTOR;//两点之间距离
    double distance(POSITION const p1,POSITION const p2)
    {
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
    }//p1指向p2的向量,计算单位向量
    void vectorOf(POSITION const p1,POSITION const p2,VECTOR& v)
    {
    v.x=p2.x-p1.x;
    v.y=p2.y-p1.y; double len = sqrt(v.x*v.x+v.y*v.y); if(len>0.0000001)
    {
    v.x = v.x/len;
    v.y = v.y/len;
    }
    }//向量v0转到angle得到v
    void rotate(VECTOR const v0,VECTOR& v,double angle)
    {
    double cost = cos(angle);
    double sint = sin(angle); v.x = v0.x*cost-v0.y*sint;
    v.y = v0.x*sint+v0.y*cost;
    }//p0沿v向移动len的p1
    void movePosition(POSITION const p0,VECTOR const v,double len,POSITION & p1)
    {
    p1.x = p0.x +v.x*len;
    p1.y = p0.y +v.y*len;
    }int main(int argc, char* argv[])
    {
    POSITION A(0,0);
    POSITION C(4,4); double ANGLE_CAD = 30 * PI/180;

    double AC = distance(A,C);
    double AD = AC*cos(ANGLE_CAD);
    double AB = AC*sin(ANGLE_CAD);

    VECTOR V_AC(0,0);
    vectorOf(A,C,V_AC);

    //求D
    VECTOR V_AD(0,0);
    rotate(V_AC,V_AD,-ANGLE_CAD);

    POSITION D(0,0);
    movePosition(A,V_AD,AD,D); //求B
    VECTOR V_AB(0,0);
    rotate(V_AC,V_AB,PI/2-ANGLE_CAD);

    POSITION B(0,0);
    movePosition(A,V_AB,AB,B);

    return 0;
    }
      

  8.   


    POSITION A(0,0);
    POSITION C(4,4);
     
    double ANGLE_CAD = 30 * PI/180;
    自己改这三个参数就可以了