本关任务:编写一个c++程序,计算四个点所构成的两条直线的夹角。可以控制输出流显示浮点数的数字个数。C++默认的输出流数值有效位是6。平面上给定4个点的坐标A B C D,分别表示直线AB和CD。坐标均为绝对值不超过100的整数。计算出这两条直线所成的锐角是多少度。(保留两位小数,pi取3.1415926) 注意:当两直线平行或者重合,答案为0。
时间: 2024-04-18 07:24:33 浏览: 193
为了计算两条直线的夹角,我们可以使用向量概念。假设两条直线分别为AB和CD,可以计算向量AB和向量CD的夹角。具体的步骤如下:
1. 根据给定的四个点的坐标,计算向量AB和向量CD的坐标表示。向量AB的坐标表示为(dx1, dy1),向量CD的坐标表示为(dx2, dy2)。
2. 计算向量AB和向量CD的模长,分别记为|AB|和|CD|。
3. 计算向量AB和向量CD的点积,记为AB·CD。
4. 计算夹角的余弦值,使用点积的性质:cosθ = (AB·CD) / (|AB|·|CD|)。
5. 使用反余弦函数acos()来计算夹角的弧度值。
6. 将弧度值转换为度数,乘以180/π(π取3.1415926),得到夹角的度数。
下面是一个实现上述步骤的C++程序示例:
```cpp
#include <iostream>
#include <cmath>
double calculateAngle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {
double dx1 = x2 - x1;
double dy1 = y2 - y1;
double dx2 = x4 - x3;
double dy2 = y4 - y3;
double lengthAB = std::hypot(dx1, dy1);
double lengthCD = std::hypot(dx2, dy2);
if (lengthAB == 0 || lengthCD == 0) {
return 0.0;
}
double dotProduct = dx1 * dx2 + dy1 * dy2;
double cosTheta = dotProduct / (lengthAB * lengthCD);
double angleRad = std::acos(cosTheta);
double angleDeg = angleRad * 180.0 / 3.1415926;
return angleDeg;
}
int main() {
int x1, y1, x2, y2, x3, y3, x4, y4;
std::cout << "请输入点A的坐标(x1 y1):";
std::cin >> x1 >> y1;
std::cout << "请输入点B的坐标(x2 y2):";
std::cin >> x2 >> y2;
std::cout << "请输入点C的坐标(x3 y3):";
std::cin >> x3 >> y3;
std::cout << "请输入点D的坐标(x4 y4):";
std::cin >> x4 >> y4;
double angle = calculateAngle(x1, y1, x2, y2, x3, y3, x4, y4);
std::cout.precision(2);
std::cout << "两条直线所成的锐角为:" << std::fixed << angle << "度" << std::endl;
return 0;
}
```
你可以将以上代码保存为一个.cpp文件,并使用C++编译器进行编译和运行。在程序运行时,会提示你依次输入四个点的坐标,然后会输出计算得到的两条直线所成的锐角。
阅读全文