28.06.2016, 13:01 | #1 (permalink) |
Новичок
Регистрация: 28.06.2016
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Составить программы анализа данных
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 – скорости объектов; строку «Ожидается столкновение» или «Столкновение не произойдет» в зависимости от решения пункта в). Предусмотрите проверку корректности данных, вводимых пользователем. почему то не могу представить как решить данную задачу( помогите мне разобраться с ней. ПС\ спасибо |
28.06.2016, 13:01 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
На форуме часто создаются аналогичные темы Помогите составить программы с матрицами Составить алгоритм и написать код программы Помогите составить программы на C++ Помогите, пожалуйста, составить программы |
28.06.2016, 19:09 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
А в чем, собственно, проблемы? Берете любой учебник по аналитической геометрии, либо соответствующий раздел математического справочника и - вперед и с песней! Там написано, как выглядит уравнение прямой, проходящей через две точки с известными координатами, как выглядит условие параллельности прямых, заданных аналитически, как найти точку пересечения прямых и т.п. Ничего сложного.
|
29.06.2016, 11:08 | #5 (permalink) |
Новичок
Регистрация: 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"); } б) Найти время прохождения точки пересечения каждым из объектов и скорость каждого из них; не совсем понимаю как сделать, если бы объяснили или алгоритм решения подсказали было бы чюдно |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
29.06.2016, 12:44 | #6 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Тут, вероятно, целесообразно ввести 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) и сравнить с суммой длин объектов. Справитесь? |
|
29.06.2016, 15:25 | #8 (permalink) |
Новичок
Регистрация: 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); } Задание написать на Си) с Пролог не знаком( |
30.06.2016, 18:12 | #10 (permalink) |
Новичок
Регистрация: 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|