Сайт о программировании, математике и моделировании
Задача про два отрезка на прямой и их общие точки
Постановка задачи:
Два отрезка на прямой заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки, и если имеют, то длину общей части. Замечание. Необходимо рассмотреть различные случаи взаимной ориентации отрезков. Тестирование должно предусмотреть все такие ситуации.
Решение:
Пусть А и В – два отрезка, с координатами своих концов [а1, а2] и [b1, b2] соответственно. a1, b1 –левые координаты, a2, b2 – правые координаты отрезков А и В.
Возможные случаи взаимной ориентации отрезков:
- отрезки не имеют общих точек.
- отрезки частично совпадают.
- отрезки могут лежать внутри друг друга.
- Могут иметь одну общую точку, в этом случае длина общей части будет равна нулю.
- отрезки совпадают.
Алгоритм построен на сравнении координат концов заданных отрезков:
- В случае если ни одна из координат одного отрезка не лежит между концевыми координатами другого, то эти отрезки не имеют общих точек;
- В случае если одна из координат одного отрезка лежит между концевыми координатами второго, то эти отрезки имеют общую часть;
- В случае если обе концевые координаты одного отрезка лежат между концевыми координатами второго отрезка, то один отрезок лежит внутри другого;
- Если одна из концевых координат одного отрезка совпадает с начальной координатой второго, то отрезки имеют одну общую точку.
- Если левые и правые концевые координаты одного отрезка совпадают соответственно с координатами другого отрезка, то эти отрезки совпадают.
Ограничения:
Прямая ограничена интервалом от -10 до 10, в случае если задаваемые координаты выходят за пределы заданного интервала выводится приглашение ввести их повторно. Так как правые координаты не могут быть расположены левее левых, то при их вводе b2<=b1, a2<=a1 приглашение ввести их повторно.
Код программы
#include <iostream.h>
#include <conio.h>
void main()
{
const int NMIN=-10; // минимальная граница ввода
const int NMAX=10; // максимальная граница ввода
double a1,a2,b1, b2, dlina;
m1:cout << «Input level coordinate otrezka a: «<<NMIN<<»<=a1<=»<<NMAX<< «\n\r»;
cin >>a1;
if ((a1<NMIN)||(a1>NMAX)) goto m1; //Контроль ввода a1
m2:cout << «Input right coordinate otrezka a: » <<a1<<»<a2<=»<<NMAX<< «\n\r»;
cin >>a2;
if ((a2<=a1)||(a1>NMAX)) goto m2; //Контроль ввода a2
m3: cout << «Input level coordinate otrezka b: «<<NMIN<<»<=b1<=»<<NMAX<<»\n\r»;
cin >>b1;
if ((b1<NMIN)||(b1>NMAX)) goto m3; //Контроль ввода b1
m4:cout << «Input right coordinate otrezka b: » <<b1<<»<b2<=»<<NMAX<< «\n\r»;
cin >>b2;
if ((b2<=b1)||(b1>NMAX)) goto m4; //Контроль вводa b2
// проверка пересечения отрезков
if (((a1<=b1)&&(b1<=a2))||((a1<=b2)&&(b2<=a2))||
((a1<=b1)&&(a1<=b2)&&(b1<=a2)&&(b2<=a2))||
((b1<=a1)&&(b1<=a2)&&(a1<=b2)&&(a2<=b2)))
{
if ((b1>=a1)&&(b2>a1)&&(b1<a2)&&(b2<=a2)) dlina=b2-b1; //отрезок B лежит внутри A
else if ((b1<=a1)&&(b1<=a2)&&(a1<=b2)&&(a2<=b2)) dlina=a2-a1; //отрезок A лежит внутри B
else if ((a1<=b1)&&(b1<=a2)) dlina=a2-b1; // a1<=b1<=a2
else if ((b2>=a1)&&(b2<=a2)) dlina=b2-a1; // a1<=b2<=a2
cout << «\n\rotrezki are crossed\n\r»;
cout << «\n\rLENGTH of COMMON PART :»<<dlina;
}
else
cout << «\n\rotrezki are not crossed\n\r»;
getch();
}
Print article | This entry was posted by root on 17.02.2013 at 6:49 пп, and is filed under Задачи и решения. Follow any responses to this post through RSS 2.0. Вы можете оставить комментарий или трэкбэк с вашего сайта. |
10 месяцев назад
молодцы, что создали такой хороший сайт с такими интересными материалами.