专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

三角形,已知两点坐标和三个角度,怎么求第三点坐标

发布时间:2011-06-28 10:20:12 文章来源:www.iduyao.cn 采编人员:星星草
三角形,已知两点坐标和三个角度,如何求第三点坐标
本帖最后由 zyx040404 于 2015-10-22 18:55:27 编辑
例如:已知点P1(x1,y1),点P2(x2,y2)和角度A1,A2,A3,如何求第三点P3(x3,y3)的坐标
------解决思路----------------------
要求什么就设什么 ,设第三个坐标是 (x3,y3),要求两个未知数,需要两个方程即可 ,假设有三个坐标球出来的三条边分别用a,b,c表示,其所对应的角分别为A1,A2,A3 根据a/sinA1=b/sinA2=c/sinA3,列出一个关于x3,y3的方程 ,再由任意一个角的余弦公式得到另一个关于 X3,Y3的方程 ,结合两个方程求解未知数 。。。。
------解决思路----------------------
由正弦定理(a/sinA=b/sinB=c/sinC)可求得另外两边长,然后设第三点坐标(x,y),满足这一点到另2点的距离为前面求出来的边长。
------解决思路----------------------
我在6楼说的思路不对,加或减的应该是角A1或A2而不是atan(y1 / x1)或atan(y2 / x2)
要旋转的角度应该是atan2((p2.y - p1.y),  (p2.x - p1.x))而不是atan(y1 / x1)或atan(y2 / x2)
另外直接求对角的两组就行了。

#include <math.h> // fabs, sin, cos, atan, atan2
#include <stdio.h> // printf
struct Pt {double x; double y;};
void f(double a1, double a2, Pt p1, Pt p2)
{
double Ag = atan2((p2.y - p1.y) , (p2.x - p1.x));
double arr_A1[2] = { Ag - a1, Ag + a1};
double arr_A2[2] = { Ag + a2, Ag - a2};

int i;
double A1, A2, kA1, kB1, kC1, kA2, kB2, kC2, rho1, rho2, x_left, x_right, y_left, y_right;
for (i = 0; i != 2; ++i)
{
A1 = arr_A1[i];
A2 = arr_A2[i];
kA1 = cos(A1);
kB1 = -cos(A2);
kC1 = p2.x - p1.x;

kA2 = sin(A1);
kB2 = -sin(A2);
kC2 = p2.y - p1.y;

rho1 = (kB1 * kC2 - kB2 * kC1) / (kB1 * kA2 - kB2 * kA1);
rho2 = (kA1 * kC2 - kA2 * kC1) / (kA1 * kB2 - kA2 * kB1);

x_left = rho1 * cos(A1) + p1.x;
x_right = rho2 * cos(A2) + p2.x;
y_left = rho1 * sin(A1) + p1.y;
y_right = rho2 * sin(A2) + p2.y;

if (fabs(x_left - x_right) < 1e-2 
&& fabs(y_left - y_right) < 1e-2)
printf("P3(%.2lf,%.2lf)n", x_left, y_left);
}

}
int main()
{
Pt p1 = {4, 1}, p2 = {2, 5};
f(atan(1), atan(1), p1, p2); // 测试用的是一个斜着的等腰直角三角形
return 0;
}

------解决思路----------------------
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: