求三角形的第三坐标

Finding Third Coordinate Of a Triangle

我有一个编程作业 class。 我已经完成了百分之八十,我无法完成最后一部分。

我们必须找到岸边和船之间的距离(C点)和船的坐标(C点)。

我们得到了点 A 和 B 的 (X,Y) 坐标和角度。

给定 A(76,316) B(57,516) 角 A = 17° 和 B = 17° 角。

到目前为止,我发现 AB= 200.9 AC= 105.04 BC = 105.04 C = 146° 岸与船之间的距离 d = 30.71。

我尝试了所有方法,但找不到 C 点(船)的坐标。

也给出了输出:d = 30.71,C 的坐标 = C(97.07,418.90)

请帮我求出C点坐标

#include <stdio.h>
#include <math.h>
float radian(int degree);
float get_watchtowers_distance(int x1,int y1,int x2,int y2);
float get_boat_distance(float d,int alpha,int beta);
int main(){
    get_watchtowers_distance(76,316,57,516);
    get_boat_distance(200.90,17,17);
}
float radian(int degree){
    return degree * (M_PI/180);
}
float get_watchtowers_distance(int x1,int y1,int x2,int y2){
    return  sqrtf(powf(x2-x1,2.0f)+powf(y2-y1,2.0f));
}
float get_boat_distance(float d,int alpha,int beta){
    float a,b,c = 180 - (float)alpha - (float)beta;
    a = (float)radian(alpha);
    b = (float)radian(beta);
    c = (float)radian(c);
    printf("%.2f %.2f %.2f\n",a,b,c);
    float B,A = d*sinf(a)/sinf(c);
    B = d*sinf(b)/sinf(c);
    float dist,area = 1.0f/2.0f*A*B*sinf(c);
    dist = 2*area/d;
    printf("AC Distance : %.2f , BC distance : %.2f\n",A,B);
    printf("Boat Distance : %.2f\n", dist);
    return dist;
}

查找 d 距离的更简单方法。我们可以通过 d 和余切

来表示底的左右部分的长度
aa = d * ctg(alpha)
bb = d * ctg(beta)
aa + bb = l 
d * (ctg(alpha) + ctg(beta)) = l
d = l / (ctg(alpha) + ctg(beta)) = 
  = l * sin(alpha) * sin(beta) / sin(alpha+beta)

现在您可以使用归一化向量 ab 和垂直分量

找到 C 坐标
abx = (b.x - a.x) / l
aby = (b.y - a.y) / l
aalen = d / tg(alpha)

c.x = a.x + abx * aalen - aby * d
c.y = a.y + aby * aalen + abx * d

要直接求距离d而不用确定点C,首先,你可以计算三角形的面积S two ways.

  • S = 0.5 * l * d

  • S = 0.5 * l * l * sin(a) * sin(b) / sin(a + b)

将两者相等并抵消 0.5 * l 得到 d = l * sin(a) * sin(b) / sin(a + b).

好了,我已经为你的问题写了一些代码..

float get_coordinates(int x1, int y1, int x2, int y2, float alpha, float beta){
    float a_angle_alpha, b_angle_beta, c_angle_delta;
    c_angle_delta = 180 - (float)alpha - (float)beta;
    printf("Alpha Angle in Degrees = %.2f\nBeta Angle in Degrees = %.2f\nDelta Angle in Degrees = %.2f\n", alpha, beta, c_angle_delta);
    a_angle_alpha = (float)radian(alpha);
    b_angle_beta = (float)radian(beta);
    c_angle_delta = (float)radian(c_angle_delta);
    printf("Alpha in radiance: %.2f\nBeta in radiance: %.2f\nDelta in radiance: %.2f\n", a_angle_alpha, b_angle_beta, c_angle_delta);
    int u, v;
    float d;
    u = x2 - x1;
    v = y2 -y1;
    printf("u = %.d\nv = %.d\n", u, v);
    float d1_distance_AB, d2_distance_BC, d3_distance_AC;
    d1_distance_AB = sqrtf((u*u)+ (v*v));
    d2_distance_BC = d1_distance_AB*sinf(b_angle_beta)/sinf(c_angle_delta);
    d3_distance_AC = d1_distance_AB*sinf(a_angle_alpha)/sinf(c_angle_delta);
    printf("Distance between A and B: %.2f\nDistance between B and C: %.2f\nDistance between A and C: %.2f\n",d1_distance_AB, d2_distance_BC, d3_distance_AC);
    float RHS1, RHS2;
    float x3, y3;
    RHS1 = ((x1 * u) + (y1 * v) + (d2_distance_BC * d1_distance_AB * cosf(a_angle_alpha)));
    RHS2 = ((y2 * u) - (x2 * v) - (d2_distance_BC * d1_distance_AB * sinf(a_angle_alpha)));
    x3 = ((1 / (d1_distance_AB * d1_distance_AB)) * ((u * RHS1) - (v * RHS2)));
    y3 = ((1 / (d1_distance_AB * d1_distance_AB)) * ((v * RHS1) + (u * RHS2)));
    printf("Coordinates of Boat at point C is = %.2f:%.2f (x:y)", x3, y3);
    float coordinates[2] = {x3,y3};
    return coordinates;
}

完整代码:

#include <stdio.h>
#include <math.h>
float radian(int degree);
float get_watchtowers_distance(int x1,int y1,int x2,int y2);
float get_boat_distance(float d,int alpha,int beta);
float get_coordinates(int x1, int y1, int x2, int y2, float alpha, float beta);
int main(){
    get_watchtowers_distance(76,316,57,516);
    get_boat_distance(200.90,17,17);
    get_coordinates(76,316,57,516,17,17);
}
float radian(int degree){
    return degree * (M_PI/180);
}
float get_watchtowers_distance(int x1,int y1,int x2,int y2){
    return  sqrtf(powf(x2-x1,2.0f)+powf(y2-y1,2.0f));
}
float get_boat_distance(float d,int alpha,int beta){
    float a,b,c = 180 - (float)alpha - (float)beta;
    a = (float)radian(alpha);
    b = (float)radian(beta);
    c = (float)radian(c);
    printf("%.2f %.2f %.2f\n", a, b, c);
    float B,A = d*sinf(a)/sinf(c);
    B = d*sinf(b)/sinf(c);
    float dist,area = 1.0f/2.0f*A*B*sinf(c);
    dist = 2*area/d;
    printf("AC Distance : %.2f , BC distance : %.2f\n",A,B);
    printf("Boat Distance : %.2f\n", dist);
    return dist;
}
float get_coordinates(int x1, int y1, int x2, int y2, float alpha, float beta){
    float a_angle_alpha, b_angle_beta, c_angle_delta;
    c_angle_delta = 180 - (float)alpha - (float)beta;
    printf("Alpha Angle in Degrees = %.2f\nBeta Angle in Degrees = %.2f\nDelta Angle in Degrees = %.2f\n", alpha, beta, c_angle_delta);
    a_angle_alpha = (float)radian(alpha);
    b_angle_beta = (float)radian(beta);
    c_angle_delta = (float)radian(c_angle_delta);
    printf("Alpha in radiance: %.2f\nBeta in radiance: %.2f\nDelta in radiance: %.2f\n", a_angle_alpha, b_angle_beta, c_angle_delta);
    int u, v;
    float d;
    u = x2 - x1;
    v = y2 -y1;
    printf("u = %.d\nv = %.d\n", u, v);
    float d1_distance_AB, d2_distance_BC, d3_distance_AC;
    d1_distance_AB = sqrtf((u*u)+ (v*v));
    d2_distance_BC = d1_distance_AB*sinf(b_angle_beta)/sinf(c_angle_delta);
    d3_distance_AC = d1_distance_AB*sinf(a_angle_alpha)/sinf(c_angle_delta);
    printf("Distance between A and B: %.2f\nDistance between B and C: %.2f\nDistance between A and C: %.2f\n",d1_distance_AB, d2_distance_BC, d3_distance_AC);
    float RHS1, RHS2;
    float x3, y3;
    RHS1 = ((x1 * u) + (y1 * v) + (d2_distance_BC * d1_distance_AB * cosf(a_angle_alpha)));
    RHS2 = ((y2 * u) - (x2 * v) - (d2_distance_BC * d1_distance_AB * sinf(a_angle_alpha)));
    x3 = ((1 / (d1_distance_AB * d1_distance_AB)) * ((u * RHS1) - (v * RHS2)));
    y3 = ((1 / (d1_distance_AB * d1_distance_AB)) * ((v * RHS1) + (u * RHS2)));
    printf("Coordinates of Boat at point C is = %.2f:%.2f (x:y)", x3, y3);
    float coordinates[2] = {x3,y3};
    return coordinates;
}

输出:

0.30 0.30 2.55                                                                                                                                                                     
AC Distance : 105.04 , BC distance : 105.04                                                                                                                                        
Boat Distance : 30.71                                                                                                                                                              
Alpha Angle in Degrees = 17.00                                                                                                                                                     
Beta Angle in Degrees = 17.00                                                                                                                                                      
Delta Angle in Degrees = 146.00                                                                                                                                                    
u = -19                                                                                                                                                                     
v = 200                  
Distance between A and B: 200.90                                                                                                                                                   
Distance between B and C: 105.04                                                                                                                                                   
Distance between A and C: 105.04                                                                                                                                                   
Coordinates of Boat at point C is = 97.07:418.90 (x:y)