التحقق من وقوع ثلاث نقاط على استقامة واحدة

من موسوعة حسوب
اذهب إلى: تصفح، ابحث

تتحقق هذه الخوارزمية من وقوع ثلاث نقاط على استقامة واحدة (colinear).

مثال:

Input : (1, 1), (1, 4), (1, 5)
Output : Yes 
The points lie on a straight line

Input : (1, 5), (2, 5), (4, 6)
Output : No 
The points do not lie on a straight line

مبدأ عمل الخوارزمية

هناك طريقتان يمكن من خلالهما معرفة ما إذا كانت النقاط الثلاثة المعطاة واقعة على استقامة واحدة.

الطريقة الأولى

تقع ثلاث نقاط على استقامة واحدة إذا كانت مساحة المثلث الذي يتكوّن من هذه النقاط تساوي صفرًا؛ لذا يمكن التحقق من مساحة المثلث لمعرفة ما إذا كانت النقاط الثلاثة على استقامة واحدة أم لا.

يمكن استخدام المعادلة التالية لإيجاد مساحة المثلث:

0.5 * [x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)]

تمثّل المعادلة أعلاه نصف قيمة المحدّد determinant للمصفوفة التالية:

x1 x2 x3
y1 y2 y3
1   1  1

تنفيذ الخوارزمية

تعرض الأمثلة التالية طريقة تنفيذ الخوارزمية في عدد من لغات البرمجة:

  • C++‎:
#include <bits/stdc++.h> 
#include <math.h> 
#include <stdlib.h> 

using namespace std; 
void collinear(int x1, int y1, int x2, 
			int y2, int x3, int y3) 
{ 
	// حساب مساحة المثلث 
	// لا تُضرب المعادلة بالمقدار 0.5
	// وذلك لتجنب الأخطاء الحاصلة في حسابات الفاصلة العائمة
	int a = x1 * (y2 - y3) + 
			x2 * (y3 - y1) + 
			x3 * (y1 - y2); 

	if (a == 0) 
		cout << "Yes"; 
	else
		cout << "No"; 
} 

// اختبار الدالة السابقة
int main() 
{ 
	int x1 = 1, x2 = 1, x3 = 1, 
		y1 = 1, y2 = 4, y3 = 5; 
	collinear(x1, y1, x2, y2, x3, y3); 
	return 0; 
}
  • بايثون:
def collinear(x1, y1, x2, y2, x3, y3): 
	
	""" حساب مساحة المثلث 
		لا تُضرب المعادلة بالمقدار 0.5
		وذلك لتجنب الأخطاء الحاصلة في حسابات الفاصلة العائمة """
	a = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2) 

	if (a == 0): 
		print "Yes"
	else: 
		print "No"

# اختبار الدالة السابقة
x1, x2, x3, y1, y2, y3 = 1, 1, 1, 1, 4, 5
collinear(x1, y1, x2, y2, x3, y3)
  • جافا:
class GFG 
{ 
	
	static void collinear(int x1, int y1, int x2, 
						int y2, int x3, int y3) 
	{ 
		
			// حساب مساحة المثلث 
			// لا تُضرب المعادلة بالمقدار 0.5
			// وذلك لتجنب الأخطاء الحاصلة في حسابات الفاصلة العائمة
		int a = x1 * (y2 - y3) + 
				x2 * (y3 - y1) + 
				x3 * (y1 - y2); 
	
		if (a == 0) 
			System.out.println("Yes"); 
		else
			System.out.println("No"); 
	} 
		
	// اختبار التابع السابق
	public static void main(String args[]) 
	{ 
		int x1 = 1, x2 = 1, x3 = 1, 
			y1 = 1, y2 = 4, y3 = 5; 
							
		collinear(x1, y1, x2, y2, x3, y3); 

	} 
}

الطريقة الثانية

يجب أن يكون ميل أيّ زوج من النقاط الثلاثة مساويًا لميل الزوج الآخر من النقاط، لتكون النقاط الثلاثة على استقامة واحدة.

فعلى سبيل المثال إن كان لدينا النقاط (x1, y1) و (x2, y2) و (x3, y3) فيجب أن يكون مي الخط المستقيم الرابط بين النقطتين (x2, y2) و (x3, y3) مساويًا لميل الخط المستقيم الرابط بين النقطتين (x1, y1) و (x2, y2).

أي أنّ:

(y3 - y2)/(x3 - x2) = (y2 - y1)/(x2 - x1)

إن كانت العلاقة السابقة مساوية للصفر فهذا يعني أنّ النقاط الثلاثة على استقامة واحدة.

  • C++‎:
#include <stdio.h> 
#include <math.h> 

void collinear(int x1, int y1, int x2, 
			int y2, int x3, int y3) 
{ 
	if ((y3 - y2) * (x2 - x1) == 
		(y2 - y1) * (x3 - x2)) 
		printf("Yes"); 
	else
		printf("No"); 
} 

// اختبار الدالة السابقة 
int main() 
{ 
	int x1 = 1, x2 = 1, x3 = 0, 
		y1 = 1, y2 = 6, y3 = 9; 
	collinear(x1, y1, x2, y2, x3, y3); 
	return 0; 
}
  • بايثون:
def collinear(x1, y1, x2, y2, x3, y3): 
	
	if ((y3 - y2)*(x2 - x1) == (y2 - y1)*(x3 - x2)): 
		print ("Yes") 
	else: 
		print ("No") 

# اختبار الدالة السابقة
x1, x2, x3, y1, y2, y3 = 1, 1, 0, 1, 6, 9
collinear(x1, y1, x2, y2, x3, y3);
  • جافا:
import java.io.*; 

class GFG { 

static void cool_line(int x1, int y1, int x2, 
			int y2, int x3, int y3) 
{ 
	if ((y3 - y2) * (x2 - x1) == 
		(y2 - y1) * (x3 - x2)) 
		System.out.println("Yes"); 
	else
		System.out.println("No"); 
} 

// اختبار التابع السابق
	
	public static void main (String[] args) { 
		int a1 = 1, a2 = 1, a3 = 0, 
		b1 = 1, b2 = 6, b3 = 9; 
	cool_line(a1, b1, a2, b2, a3, b3); 
		
		
	} 
}

مصادر