使用的是向量法,先求出平面的法向量,再写出平面的点法式方程
#include <iostream>
using namespace std;
//定义一个结构体表示三维坐标
struct Point {
double x;
double y;
double z;
};
//定义一个函数计算两个点之间的向量
Point vector(Point p1, Point p2) {
Point v;
v.x = p2.x - p1.x;
v.y = p2.y - p1.y;
v.z = p2.z - p1.z;
return v;
}
//定义一个函数计算两个向量的叉积
Point crossProduct(Point v1, Point v2) {
Point n; //法向量
n.x = v1.y * v2.z - v1.z * v2.y;
n.y = v1.z * v2.x - v1.x * v2.z;
n.z = v1.x * v2.y - v1.y * v2.x;
return n;
}
//定义一个函数输出平面方程
void planeEquation(Point a, Point b, Point c) {
//求出两个向量ab和ac
Point ab = vector(a,b);
Point ac = vector(a,c);
//求出法向量n
Point n = crossProduct(ab,ac);
//用点法式表示平面方程:n*(x-a)=0
cout << "The equation of the plane is: " << endl;
if (n.x !=0) { //如果n的x分量不为0,就把x移到右边,否则保持不变
cout << n.x << "x";
if (a.x !=0) { //如果a的x坐标不为0,就把它移到右边,并加上符号,否则忽略它
if (a.x >0) {
cout << "-" << a.x;
}
else {
cout << "+" << -a.x;
}
}
cout << " ";
}
if (n.y !=0) { //如果n的y分量不为0,就把y移到右边,并加上符号,否则保持不变
if (n.y >0) {
cout << "+";
}
else {
cout << "-";
}
cout << abs(n.y) << "y"; //取绝对值避免重复负号
if (a.y !=0) { //如果a的y坐标不为0,就把它移到右边,并加上符号,否则忽略它
if (a.y >0) {
cout << "-" << a.y;
}
else {
cout << "+" << -a.y;
}
}
cout <<" ";
}
if (n.z !=0) { //如果n的z分量不为0,就把z移到右边,并加上符号,否则保持不变
if (n.z >0) {
cout<<"+";
}
else{
cout<<"-";
}
cout<<abs(n.z)<< "z"; //取绝对值避免重复负号
if(a.z!=0){ //如果a的z坐标不为0,就把它移到右边,并加上符号,否则忽略它
if(a.z>0){
cout<<"-"<<a.z;
}
else{
cout<<"+"<<-a.z;
}
}
cout<<" ";
}
//最后等于零
cout<<"= "<< "0"<<"\n";
}
int main() {
//输入三个
//输入三个点的坐标
Point p1, p2, p3;
cout << "Enter the coordinates of point 1: " << endl;
cin >> p1.x >> p1.y >> p1.z;
cout << "Enter the coordinates of point 2: " << endl;
cin >> p2.x >> p2.y >> p2.z;
cout << "Enter the coordinates of point 3: " << endl;
cin >> p3.x >> p3.y >> p3.z;
//调用函数输出平面方程
planeEquation(p1,p2,p3);
//结束程序
return 0;
}