Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Математика


Ответ
 
Опции темы Опции просмотра
Старый 28.06.2016, 13:01   #1 (permalink)
romacool2
Новичок
 
Регистрация: 28.06.2016
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Составить программы анализа данных

Программы должны решать следующие задачи:
1.1 Два объекта движутся с постоянными скоростями в горизонтальной плоскости по пересекающимся прямым. Известны их координаты в моменты времени t0 и t1.
а) Определить, пересекутся ли траектории объектов и, если да, то точку пересечения траекторий;
б) Найти время прохождения точки пересечения каждым из объектов и скорость каждого из них;
в) Будем считать, что объекты должны столкнуться, если
 возможное кратчайшее расстояние между ними меньше суммарной длины объектов И
 это расстояние будет достигнуто в момент времени, превышающий t1.
Определить, возможно ли столкновение.
Входные данные: числа с плавающей запятой t0, t1 моменты времени
(t0<t1 - проверьте ) , x1, y1, x2, y2 – начальное и конечное положение первого объекта, u1,z1, u2, z2 – начальное и конечное положение второго объекта, L1, L2 — размеры объектов.
Выходные данные:
 Если траектории движения параллельны, то вывести строку «Траектории не пересекаются».
 Если траектории движения объектов не параллельны, то вывести числа с плавающей запятой
x, y — координаты точки пересечения; t3,t4 — время прохождения через точку пересечения первым и вторым объектом соответственно; v1, v2 – скорости объектов;
 строку «Ожидается столкновение» или «Столкновение не произойдет» в зависимости от решения пункта в).
Предусмотрите проверку корректности данных, вводимых пользователем.

почему то не могу представить как решить данную задачу( помогите мне разобраться с ней.
ПС\ спасибо
romacool2 вне форума   Ответить с цитированием

Старый 28.06.2016, 13:01
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

На форуме часто создаются аналогичные темы

Помогите составить программы с матрицами
Составить алгоритм и написать код программы
Помогите составить программы на C++
Помогите, пожалуйста, составить программы

Старый 28.06.2016, 16:32   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Эх, знать бы, на каком языке программирования следует решать задачу! Но что поделаешь - тайна есть тайна...
Vladimir_S вне форума   Ответить с цитированием
Старый 28.06.2016, 17:41   #3 (permalink)
romacool2
Новичок
 
Регистрация: 28.06.2016
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Эх, знать бы, на каком языке программирования следует решать задачу! Но что поделаешь - тайна есть тайна...
Простите забыл указать, на Си, думаю написать программу я смогу вот решить её затрудняюсь.
romacool2 вне форума   Ответить с цитированием
Старый 28.06.2016, 19:09   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от romacool2 Посмотреть сообщение
Простите забыл указать, на Си, думаю написать программу я смогу вот решить её затрудняюсь.
А в чем, собственно, проблемы? Берете любой учебник по аналитической геометрии, либо соответствующий раздел математического справочника и - вперед и с песней! Там написано, как выглядит уравнение прямой, проходящей через две точки с известными координатами, как выглядит условие параллельности прямых, заданных аналитически, как найти точку пересечения прямых и т.п. Ничего сложного.
Vladimir_S вне форума   Ответить с цитированием
Старый 29.06.2016, 11:08   #5 (permalink)
romacool2
Новичок
 
Регистрация: 28.06.2016
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Код:
/*пересечения двух прямых*/
#include<stdio.h>
#include<math.h>
main(){
  int x1, y1; 		//точка А (начало)
  int x2, y2; 		//точка В (конец)
    printf("Введите точку A(x1, y1) ");
      scanf("%d%d", &x1, &y1);
    printf("Введите точку B(x2, y2) ");
      scanf("%d%d", &x2, &y2);   
  int A1 = y2-y1;
  int B1 = x1-x2;
    int object_1 = -A1*x1-B1*y1;
  
  int u1,z1; 		//точка C (начало)
  int u2,z2; 		//точка D (конец)
    printf("Введите точку C(u1, z1) ");
      scanf("%d%d", &u1, &z1);  
    printf("Введите точку D(u2, z2) ");
      scanf("%d%d", &u2, &z2);
  int C1 = z2-z1;
  int D1 = u1-u2;
    int object_2 = -C1*u1-D1*z1;
  
    int f1 = A1 * u1 +B1 * z1 + object_1;
    int f2 = A1 * u2 +B1 * z2 + object_1;
    int f3 = C1 * x1 +D1 * y1 + object_2;
    int f4 = C1 * x2 +D1 * y2 + object_2;
  
  int x = -((x1*y2-x2*y1)*(u2-u1)-(u1*z2-u2*z1)*(x2-x1))/((y1-y2)*(u2-u1)-(z1-z2)*(x2-x1));
  int y = ((z1-z2)*x-(u1*z2-u2*z1))/(u2-u1);
  
//строгое пересечение  
  if(f1*f2<0&&f3*f4<0){
    printf("YES\n");
    printf("x:%d, y:%d\n",x,y);
  }
    else
      printf("NO\n");  
}
под а я вроде бы сделал, но надо будет ещ доработать а вот под б
б) Найти время прохождения точки пересечения каждым из объектов и скорость каждого из них;
не совсем понимаю как сделать, если бы объяснили или алгоритм решения подсказали было бы чюдно
romacool2 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 29.06.2016, 12:44   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от romacool2 Посмотреть сообщение
б) Найти время прохождения точки пересечения каждым из объектов и скорость каждого из них; не совсем понимаю как сделать, если бы объяснили или алгоритм решения подсказали было бы чюдно
Попробую.
Тут, вероятно, целесообразно ввести X и Y-компоненты вектора скорости для каждого из объектов. Например, так.
Пусть заданные координаты точек объектов a и b есть X1a, Y1a, X2a, Y2a, X1b, Y1b, X2b, Y2b. Тогда компоненты скорости объектов задаем так:
VaX = (X2a-X1a)/(t1-t0)
VaY = (Y2a-Y1a)/(t1-t0)
VbX = (X2b-X1b)/(t1-t0)
VaX = (Y2b-Y1b)/(t1-t0)
Абсолютные скорости объектов Va и Vb найдём по формулам
(Va)² = (VaX)² + (VaY)²
(Vb)² = (VbX)² + (VbY)²
Координаты Xa(t), Ya(t), Xb(t), Yb(t) объектов в любой момент времени можно сосчитать, как
Xa(t) = X1a + VaX*t
Ya(t) = Y1a + VaY*t
Xb(t) = X1b + VbX*t
Yb(t) = Y1b + VbY*t
Координаты точки пересечения траекторий X0 и Y0 мы уже вычислили. Времена ta и tb прохождения точки пересечения каждым из объектов находим, как
ta = t0 + (X0 - X1a)/VaX
tb = t0 + (X0 - X1b)/VbX
Теперь ищем минимальное расстояние.
Пусть D(t) - расстояние между объектами в любой момент времени t. Его можно найти из формулы
D(t) = √[(Xa(t) - Xb(t))² + (Ya(t) - Yb(t))²]
И теперь нужно найти сосчитать производную dD/dt, приравнять её к 0, определить время, соответствующее наибольшему сближению (обозначим, например, tt), найти D(tt) и сравнить с суммой длин объектов. Справитесь?
Vladimir_S вне форума   Ответить с цитированием
Старый 29.06.2016, 12:53   #7 (permalink)
Profundo
Погулять вышел :)
 
Аватар для Profundo
 
Регистрация: 01.04.2016
Сообщений: 486
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2217
По умолчанию

Цитата:
Сообщение от romacool2 Посмотреть сообщение
Простите забыл указать, на Си
Точно на Си? Под эту задачку Пролог лучше подошёл бы. Вы с этим языком знакомы?
Profundo вне форума   Ответить с цитированием
Старый 29.06.2016, 15:25   #8 (permalink)
romacool2
Новичок
 
Регистрация: 28.06.2016
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Код:
/*пересечения двух прямых*/
#include<stdio.h>
#include<math.h>
main(){
  float t0,t1; 		//время
    printf("Введите время t0 и t1 (t0<t1): ");
      scanf("%f%f", &t0, &t1);
	if(t0>t1){
	  printf("ERROR: t0>t1\n");
  return 0;
	}
  int x1,y1; 		//точка А (начало)
  int x2,y2; 		//точка В (конец)
    printf("Введите точку A(x1, y1) ");
      scanf("%d%d", &x1, &y1);
    printf("Введите точку B(x2, y2) ");
      scanf("%d%d", &x2, &y2);   
  int A1 = y2-y1;
  int B1 = x1-x2;
    int object_1 = -A1*x1-B1*y1;
  
  int u1,z1; 		//точка C (начало)
  int u2,z2; 		//точка D (конец)
    printf("Введите точку C(u1, z1) ");
      scanf("%d%d", &u1, &z1);  
    printf("Введите точку D(u2, z2) ");
      scanf("%d%d", &u2, &z2);
  int C1 = z2-z1;
  int D1 = u1-u2;
    int object_2 = -C1*u1-D1*z1;
//длина отрезков
  float dl1 = fabs((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
  float dl2 = fabs((z2-z1)*(z2-z1)+(u2-u1)*(u2-u1));
//для if
    int f1 = A1 * u1 +B1 * z1 + object_1;
    int f2 = A1 * u2 +B1 * z2 + object_1;
    int f3 = C1 * x1 +D1 * y1 + object_2;
    int f4 = C1 * x2 +D1 * y2 + object_2;
//находим x, y (точка пересечения 2х прямых)  
  int x = (-(x1*y2-x2*y1)*(u2-u1)-(u1*z2-u2*z1)*(x2-x1))/((y1-y2)*(u2-u1)-(z1-z2)*(x2-x1));
  int y = ((z1-z2)*x-(u1*z2-u2*z1))/(u2-u1); 
//строгое пересечение  
  if(f1*f2<0&&f3*f4<0){
    printf("YES\n");
    printf("x:%d, y:%d\n",x,y);
  }
    else
      printf("NO\n"); 
//t0-t1 = время
  float T = t1-t0;
//Скорость обьектов: скорость = расстояние / время
  float S_object_1 = dl1/T;
  float S_object_2 = dl2/T;
//время = расстояние / скорость
  float time1 = dl1/S_object_1;
  float time2 = dl2/S_object_2;
  
printf("A1: %d\t\tB1: %d\t\t object_1: %d\n",A1,B1,object_1);
printf("C1: %d\t\tD1: %d\t\t object_2: %d\n",C1,D1,object_2);
printf("Длина 1го отрезка: %0.1f\nДлина 2го отрезка: %0.1f\n",dl1,dl2);
printf("Скорость 1го объекта: %0.1f\nСкорость 2го объекта: %0.1f\n",S_object_1,S_object_2);
printf("Время 1го обьекта: %0.1f\nВремя 2го обьекта: %0.1f\n",time1,time2);
printf("[ f1: %d | f2: %d | f3: %d | f4: %d ]\n",f1,f2,f3,f4);
}
Вот пои попытки, можете посмотреть код
Задание написать на Си) с Пролог не знаком(
romacool2 вне форума   Ответить с цитированием
Старый 29.06.2016, 22:19   #9 (permalink)
Andree
Member
 
Регистрация: 09.01.2016
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от romacool2 Посмотреть сообщение
1.1 Два объекта движутся с постоянными скоростями в горизонтальной плоскости по пересекающимся прямым.
Цитата:
Сообщение от romacool2 Посмотреть сообщение
а) Определить, пересекутся ли траектории объектов
Толи лыжи не едут...

Либо условия, либо задача поставлены не корректно.
Andree вне форума   Ответить с цитированием
Старый 30.06.2016, 18:12   #10 (permalink)
romacool2
Новичок
 
Регистрация: 28.06.2016
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Код:
/*пересечения двух прямых*/
#include<stdio.h>
#include<math.h>
main(){
  float t0,t1; 		//время
    printf("Введите время t0 и t1 (t0<t1): ");
      scanf("%f%f", &t0, &t1);
	if(t0>t1){
	  printf("ERROR: t0>t1\n");
  return 0;
	}
//t0-t1 = время
  float T = t1-t0;
//Отрезок АВ
  int x1,y1; 		//точка А (начало)
  int x2,y2; 		//точка В (конец)
    printf("Введите точку A(x1, y1) ");
      scanf("%d%d", &x1, &y1);
    printf("Введите точку B(x2, y2) ");
      scanf("%d%d", &x2, &y2);   
  int A1 = y2-y1;
  int B1 = x1-x2;
    int object_1 = -A1*x1-B1*y1;
//Отрезок CD  
  int u1,z1; 		//точка C (начало)
  int u2,z2; 		//точка D (конец)
    printf("Введите точку C(u1, z1) ");
      scanf("%d%d", &u1, &z1);  
    printf("Введите точку D(u2, z2) ");
      scanf("%d%d", &u2, &z2);
  int C1 = z2-z1;
  int D1 = u1-u2;
    int object_2 = -C1*u1-D1*z1;
//Размеры объектов
float r1; 	//Радиус 1й
float r2; 	//Радиус 2й
    printf("Введите Радиус 1й окружности r1: ");
      scanf("%f", &r1);  
    printf("Введите Радиус 2й окружности r1: ");
      scanf("%f", &r2);
  float L1; 	//Размер 1го объекта
  float L2; 	//Размер 2го объекта
    float const PI = 3.14;
  L1 = 2*PI*r1; 	//Длина 1й окружности
  L2 = 2*PI*r2; 	//Длина 2й окружности
  
//для if
    int f1 = A1 * u1 +B1 * z1 + object_1;
    int f2 = A1 * u2 +B1 * z2 + object_1;
    int f3 = C1 * x1 +D1 * y1 + object_2;
    int f4 = C1 * x2 +D1 * y2 + object_2;
//находим x, y (точка пересечения 2х прямых)  
  float x = (-(x1*y2-x2*y1)*(u2-u1)-(u1*z2-u2*z1)*(x2-x1))/((y1-y2)*(u2-u1)-(z1-z2)*(x2-x1));
  float y = ((z1-z2)*x-(u1*z2-u2*z1))/(u2-u1); 
//строгое пересечение  
  if(f1*f2<0&&f3*f4<0){
    printf("Прямые пересекаются в точке: ");
    printf("x:%0.0f, y:%0.0f\n",x,y);
  }
    else
      printf("Траектории не пересекаются\n");
//длина отрезков dl1: AB, dl2: CD
  float dl1 = sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
  float dl2 = sqrt((z2-z1)*(z2-z1)+(u2-u1)*(u2-u1));
//Скорость обьектов: скорость = расстояние / время
  float S_object_1 = dl1/T;
  float S_object_2 = dl2/T;
//длина отрезков dl3: AP, dl4: CP
  float dl3 = sqrt((y-y1)*(y-y1)+(x-x1)*(x-x1));
  float dl4 = sqrt((y-z1)*(y-z1)+(x-u1)*(x-u1));
//время = расстояние / скорость
  float time1 = dl3/S_object_1;
  float time2 = dl4/S_object_2;
  
printf("A1: %d\t\tB1: %d\t\t object_1: %d\n",A1,B1,object_1);
printf("C1: %d\t\tD1: %d\t\t object_2: %d\n",C1,D1,object_2);
printf("Длина 1го отрезка [A,B]: %0.1f\nДлина 2го отрезка [C,D]: %0.1f\n",dl1,dl2);
printf("Длина 3го отрезка [A,P]: %0.1f\nДлина 4го отрезка [C,P]: %0.1f\n",dl3,dl4);
printf("Скорость 1го объекта: %0.1f\nСкорость 2го объекта: %0.1f\n",S_object_1,S_object_2);
printf("Время 1го обьекта: %0.1f\nВремя 2го обьекта: %0.1f\n",time1,time2);
printf("Длина 1й окружности: %0.2f\nДлина 2й окружности: %0.2f\n",L1,L2);
printf("[ f1: %d | f2: %d | f3: %d | f4: %d ]\n",f1,f2,f3,f4);
}
Код:
Введите время t0 и t1 (t0<t1): 3 8
Введите точку A(x1, y1) 3 7
Введите точку B(x2, y2) 3 -10
Введите точку C(u1, z1) -3-3 
Введите точку D(u2, z2) 8 -3
Введите Радиус 1й окружности r1: 3 
Введите Радиус 2й окружности r1: 5
Прямые пересекаются в точке: x:3, y:-3
A1: -17 B1: 0 object_1: 51
C1: 0 D1: -11 object_2: -33
Длина 1го отрезка [A,B]: 17.0
Длина 2го отрезка [C,D]: 11.0
Длина 3го отрезка [A,P]: 10.0
Длина 4го отрезка [C,P]: 6.0
Скорость 1го объекта: 3.4
Скорость 2го объекта: 2.2
Время 1го обьекта: 2.9
Время 2го обьекта: 2.7
Длина 1й окружности: 18.84
Длина 2й окружности: 31.40
[ f1: 102 | f2: -85 | f3: -110 | f4: 77 ]
вроде А и Б сделал но не могу понять как привязать длину круга которую я нашел чтоб выяснить столкнуться ли объекты или нет .

в) Будем считать, что объекты должны столкнуться, если
- возможное кратчайшее расстояние между ними меньше суммарной длины объектов И
- это расстояние будет достигнуто в момент времени, превышающий t1.
Миниатюры
w-hvmq4dlww.jpg  
romacool2 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 05:23.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.