人人都说CSDN上的人很热情,第一次提问 :) 给了三角形的三条边(如3,4,5),如何求它三个点的位置,只有这个条件没有其他的条件了。人人都说CSDN上的人很热情,第一次提问 :) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 切~~~ 三点都给你了 还用的着去求了吗? 我给的这点只是一个参照物而已啊。其实已经可以了,别人写的有代码只是我看不懂,我贴上来给你门研究下啊。-------------------------------------------------------------------------------------下面代码不能直接使用,需要修改一下。功能:计算三条边交会的未知点坐标。说明:为什么要三条边?如果是两条边,则存在二义性,无法计算。这段代码来自控制网近似坐标推算部分,坐标推算为自动进行,不要人为干预,所以需要三条边,这样才能确定点位置。注意,这里计算仅仅采用二条边,另外一条边仅仅参与方向判断,不参与坐标计算。// 采用距离交会计算坐标。// 注意,交会点和已知点以顺时针编号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; } // 两个已知点的距离麻烦你看看注释说明已经知道两个点得坐标只不过 他用参数double X[], double Y[]代替了 请高手给说明程序怎样实现功能 添加一些注释 谢谢 象棋 我想换工作,大家累帮我看看... 关于网页搜索技术 看错啊 请问:一级B软件的开发相关技术有哪些? My IM和AnyQ是怎么实现和QQ MSN通信的? 求救! C#的源代码如何编译出在64位XP下运行的程序? 请教一个主子窗体控制的问题!!!谢谢!! 挑战你的SQL语句水平,顶也有分 求一替换方法! 谢谢各位!!!!!!!
其实已经可以了,别人写的有代码只是我看不懂,我贴上来给你门研究下啊。-------------------------------------------------------------------------------------
下面代码不能直接使用,需要修改一下。
功能:计算三条边交会的未知点坐标。说明:为什么要三条边?如果是两条边,则存在二义性,无法计算。这段代码来自控制网近似坐标推算部分,坐标推算为自动进行,不要人为干预,所以需要三条边,这样才能确定点位置。注意,这里计算仅仅采用二条边,另外一条边仅仅参与方向判断,不参与坐标计算。// 采用距离交会计算坐标。
// 注意,交会点和已知点以顺时针编号
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;
}
麻烦你看看注释说明已经知道两个点得坐标
只不过 他用参数double X[], double Y[]代替了