إيجاد معادلة المستوى الذي يمرّ عبر ثلاث نقاط
تحسب هذه الخوارزمية معادلة المستوى الذي يمرّ عبر ثلاث نقاط معرّفة بإحداثياتها (x1, y1, z1)
و (x2, y2, z2)
و (x3, y3, z3)
.
مثال:
Input: x1 = -1 y1 = w z1 = 1
x2 = 0 y2 = -3 z2 = 2
x3 = 1 y3 = 1 z3 = -4
Output: equation of plane is 26 x + 7 y + 9 z + 3 = 0.
Input: x1 = 2, y1 = 1, z1 = -1, 1
x2 = 0, y2 = -2, z2 = 0
x3 = 1, y3 = -1, z3 = 2
Output: equation of plane is -7 x + 5 y + 1 z + 10 = 0.
مبدأ عمل الخوارزمية
لنفترض أن النقاط الثلاثة هي P
و Q
و R
وتمتلك هذه النقاط الإحداثيات (x1, y1, z1)
و (x2, y2, z2)
و (x3, y3, z3)
على التوالي.
تكون معادلة المستوى وفقًا لهذه المعطيات:
a * (x – x0) + b * (y – y0) + c * (z – z0) = 0
تمثّل a
وb
و c
نسب الاتجاه الخاصة بناظم المستوى normal، والإحداثيات (x0, y0, z0)
هي إحداثيات أيّ من النقاط الثلاثة (أي P
أو Q
أو R
) التي تمرّ عبر المستوى. ولحساب نسب الاتجاهات لناظم المستوى يمكن أخذ أي متجهين في المستوى، وليكونا المتجه PQ
والمتجه pR
.
=> Vector PQ = (x2 - x1, y2 - y1, z2 - z1) = (a1, b1, c1).
=> Vector PR = (x3 - x1, y3 - y1, z3 - z1) = (a2, b2, c2).
المتّجه الناظم لهذا المستوى سيكون المتّجه PQ × PR
:
=> PQ X PR = (b1 * c2 - b2 * c1) i
+ (a2 * c1 - a1 * c2) j
+ (a1 * b2 - b1 *a2) k = ai + bj + ck.
a, b, c
ستكون نسب الاتجاهات لناظم المتجه، وبأخذ أي نقطة من النقاط P
أو Q
أو R
وبفرض أنّ إحداثياتها هي (x0, y0, z0)
فإنّ معادلة المستوى الذي يمرّ عبر النقطة (x0, y0, z0)
وتمتلك نسب الاتجاهات a, b, c
ستكون:
=> a * (x - x0) + b * (y - y0) + c * (z - z0) = 0.
=> a * x - a * x0 + b * y - b * y0 + c * z - c * z0 = 0.
=> a * x + b * y + c * z + (- a * x0 - b * y0 - c * z0) = 0.
تنفيذ الخوارزمية
تعرض الأمثلة التالية طريقة تنفيذ الخوارزمية في عدد من لغات البرمجة:
- C++:
#include <bits/stdc++.h>
#include<math.h>
#include <iostream>
#include <iomanip>
using namespace std;
void equation_plane(float x1, float y1,
float z1, float x2,
float y2, float z2,
float x3, float y3, float z3)
{
float a1 = x2 - x1;
float b1 = y2 - y1;
float c1 = z2 - z1;
float a2 = x3 - x1;
float b2 = y3 - y1;
float c2 = z3 - z1;
float a = b1 * c2 - b2 * c1;
float b = a2 * c1 - a1 * c2;
float c = a1 * b2 - b1 * a2;
float d = (- a * x1 - b * y1 - c * z1);
std::cout << std::fixed;
std::cout << std::setprecision(2);
cout << "equation of plane is " << a << " x + " << b
<< " y + " << c << " z + " << d << " = 0.";
}
// اختبار الدالة السابقة
int main()
{
float x1 =-1;
float y1 = 2;
float z1 = 1;
float x2 = 0;
float y2 =-3;
float z2 = 2;
float x3 = 1;
float y3 = 1;
float z3 =-4;
equation_plane(x1, y1, z1, x2, y2, z2, x3, y3, z3);
return 0;
}
- بايثون:
def equation_plane(x1, y1, z1, x2, y2, z2, x3, y3, z3):
a1 = x2 - x1
b1 = y2 - y1
c1 = z2 - z1
a2 = x3 - x1
b2 = y3 - y1
c2 = z3 - z1
a = b1 * c2 - b2 * c1
b = a2 * c1 - a1 * c2
c = a1 * b2 - b1 * a2
d = (- a * x1 - b * y1 - c * z1)
print "equation of plane is ",
print a, "x +",
print b, "y +",
print c, "z +",
print d, "= 0."
# اختبار الدالة السابقة
x1 =-1
y1 = 2
z1 = 1
x2 = 0
y2 =-3
z2 = 2
x3 = 1
y3 = 1
z3 =-4
equation_plane(x1, y1, z1, x2, y2, z2, x3, y3, z3)
- جافا:
import java .io.*;
class GFG
{
static void equation_plane(float x1, float y1,
float z1, float x2,
float y2, float z2,
float x3, float y3,
float z3)
{
float a1 = x2 - x1;
float b1 = y2 - y1;
float c1 = z2 - z1;
float a2 = x3 - x1;
float b2 = y3 - y1;
float c2 = z3 - z1;
float a = b1 * c2 - b2 * c1;
float b = a2 * c1 - a1 * c2;
float c = a1 * b2 - b1 * a2;
float d = (- a * x1 - b * y1 - c * z1);
System.out.println("equation of plane is " + a +
" x + " + b + " y + " + c +
" z + " + d + " = 0.");
}
// اختبار التابع السابق
public static void main(String[] args)
{
float x1 =-1;
float y1 = 2;
float z1 = 1;
float x2 = 0;
float y2 =-3;
float z2 = 2;
float x3 = 1;
float y3 = 1;
float z3 =-4;
equation_plane(x1, y1, z1, x2,
y2, z2, x3, y3, z3);
}
}
تعطي الشيفرات السابقة المخرجات التالية:
equation of plane is 26 x + 7 y + 9 z + 3 = 0.
مصادر
- صفحة Program to find equation of a plane passing through 3 points في توثيق الخوارزميات في موقع GeeksforGeeks.