给了三角形的三条边(如3,4,5),如何求它三个点的位置,只有这个条件没有其他的条件了。
人人都说CSDN上的人很热情,第一次提问 :)

解决方案 »

  1.   

    切~~~  三点都给你了  还用的着去求了吗?  我给的这点只是一个参照物而已啊。
    其实已经可以了,别人写的有代码只是我看不懂,我贴上来给你门研究下啊。-------------------------------------------------------------------------------------
    下面代码不能直接使用,需要修改一下。
    功能:计算三条边交会的未知点坐标。说明:为什么要三条边?如果是两条边,则存在二义性,无法计算。这段代码来自控制网近似坐标推算部分,坐标推算为自动进行,不要人为干预,所以需要三条边,这样才能确定点位置。注意,这里计算仅仅采用二条边,另外一条边仅仅参与方向判断,不参与坐标计算。// 采用距离交会计算坐标。
    // 注意,交会点和已知点以顺时针编号
    BOOL OnDistanceCross(double X[], double Y[], double S[], 
             double &x, double &y)
    {
     double dx = X[1] - X[0];
     double dy = Y[1] - Y[0];
     double s = sqrt(dx * dx + dy * dy); // 两个已知点的距离
     double a = acos((s * s + S[0] * S[0] - S[1] * S[1]) / (2.0 * s * S[0]));
     a = atan2(dy, dx) + a;
     x = X[0] + S[0] * cos(a);
     y = Y[0] + S[0] * sin(a);
     return TRUE;
    }下面代码摘录自函数的一部分(修改一下就可以使用):
     long lCount = 0;
     double dKnownX[MAXDIRECTIONNUM];
     double dKnownY[MAXDIRECTIONNUM];
     double dBorder[MAXDIRECTIONNUM];
     double dKnownX0[MAXDIRECTIONNUM];
     double dKnownY0[MAXDIRECTIONNUM];
     double dBorder0[MAXDIRECTIONNUM];
     
     // 采用坐标填写上面的数组。注意,顺时针填写。
     // 同时设置lCount, 也就是交会的已知点个数。
      if (lCount < 3)
      // 少于三个方向,无法计算。
      return FALSE; // 判断是否可以做交会计算。
     dKnownX0[0] = dKnownX[1];
     dKnownY0[0] = dKnownY[1];
     dKnownX0[1] = dKnownX[0];
     dKnownY0[1] = dKnownY[0];
     dBorder0[0] = dBorder[1];
     dBorder0[1] = dBorder[0]; // 采用距离交会计算坐标。
     double x, y;
     double x0, y0, x1, y1;
     OnDistanceCross(dKnownX, dKnownY, dBorder, x0, y0);
     OnDistanceCross(dKnownX0, dKnownY0, dBorder0, x1, y1); double dx, dy;
     double dis0, dis1, ds;
     dx = x0 - dKnownX[2];
     dy = y0 - dKnownY[2];
     dis0 = sqrt(dx * dx + dy * dy); 
     dx = x1 - dKnownX[2];
     dy = y1 - dKnownY[2];
     dis1 = sqrt(dx * dx + dy * dy); 
     ds = dis0 - dis1; // 这里以两个距离的差值大小判断交会的方向是否可以被判断。
     // 如果这个差值等于0,那么交会点存在两个解。
     // 这里设置2米,该值是否合适?
     if (fabs(ds) < 2) 
      return FALSE; // 这里再判断方向在那一边。
     dis0 = fabs(dis0 - dBorder[2]);
     dis1 = fabs(dis1 - dBorder[2]);
     ds = dis0 - dis1;
     if (ds < 0)
     {
      x = x0; 
      y = y0;
     }
     else
     {
      x = x1; 
      y = y1;
     } 
      

  2.   

    // 两个已知点的距离
    麻烦你看看注释说明已经知道两个点得坐标
    只不过 他用参数double X[], double Y[]代替了