Выбрать такие четверки точек, которые лежат в одной плоскости
Чисто геометрически, понимаю, как это они лежат в одной плоскости, а как это реализовать? И вообще, подкиньте пожалуйста идей по реализации кода.
Спасибо.
Подкиньте идею хотя бы.
Любые три точки всегда лежат в одной плоскости. Отдельный случай, когда три точки лежат на одной прямой -- тогда через них бесконечное число плоскостей провести можно. Из трех любых точек получайте уравнение их плоскости. Если другие точки соответствуют этому уравнению, то они в той-же плоскости. Разобравшись с первой тройкой, берите следующую из точек, отличных от тех, что лежали в первой плоскости. И т.д.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{ // В пространстве задано некоторое множество точек. Выбрать из них такие четверки точек,
// которые лежат в одной плоскости.
class Program
{
static int[] x;
static int[] y;
static int[] z;
static int count = 0;
static void Main(string[] args)
{
char[] delimited = new char[] { ' ', ',', '.' };
string line;
int i = 0, j, k, n;
double a, b, c, d;
Console.WriteLine("Введите количество точек на плоскости");
n = int.Parse(Console.ReadLine());
x = new int[n];
y = new int[n];
z = new int[n];
using(StreamReader f = new StreamReader("test1.txt"))
{
while ((line = f.ReadLine()) != null)
{
Console.WriteLine(line);
string[] numbers = line.Split(delimited);
x[i] = int.Parse(numbers[0]);
y[i] = int.Parse(numbers[1]);
z[i] = int.Parse(numbers[2]);
i++;
}
}
for (i = 0; i < n - 2; i++)
{
for (j = 0; j < n - 2; j++)
{
if (i == j)
continue;
for (k = 0; k < n - 2; k++)
{
if ((i == k) || (j == k))
continue;
a = (y[j]*(z[k+1]-z[k+2]))+(y[j+1]*(z[k+2]-z[k]))+(y[j+2]*(z[k]-z[k+1]));
b = (z[k]*(x[i+1]-x[i+2]))+(z[k+1]*(x[i+2]-x[i]))+(z[k+2]*(x[i]-x[i+1]));
c = (x[i]*(y[j+1]-y[j+2]))+(x[i+1]*(y[j+2]-y[j]))+(x[i+2]*(y[j]-y[j+1]));
d = (x[i]*(y[j+1]*z[k+2]-y[j+2]*z[k+1]))+(x[i+1]*(y[j+2]*z[k]-y[j]*z[k+2]))+(x[i+2]*(y[j]*z[k+1]-y[j+1]*z[k]));
if (a*x[i]+b*y[j]+c*z[k]+d == 0)
{
count ++;
}
}
}
}
if (count != 0)
Console.WriteLine("Количество четверок:{0}", count);
if (count == 0)
Console.WriteLine("Четверок нет");
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{ // В пространстве задано некоторое множество точек. Выбрать из них такие четверки точек,
// которые лежат в одной плоскости.
class Program
{
static int[] x;
static int[] y;
static int[] z;
static int count = 0;
static void Main(string[] args)
{
char[] delimited = new char[] { ' ', ',', '.' };
string line;
int i = 0, j, k, n;
double a, b, c, d;
Console.WriteLine("Введите количество точек на плоскости");
n = int.Parse(Console.ReadLine());
x = new int[n];
y = new int[n];
z = new int[n];
using(StreamReader f = new StreamReader("test1.txt"))
{
while ((line = f.ReadLine()) != null)
{
Console.WriteLine(line);
string[] numbers = line.Split(delimited);
x[i] = int.Parse(numbers[0]);
y[i] = int.Parse(numbers[1]);
z[i] = int.Parse(numbers[2]);
i++;
}
}
for (i = 0; i < n - 2; i++)
{
for (j = 0; j < n - 2; j++)
{
if (i == j)
continue;
for (k = 0; k < n - 2; k++)
{
if ((i == k) || (j == k))
continue;
a = (y[j]*(z[k+1]-z[k+2]))+(y[j+1]*(z[k+2]-z[k]))+(y[j+2]*(z[k]-z[k+1]));
b = (z[k]*(x[i+1]-x[i+2]))+(z[k+1]*(x[i+2]-x[i]))+(z[k+2]*(x[i]-x[i+1]));
c = (x[i]*(y[j+1]-y[j+2]))+(x[i+1]*(y[j+2]-y[j]))+(x[i+2]*(y[j]-y[j+1]));
d = (x[i]*(y[j+1]*z[k+2]-y[j+2]*z[k+1]))+(x[i+1]*(y[j+2]*z[k]-y[j]*z[k+2]))+(x[i+2]*(y[j]*z[k+1]-y[j+1]*z[k]));
if (a*x[i]+b*y[j]+c*z[k]+d == 0)
{
count ++;
}
}
}
}
if (count != 0)
Console.WriteLine("Количество четверок:{0}", count);
if (count == 0)
Console.WriteLine("Четверок нет");
Console.ReadLine();
}
}
}
1) Выбираем 4 точки;
2) Выбираем из этих четырех точек три и находим A, B, C уравнения плоскости (см. уравнение плоскости);
3.1) Находим расстояние от четвертой точки до плоскости из трех точек (см. расстояние до плоскости);
3.2) Если расстояние от точки до плоскости равно нулю, точка лежит в плоскости.
или
3.1) Подставляем координаты четвертой точки в уравнение плоскости.
3.2) Если оно верно, точка в плоскости.
На всякий случай: векторное произведение векторов
Удачи!