24.09.2017, 18:52 [+3 UTC]
в нашей команде: 2 128 чел. | участники онлайн: 3 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
24.09.2017, 16:39

Последний вопрос:
24.09.2017, 14:40

Последний ответ:
24.09.2017, 15:05

Последняя рассылка:
24.09.2017, 14:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
06.04.2010, 20:15 »
Xrom1989
Verena, большое спасибо, особенно за вторую часть. Там все что мне надо для следующих задач=) [вопрос № 177620, ответ № 260643]
16.11.2010, 22:33 »
Konstantin Shvetski
Большое спасибо за енные разъяснения со ссылками [вопрос № 180794, ответ № 264103]
05.10.2009, 22:07 »
Olimjon
Спасибо за Ваш ответ. Он получился коротким и ясно полезным. [вопрос № 172933, ответ № 255040]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 238
solowey
Статус: 6-й класс
Рейтинг: 81
Хватов Сергей
Статус: Академик
Рейтинг: 70

Перейти к консультации №:
 

Консультация онлайн # 191214
Раздел: • С / С++
Автор вопроса: iperesypkina (Посетитель)
Отправлена: 09.07.2017, 11:32
Поступило ответов: 1

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:


надо решить задачу на языке СИ (чистом)
определение пар прямых с максимальным расстоянием между ними из данного множества из N прямых, заданных парами точек.
(Прямые в пространстве)

Состояние: Консультация закрыта

Ответ # 275149 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, iperesypkina!
Держите программу. Максимально прокомментировал.
Но без знания теории понять не получится...
Надеюсь, с аналитической геометрией Вы на "ты". smile

#include	<stdlib.h>
#include	<stdio.h>
#include	<time.h>
#include	<malloc.h>
#include	<math.h>

//структура, описывающая точку в трехмерном пространстве
typedef struct _point
{
	double	x;
	double	y;
	double	z;
}POINT;

//структура, описывающая линию, заданную двумя точками
typedef struct _line
{
	POINT	p1;
	POINT	p2;
} LINE;

double	e = 0.00001;

//нахождение смешанного произведения векторов
double mixesPrud(POINT *v1, POINT *v2, POINT *v3)
{
	return (v1->x*(v2->y*v3->z - v2->z*v3->y) - v1->y*(v2->x*v3->z - v2->z*v3->x) + v1->z*(v2->x*v3->y - v2->y*v3->x));
}

//проверка коллинеарности векторов
//вещественное число сравниваем не c 0, а на меньше числа e=0.00001
bool isCollinear(POINT *v1, POINT *v2)
{
	return (((v1->x/v2->x - v1->y/v2->y) < e) && ((v1->x/v2->x - v1->z/v2->z) < e));
}

//проверка прямых на совпадение
//подставляем значение одной координаты одной прямой в уравнение втророй и сравниваем с остальными
//если совпадает, то прямые совпадают
//учитываем, что прямые могут быть перпендикулярны осям координат
//вещественное число сравниваем не c 0, а на меньше числа e=0.00001
bool isEqualLines(LINE *pline1, LINE *pline2)
{
	double x, y, z;	
	if (pline2->p2.x - pline2->p1.x > e)		//прямая не перпендикулярна оси Х
	{
		y = pline2->p1.y + (pline1->p1.x - pline2->p1.x) * (pline2->p2.y - pline2->p1.y) / (pline2->p2.x - pline2->p1.x);
		z = pline2->p1.z + (pline1->p1.x - pline2->p1.x) * (pline2->p2.z - pline2->p1.z) / (pline2->p2.x - pline2->p1.x);
		return (((y - pline1->p1.y) < e) && ((z - pline1->p1.z) < e));
	}
	else if (pline2->p2.y - pline2->p1.y > e)	//прямая не перпендикулярна оси Y
	{
		x = pline2->p1.x + (pline1->p1.y - pline2->p1.y) * (pline2->p2.x - pline2->p1.x) / (pline2->p2.y - pline2->p1.y);
		z = pline2->p1.z + (pline1->p1.y - pline2->p1.y) * (pline2->p2.z - pline2->p1.z) / (pline2->p2.y - pline2->p1.y);
		return (((x - pline1->p1.x) < e) && ((z - pline1->p1.z) < e));
	}
	else  if (pline2->p2.z - pline2->p1.z > e) //прямая не перпендикулярна оси Z
	{
		x = pline2->p1.x + (pline1->p1.z - pline2->p1.z) * (pline2->p2.x - pline2->p1.x) / (pline2->p2.z - pline2->p1.z);
		y = pline2->p1.y + (pline1->p1.z - pline2->p1.z) * (pline2->p2.y - pline2->p1.y) / (pline2->p2.z - pline2->p1.z);
		return (((x - pline1->p1.x) < e) && ((y - pline1->p1.y) < e));
	}
	else
		return false;							//прямая фактически задана двумя одинаковыми точками
												// при желании можно отфильтровать при задании прямых
}

//нахождение расстояния между прямыми
double distance(LINE *pline1, LINE *pline2)
{
	POINT	v, s, n1, n2;
	double	mp;

	//сначала найдем направляющие вектора n1 и n2 прямых pline1 и pline2
	n1.x = pline1->p2.x - pline1->p1.x;
	n1.y = pline1->p2.y - pline1->p1.y;
	n1.z = pline1->p2.z - pline1->p1.z;

	n2.x = pline2->p2.x - pline2->p1.x;
	n2.y = pline2->p2.y - pline2->p1.y;
	n2.z = pline2->p2.z - pline2->p1.z;

	//Найдем вектор, соединяющий точку pline1->p2 с точкой pline2->p1
	v.x = pline1->p2.x - pline2->p1.x;
	v.y = pline1->p2.y - pline2->p1.y;
	v.z = pline1->p2.z - pline2->p1.z;

	//прямые скрещиваются, если векторы n1, n2 и v не компланарны
	//найдем модуль смешанного произведения и сравним на 0
	mp = fabs(mixesPrud(&n1, &n2, &v));
	if (mp < e)
	{											//компланарны, т.е. в одной плоскости
		if (isCollinear(&n1, &n2))				//коллинеарны? (параллельны?)
		{										//да - значит, прямые не пересекаются
			if (isEqualLines(pline1, pline2))	//прямые совпадают?
				return 0.;						//да, расстояние = 0
			else
			{									//прямые параллельны
				//найдем векторное произведение вектора v, 
				// и направляющего вектора, например, прямой pline2
				s.x = v.y * n2.z - v.z * n2.y;
				s.y = - v.x * n2.z + v.z * n2.x;
				s.z = v.x * n2.y - v.y * n2.x;
		
				//получим расстояние, как отношение длины вектора s к длине n2
				return (sqrt(s.x*s.x + s.y*s.y+ s.z*s.z) / sqrt(n2.x*n2.x + n2.y*n2.y+ n2.z*n2.z));
			}
		}
		else
			return 0.;							//прямые пересекаются, расстояние = 0
	}
	else
	{											//некомпланарны - прямые скрещиваются
		//найдем векторное произведение направляющих векторов
		s.x = n1.y * n2.z - n1.z * n2.y;
		s.y = - n1.x * n2.z + n1.z * n2.x;
		s.z = n1.x * n2.y - n1.y * n2.x;
		
		//получим расстояние, как отношение модуля смешанного произведения 
		//  и длины векторного произведения направляющих векторов
		return (mp / sqrt(s.x*s.x + s.y*s.y + s.z*s.z));
	}
}

int	main()
{
	const int	N = 10;			//количество прямых
	int			i, j;
	LINE*		pLines = (LINE*)malloc(N*sizeof(LINE));	//память под прямые
	
	srand(time(0));				//инициируем генератор псевдослучайных чисел

	for(i=0; i<N; i++)			//генерируем случайные прямые, величины берем в интервале [-100.0:99.9]
	{
		pLines[i].p1.x = ((double)(rand()%2000) / 10) - 100;
		pLines[i].p1.y = ((double)(rand()%2000) / 10) - 100;
		pLines[i].p1.z = ((double)(rand()%2000) / 10) - 100;

		pLines[i].p2.x = ((double)(rand()%2000) / 10) - 100;
		pLines[i].p2.y = ((double)(rand()%2000) / 10) - 100;
		pLines[i].p2.z = ((double)(rand()%2000) / 10) - 100;
	}

	double	d, max = 0;			//текущее и максимальное расстояние
	int		i1, i2;				//индексы прямых, при которых максимальное расстояние

								//начинаем искать

	for(i=0; i<N-1; i++)		//от первой прямой до предпоследней
	{
		for(j=i+1; j<N; j++)	//от следующей до конца
		{
			d = distance(&pLines[i], &pLines[j]);	//получаем расстояние
			if (d > max)
			{
				max = d;							//находим максимальное
				i1 = i;
				i2 = j;
			}
		}
	}

	//выводим максимальное расстояние и точки прямых, максимально удаленных друг от друга
	printf("d = %7.4f\n[%4.1f,%4.1f,%4.1f]:[%4.1f,%4.1f,%4.1f]\n[%4.1f,%4.1f,%4.1f]:[%4.1f,%4.1f,%4.1f]\n", max, 
		pLines[i1].p1.x, pLines[i1].p1.y, pLines[i1].p1.z,
		pLines[i1].p2.x, pLines[i1].p2.y, pLines[i1].p2.z,
		pLines[i2].p1.x, pLines[i2].p1.y, pLines[i2].p1.z,
		pLines[i2].p2.x, pLines[i2].p2.y, pLines[i2].p2.z);

	free(pLines);				//освобождаем память

	return 0;
}


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 11.07.2017, 19:02

5
огромное спасибо)
но можно сделать так что бы пользователь сам вводил данные
тоесть подпрограмму ввода
ну и вывода отдельно

-----
Дата оценки: 12.07.2017, 00:29

Рейтинг ответа:

+1

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 191214

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

= общий = | 12.07.2017, 10:53 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Неужели такую простую операцию не в состоянии самостоятельно сделать?
Печально, если так...
Лично мне была интересна именно математическая составляющая данной задачи.
Ввод-вывод могли бы сделать и самостоятельно... Может, все-таки попробуете?
Покажете - проверим, подправим...

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.07.2017, 11:08

iperesypkina
Посетитель

ID: 401222

# 2

 +1 
 
= общий = | 12.07.2017, 11:13 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Я сама особо в ней трудности не вижу)
Хорошо я сделаю а вы потом посмотрите )

iperesypkina
Посетитель

ID: 401222

# 3

= общий = | 12.07.2017, 11:47 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

смотрите само написание ввода не сложно:
void input_keyboard(LINE*pLines, int n)
{
int i=0;
printf("vvedite koord \n");
while(i<n)
{
scanf("%i %i %i", &(pLines[i].p1.x), &(pLines[i].p1.y), &(pLines[i].p1.z) );
scanf("%i %i %i", &(pLines[i].p2.x), &(pLines[i].p2.y), &(pLines[i].p2.z) );
i++;
}
}

но я всегда путаюсь что передавать и как
особенно со структур
int main()
{
int N; //количество прямых
int i, j;
LINE* pLines = (LINE*)malloc(N*sizeof(LINE)); //память под прямые
printf("vvedite N\n");
scanf("%i",&N);
input_keyboard(LINE, N);

iperesypkina
Посетитель

ID: 401222

# 4

= общий = | 12.07.2017, 11:48 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

ой там ввод N выше надо

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 5

= общий = | 12.07.2017, 11:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

При вводе лучше показать, что вводим, т.е. вывести индекс линии.
Затем сказать, что вводим первую точку, потом вторую.
Чтобы пользователь ориентировался... :)

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 6

= общий = | 12.07.2017, 11:57 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Наверное, надо так?

input_keyboard(pLines, N);

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 7

= общий = | 12.07.2017, 12:01 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Да и формат ввода для вещественных чисел какой должен быть? (что это за "%i"?)

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

iperesypkina
Посетитель

ID: 401222

# 8

= общий = | 12.07.2017, 12:20 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

да я думала и вводить как целые
но я уже исправила
там должно быть %f

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 9

= общий = | 12.07.2017, 12:23 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Покажите окончательный вариант.
Только оформите при помощи тэга code (кнопочка {a})

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

iperesypkina
Посетитель

ID: 401222

# 10

= общий = | 12.07.2017, 12:30 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

void input_keyboard(LINE*pLines, int n)
{
  int i=0;
  printf("введите координаты прямых\n");
  while(i<n)
   {
     printf("введите координаты первой точки:\n");
     scanf("%f %f %f", &(pLines[i].p1.x), &(pLines[i].p1.y), &(pLines[i].p1.z) );
     printf("введите координаты второй точки:\n");
     scanf("%f %f %f", &(pLines[i].p2.x), &(pLines[i].p2.y), &(pLines[i].p2.z) );
     i++;
   }
}


int   main()
{  setlocale(LC_ALL, "Rus");
   int   N;         //количество прямых
   int         i, j;
   printf("vvedite N\n");
   scanf("%i",&N);
   LINE*      pLines = (LINE*)malloc(N*sizeof(LINE));   //память под прямые
   input_keyboard(pLines, N);
  /* srand(time(0));            //инициируем генератор псевдослучайных чисел
   for(i=0; i<N; i++)         //генерируем случайные прямые, велечины берем в интервале [-100.0:99.9]
   {
      pLines[i].p1.x = ((double)(rand()%2000) / 10) - 100;
      pLines[i].p1.y = ((double)(rand()%2000) / 10) - 100;
      pLines[i].p1.z = ((double)(rand()%2000) / 10) - 100;
      pLines[i].p2.x = ((double)(rand()%2000) / 10) - 100;
      pLines[i].p2.y = ((double)(rand()%2000) / 10) - 100;
      pLines[i].p2.z = ((double)(rand()%2000) / 10) - 100;
   }*/
   double   d, max = 0;         //текущее и максимальное расстояние
   int      i1, i2;            //индексы прямых, при которых максимальное расстояние
                        //начинаем искать

iperesypkina
Посетитель

ID: 401222

# 11

= общий = | 12.07.2017, 12:31 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

у меня после ввода почему то идет завершение программы
хотя вроде все правильно:c

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 12

= общий = | 12.07.2017, 13:23 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Причина вот в чем: функция scanf не умеет вводить вещественные числа формата double, только float
Для Вас это, в общем-то, без разницы. Поменяйте по всей программе double на float. И все заработает.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

iperesypkina
Посетитель

ID: 401222

# 13

= общий = | 12.07.2017, 13:45 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

все теперь все работает) и подпрограмма ввода и вывода)

#include   <stdlib.h>
#include   <stdio.h>
#include   <time.h>
#include   <malloc.h>
#include   <math.h>
#include   <locale.h>
#define true false 1 0
//структура, описывающая точку в трехмерном пространстве
typedef struct _point
{
   float   x;
   float   y;
   float   z;
}POINT;
//структура, описывающая линию, заданную двумя точками
typedef struct _line
{
   POINT   p1;
   POINT   p2;
} LINE;
float   e = 0.00001;
//нахождение смешанного произведения векторов
float mixesPrud(POINT *v1, POINT *v2, POINT *v3)
{
   return (v1->x*(v2->y*v3->z - v2->z*v3->y) - v1->y*(v2->x*v3->z - v2->z*v3->x) + v1->z*(v2->x*v3->y - v2->y*v3->x));
}
//проверка коллениарности векторов
//вещественное число сравниваем не c 0, а на меньше числа e=0.00001
int isCollinear(POINT *v1, POINT *v2)
{
   return (((v1->x/v2->x - v1->y/v2->y) < e) && ((v1->x/v2->x - v1->z/v2->z) < e));
}
//проверка прямых на совпадение
//подставляем значение одной координаты одной прямой в уравнение втророй и сравниваем с остальными
//если совпадает, то прямые совпадают
//учитываем, что прямые могут быть перпендикулярны осям координат
//вещественное число сравниваем не c 0, а на меньше числа e=0.00001
int isEqualLines(LINE *pline1, LINE *pline2)
{
   float x, y, z;
   if (pline2->p2.x - pline2->p1.x > e)      //прямая не перпендикулярна оси Х
   {
      y = pline2->p1.y + (pline1->p1.x - pline2->p1.x) * (pline2->p2.y - pline2->p1.y) / (pline2->p2.x - pline2->p1.x);
      z = pline2->p1.z + (pline1->p1.x - pline2->p1.x) * (pline2->p2.z - pline2->p1.z) / (pline2->p2.x - pline2->p1.x);
      return (((y - pline1->p1.y) < e) && ((z - pline1->p1.z) < e));
   }
   else if (pline2->p2.y - pline2->p1.y > e)   //прямая не перпендикулярна оси Y
   {
      x = pline2->p1.x + (pline1->p1.y - pline2->p1.y) * (pline2->p2.x - pline2->p1.x) / (pline2->p2.y - pline2->p1.y);
      z = pline2->p1.z + (pline1->p1.y - pline2->p1.y) * (pline2->p2.z - pline2->p1.z) / (pline2->p2.y - pline2->p1.y);
      return (((x - pline1->p1.x) < e) && ((z - pline1->p1.z) < e));
   }
   else  if (pline2->p2.z - pline2->p1.z > e) //прямая не перпендикулярна оси Z
   {
      x = pline2->p1.x + (pline1->p1.z - pline2->p1.z) * (pline2->p2.x - pline2->p1.x) / (pline2->p2.z - pline2->p1.z);
      y = pline2->p1.y + (pline1->p1.z - pline2->p1.z) * (pline2->p2.y - pline2->p1.y) / (pline2->p2.z - pline2->p1.z);
      return (((x - pline1->p1.x) < e) && ((y - pline1->p1.y) < e));
   }
   else
      return 0;                     //прямая фактически задана одной точкой
                                    // при желании можно отфильтровать при задании прямых
}
//нахождение расстояния между прямыми
float distance(LINE *pline1, LINE *pline2)
{
   POINT   v, s, n1, n2;
   float   mp;
   //сначала найдем направляющие вектора n1 и n2 прямых pline1 и pline2
   n1.x = pline1->p2.x - pline1->p1.x;
   n1.y = pline1->p2.y - pline1->p1.y;
   n1.z = pline1->p2.z - pline1->p1.z;
   n2.x = pline2->p2.x - pline2->p1.x;
   n2.y = pline2->p2.y - pline2->p1.y;
   n2.z = pline2->p2.z - pline2->p1.z;
   //Найдем вектор, соединяющий точку pline1->p1 с точкой pline2->p1
   v.x = pline1->p2.x - pline2->p1.x;
   v.y = pline1->p2.y - pline2->p1.y;
   v.z = pline1->p2.z - pline2->p1.z;
   //прямые скрещиваются, если векторы n1, n2 и v не компланарны
   //найдем модуль смешанного произведения и сравним на 0
   mp = fabs(mixesPrud(&n1, &n2, &v));
   if (mp < e)
   {                                 //компланарны, т.е. в одной плоскости
      if (isCollinear(&n1, &n2))            //коллинеарны? (параллельны?)
      {                              //да - значит, прямые не пересекаются
         if (isEqualLines(pline1, pline2))   //прямые совпадают?
            return 0.;                  //да, растояние = 0
         else
         {                           //прямые параллельны
            //найдем векторное произведение вектора v,
            // и направляющего вектора, например, прямой pline2
            s.x = v.y * n2.z - v.z * n2.y;
            s.y = - v.x * n2.z + v.z * n2.x;
            s.z = v.x * n2.y - v.y * n2.x;

            //получим расстояние, как отношение длины вектора s к длине n2
            return (sqrt(s.x*s.x + s.y*s.y+ s.z*s.z) / sqrt(n2.x*n2.x + n2.y*n2.y+ n2.z*n2.z));
         }
      }
      else
         return 0.;                     //прямые пересекаются, расстояние = 0
   }
   else
   {                                 //некомпланарны - прямые скрещиваются
      //найдем векторное произведение направляющих векторов
      s.x = n1.y * n2.z - n1.z * n2.y;
      s.y = - n1.x * n2.z + n1.z * n2.x;
      s.z = n1.x * n2.y - n1.y * n2.x;

      //получим расстояние, как отношение модуля смешанного произведения
      //  и длины векторного произведения направляющих векторов
      return (mp / sqrt(s.x*s.x + s.y*s.y + s.z*s.z));
   }
}


void input_keyboard(LINE*pLines, int n)
{
  int i;
  printf("введите координаты прямых\n");
  for(i=0; i<n; i++)
   {
     printf("введите координаты первой точки:\n");
     scanf("%f %f %f", &(pLines[i].p1.x), &(pLines[i].p1.y), &(pLines[i].p1.z) );
     printf("введите координаты второй точки:\n");
     scanf("%f %f %f", &(pLines[i].p2.x), &(pLines[i].p2.y), &(pLines[i].p2.z) );
   }
}

void output_data(LINE*pLines,float max, int i1, int i2)
{
    int i;
    printf("максимальное расстояние:\n");
    printf("d = %7.4f\n",max);
    printf("координаты пары прямых:\n");
    printf("[%4.1f,%4.1f,%4.1f]:[%4.1f,%4.1f,%4.1f]\n[%4.1f,%4.1f,%4.1f]:[%4.1f,%4.1f,%4.1f]\n",
      pLines[i1].p1.x, pLines[i1].p1.y, pLines[i1].p1.z,
      pLines[i1].p2.x, pLines[i1].p2.y, pLines[i1].p2.z,
      pLines[i2].p1.x, pLines[i2].p1.y, pLines[i2].p1.z,
      pLines[i2].p2.x, pLines[i2].p2.y, pLines[i2].p2.z);
}


int   main()
{  setlocale(LC_ALL, "Rus");
   int   N;         //количество прямых
   int         i, j;
   printf("vvedite N\n");
   scanf("%i",&N);
   LINE*      pLines = (LINE*)malloc(N*sizeof(LINE));   //память под прямые
   input_keyboard(pLines, N);
   float   d, max = 0;         //текущее и максимальное расстояние
   int      i1, i2;            //индексы прямых, при которых максимальное расстояние
                        //начинаем искать
   for(i=0; i<N-1; i++)      //от первой прямой до предпоследней
   {
      for(j=i+1; j<N; j++)   //от следующей до конца
      {
         d = distance(&pLines[i], &pLines[j]);   //получаем расстояние
         if (d > max)
         {
            max = d;                     //находим максимальное
            i1 = i;
            i2 = j;
         }
      }
   }
   //выводим максимальное растояние и точки прямых, максимально удаленных друг от друга
      output_data(pLines,max,i1,i2);
   free(pLines);            //освобождаем память
   return 0;
}

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 14.07.2017, 15:39

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 14

= общий = | 12.07.2017, 13:54 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Ну и славно! smile Общими усилиями решили задачу!

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 15

= общий = | 12.07.2017, 13:57 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Я немного подправил, задал высоту окна кода 200 (параметр h=200 в code) (или сразу кнопочкой {aa})

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.07.2017, 14:02

iperesypkina
Посетитель

ID: 401222

# 16

= общий = | 12.07.2017, 14:05 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Благодарю за помощь )

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 17

= общий = | 14.07.2017, 15:41 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
iperesypkina:

Сегодня просматривал код и обнаружил небольшую ошибочку.
При вычислении векторного произведения при параллельном соединении необходимо поменять знак у s.y
(по правилу вычисления определителя)

           s.x = v.y * n2.z - v.z * n2.y;
            s.y = - v.x * n2.z + v.z * n2.x;
            s.z = v.x * n2.y - v.y * n2.x;

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.16566 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн