#include <iostream>
#include <cmath>
#include <algorithm>//библиотека, содержащая функции min и max
using namespace std;
double perpendicularx( double x1,double y1, double x2, double y2, double x3, double y3) //функция, которая высчитывает значение абциссы проекции точки на прямую, содержащую отрезок
{
double x;
x= ( - x1* ( y2- y1) * ( y2- y1) + x3* ( x2- x1) * ( x2- x1) - y1* y2+ y1* y1) / ( ( x2- x1) * ( x2- x1) - ( y2- y1) * ( y2- y1) ) ;
return x;
}
double perpendiculary( double x1,double y1, double x2, double y2, double x3, double y3, double x) //функция, которая высчитывает значение абциссы проекции точки на прямую, содержащую отрезок
{
double y;
y= ( x- x1) * ( y2- y1) / ( x2- x1) + y1;
return y;
}
int main( ) {
double x, y, x1, x2, x3, x4, y1, y2, y3, y4, temp;
cin >> x1>> y1>> x2>> y2>> x3>> y3>> x4>> y4;
double mini= sqrt ( ( x3- x1) * ( x3- x1) + ( y3- y1) * ( y3- y1) ) ; //предположим, что минимальное значение, это расстояние от конца одного отрезка до конца другого
temp= sqrt ( ( x3- x2) * ( x3- x2) + ( y3- y2) * ( y3- y2) ) ; //для каждой пары концов разных отрезков высчитываем расстояние между ними
if ( temp< mini) //если оно меньше минимума
mini= temp; //то меняем минимум
temp= sqrt ( ( x4- x1) * ( x4- x1) + ( y4- y1) * ( y4- y1) ) ; //повторяем для каждой пары концов разных отрезков
if ( temp< mini)
mini= temp;
temp= sqrt ( ( x4- x2) * ( x4- x2) + ( y4- y2) * ( y4- y2) ) ;
if ( temp< mini)
mini= temp;
x= perpendicularx( x1, y1, x2, y2, x3, y3) ; //получаем абциссу проекции конца одного отрезка на другой
y= perpendiculary( x1, y1, x2, y2, x3, y3, x) ; //ординату
if ( ( x2- x1) * ( x2- x1) - ( y2- y1) * ( y2- y1) == 0 ) //в случае, если равно нулю, абцисса будет равна бесконечности, а это возможно в том случае, если конец отрезка совпадает с его проекцией на другой отрезок
{
x= x3; // для корректных вычислений приравниваем абциссы и ординаты точки с её проекцией
y= y3;
}
if ( x>= min( x1,x2) && x<= max( x1,x2) && y>= min( y1,y2) && y<= max( y1,y2) ) //если проекция лежит на отрезке заданном
{
temp= sqrt ( ( x3- x) * ( x3- x) + ( y3- y) * ( y3- y) ) ; //то проверяем, будет ли расстояние от конца отрезка до её проекции меньше, чем текущий минимум
if ( temp< mini)
mini= temp; //если да, то меняем значение минимума
}
x= perpendicularx( x1, y1, x2, y2, x4, y4) ; // далее повторяемя для трех других концов отрезков
y= perpendiculary( x1, y1, x2, y2, x4, y4, x) ;
if ( ( x2- x1) * ( x2- x1) - ( y2- y1) * ( y2- y1) == 0 )
{
x= x4;
y= y4;
}
if ( x>= min( x1,x2) && x<= max( x1,x2) && y>= min( y1,y2) && y<= max( y1,y2) )
{
temp= sqrt ( ( x4- x) * ( x4- x) + ( y4- y) * ( y4- y) ) ;
if ( temp< mini)
mini= temp;
}
x= perpendicularx( x3, y3, x4, y4, x1, y1) ;
y= perpendiculary( x3, y3, x4, y4, x1, y1, x) ;
if ( ( x4- x3) * ( x4- x3) - ( y4- y3) * ( y4- y3) == 0 )
{
x= x1;
y= y1;
}
if ( x>= min( x3,x4) && x<= max( x3,x4) && y>= min( y3,y4) && y<= max( y3,y4) )
{
temp= sqrt ( ( x1- x) * ( x1- x) + ( y1- y) * ( y1- y) ) ;
if ( temp< mini)
mini= temp;
}
x= perpendicularx( x3, y3, x4, y4, x2, y2) ;
y= perpendiculary( x3, y3, x4, y4, x2, y2, x) ;
if ( ( x4- x3) * ( x4- x3) - ( y4- y3) * ( y4- y3) == 0 )
{
x= x2;
y= y2;
}
if ( x>= min( x3,x4) && x<= max( x3,x4) && y>= min( y3,y4) && y<= max( y3,y4) )
{
temp= sqrt ( ( x2- x) * ( x2- x) + ( y2- y) * ( y2- y) ) ;
if ( temp< mini)
mini= temp;
}
cout << mini<< endl; // выводим минимальное расстояние и переходим на новую строку
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhbGdvcml0aG0+Ly/QsdC40LHQu9C40L7RgtC10LrQsCwg0YHQvtC00LXRgNC20LDRidCw0Y8g0YTRg9C90LrRhtC40LggbWluINC4IG1heAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpkb3VibGUgcGVycGVuZGljdWxhcngoZG91YmxlIHgxLGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzKSAvL9GE0YPQvdC60YbQuNGPLCDQutC+0YLQvtGA0LDRjyDQstGL0YHRh9C40YLRi9Cy0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0LDQsdGG0LjRgdGB0Ysg0L/RgNC+0LXQutGG0LjQuCDRgtC+0YfQutC4INC90LAg0L/RgNGP0LzRg9GOLCDRgdC+0LTQtdGA0LbQsNGJ0YPRjiDQvtGC0YDQtdC30L7Qugp7Cglkb3VibGUgeDsKCXg9KC14MSooeTIteTEpKih5Mi15MSkreDMqKHgyLXgxKSooeDIteDEpLXkxKnkyK3kxKnkxKS8oKHgyLXgxKSooeDIteDEpLSh5Mi15MSkqKHkyLXkxKSk7CglyZXR1cm4geDsKfQpkb3VibGUgcGVycGVuZGljdWxhcnkoZG91YmxlIHgxLGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzLCBkb3VibGUgeCkvL9GE0YPQvdC60YbQuNGPLCDQutC+0YLQvtGA0LDRjyDQstGL0YHRh9C40YLRi9Cy0LDQtdGCINC30L3QsNGH0LXQvdC40LUg0LDQsdGG0LjRgdGB0Ysg0L/RgNC+0LXQutGG0LjQuCDRgtC+0YfQutC4INC90LAg0L/RgNGP0LzRg9GOLCDRgdC+0LTQtdGA0LbQsNGJ0YPRjiDQvtGC0YDQtdC30L7Qugp7Cglkb3VibGUgeTsKCXk9KHgteDEpKih5Mi15MSkvKHgyLXgxKSt5MTsKCXJldHVybiB5Owp9CmludCBtYWluKCkgewoJZG91YmxlIHgsIHksIHgxLCB4MiwgeDMsIHg0LCB5MSwgeTIsIHkzLCB5NCwgdGVtcDsKCWNpbj4+eDE+PnkxPj54Mj4+eTI+PngzPj55Mz4+eDQ+Pnk0OwoJZG91YmxlIG1pbmk9c3FydCgoeDMteDEpKih4My14MSkrKHkzLXkxKSooeTMteTEpKTsgLy/Qv9GA0LXQtNC/0L7Qu9C+0LbQuNC8LCDRh9GC0L4g0LzQuNC90LjQvNCw0LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1LCDRjdGC0L4g0YDQsNGB0YHRgtC+0Y/QvdC40LUg0L7RgiDQutC+0L3RhtCwINC+0LTQvdC+0LPQviDQvtGC0YDQtdC30LrQsCDQtNC+INC60L7QvdGG0LAg0LTRgNGD0LPQvtCz0L4KCXRlbXA9c3FydCgoeDMteDIpKih4My14MikrKHkzLXkyKSooeTMteTIpKTsgLy/QtNC70Y8g0LrQsNC20LTQvtC5INC/0LDRgNGLINC60L7QvdGG0L7QsiDRgNCw0LfQvdGL0YUg0L7RgtGA0LXQt9C60L7QsiDQstGL0YHRh9C40YLRi9Cy0LDQtdC8INGA0LDRgdGB0YLQvtGP0L3QuNC1INC80LXQttC00YMg0L3QuNC80LgKCWlmICh0ZW1wPG1pbmkpLy/QtdGB0LvQuCDQvtC90L4g0LzQtdC90YzRiNC1INC80LjQvdC40LzRg9C80LAKCW1pbmk9dGVtcDsvL9GC0L4g0LzQtdC90Y/QtdC8INC80LjQvdC40LzRg9C8Cgl0ZW1wPXNxcnQoKHg0LXgxKSooeDQteDEpKyh5NC15MSkqKHk0LXkxKSk7Ly/Qv9C+0LLRgtC+0YDRj9C10Lwg0LTQu9GPINC60LDQttC00L7QuSDQv9Cw0YDRiyDQutC+0L3RhtC+0LIg0YDQsNC30L3Ri9GFINC+0YLRgNC10LfQutC+0LIKCWlmICh0ZW1wPG1pbmkpCgltaW5pPXRlbXA7Cgl0ZW1wPXNxcnQoKHg0LXgyKSooeDQteDIpKyh5NC15MikqKHk0LXkyKSk7CglpZiAodGVtcDxtaW5pKQoJbWluaT10ZW1wOwoJeD1wZXJwZW5kaWN1bGFyeCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTsvL9C/0L7Qu9GD0YfQsNC10Lwg0LDQsdGG0LjRgdGB0YMg0L/RgNC+0LXQutGG0LjQuCDQutC+0L3RhtCwINC+0LTQvdC+0LPQviDQvtGC0YDQtdC30LrQsCDQvdCwINC00YDRg9Cz0L7QuSAKCXk9cGVycGVuZGljdWxhcnkoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeCk7Ly/QvtGA0LTQuNC90LDRgtGDCglpZiAoKHgyLXgxKSooeDIteDEpLSh5Mi15MSkqKHkyLXkxKT09MCkgLy/QsiDRgdC70YPRh9Cw0LUsINC10YHQu9C4INGA0LDQstC90L4g0L3Rg9C70Y4sINCw0LHRhtC40YHRgdCwINCx0YPQtNC10YIg0YDQsNCy0L3QsCDQsdC10YHQutC+0L3QtdGH0L3QvtGB0YLQuCwg0LAg0Y3RgtC+INCy0L7Qt9C80L7QttC90L4g0LIg0YLQvtC8INGB0LvRg9GH0LDQtSwg0LXRgdC70Lgg0LrQvtC90LXRhiDQvtGC0YDQtdC30LrQsCDRgdC+0LLQv9Cw0LTQsNC10YIg0YEg0LXQs9C+INC/0YDQvtC10LrRhtC40LXQuSDQvdCwINC00YDRg9Cz0L7QuSDQvtGC0YDQtdC30L7QugoJewoJCXg9eDM7IC8vINC00LvRjyDQutC+0YDRgNC10LrRgtC90YvRhSDQstGL0YfQuNGB0LvQtdC90LjQuSDQv9GA0LjRgNCw0LLQvdC40LLQsNC10Lwg0LDQsdGG0LjRgdGB0Ysg0Lgg0L7RgNC00LjQvdCw0YLRiyDRgtC+0YfQutC4INGBINC10ZEg0L/RgNC+0LXQutGG0LjQtdC5CgkJeT15MzsKCX0KCWlmICh4Pj1taW4oeDEseDIpJiZ4PD1tYXgoeDEseDIpJiZ5Pj1taW4oeTEseTIpJiZ5PD1tYXgoeTEseTIpKSAvL9C10YHQu9C4INC/0YDQvtC10LrRhtC40Y8g0LvQtdC20LjRgiDQvdCwINC+0YLRgNC10LfQutC1INC30LDQtNCw0L3QvdC+0LwKCXsKCQl0ZW1wPXNxcnQoKHgzLXgpKih4My14KSsoeTMteSkqKHkzLXkpKTsvL9GC0L4g0L/RgNC+0LLQtdGA0Y/QtdC8LCDQsdGD0LTQtdGCINC70Lgg0YDQsNGB0YHRgtC+0Y/QvdC40LUg0L7RgiDQutC+0L3RhtCwINC+0YLRgNC10LfQutCwINC00L4g0LXRkSDQv9GA0L7QtdC60YbQuNC4INC80LXQvdGM0YjQtSwg0YfQtdC8INGC0LXQutGD0YnQuNC5INC80LjQvdC40LzRg9C8CgkJaWYgKHRlbXA8bWluaSkKCQltaW5pPXRlbXA7Ly/QtdGB0LvQuCDQtNCwLCDRgtC+INC80LXQvdGP0LXQvCDQt9C90LDRh9C10L3QuNC1INC80LjQvdC40LzRg9C80LAKCX0KCXg9cGVycGVuZGljdWxhcngoeDEsIHkxLCB4MiwgeTIsIHg0LCB5NCk7IC8vINC00LDQu9C10LUg0L/QvtCy0YLQvtGA0Y/QtdC80Y8g0LTQu9GPINGC0YDQtdGFINC00YDRg9Cz0LjRhSDQutC+0L3RhtC+0LIg0L7RgtGA0LXQt9C60L7QsgoJeT1wZXJwZW5kaWN1bGFyeSh4MSwgeTEsIHgyLCB5MiwgeDQsIHk0LCB4KTsKCWlmICgoeDIteDEpKih4Mi14MSktKHkyLXkxKSooeTIteTEpPT0wKQoJewoJCXg9eDQ7CgkJeT15NDsKCX0KCWlmICh4Pj1taW4oeDEseDIpJiZ4PD1tYXgoeDEseDIpJiZ5Pj1taW4oeTEseTIpJiZ5PD1tYXgoeTEseTIpKQoJewoJCXRlbXA9c3FydCgoeDQteCkqKHg0LXgpKyh5NC15KSooeTQteSkpOwoJCWlmICh0ZW1wPG1pbmkpCgkJbWluaT10ZW1wOwoJfQoJeD1wZXJwZW5kaWN1bGFyeCh4MywgeTMsIHg0LCB5NCwgeDEsIHkxKTsKCXk9cGVycGVuZGljdWxhcnkoeDMsIHkzLCB4NCwgeTQsIHgxLCB5MSwgeCk7CglpZiAoKHg0LXgzKSooeDQteDMpLSh5NC15MykqKHk0LXkzKT09MCkKCXsKCQl4PXgxOwoJCXk9eTE7Cgl9CglpZiAoeD49bWluKHgzLHg0KSYmeDw9bWF4KHgzLHg0KSYmeT49bWluKHkzLHk0KSYmeTw9bWF4KHkzLHk0KSkKCXsKCQl0ZW1wPXNxcnQoKHgxLXgpKih4MS14KSsoeTEteSkqKHkxLXkpKTsKCQlpZiAodGVtcDxtaW5pKQoJCW1pbmk9dGVtcDsKCX0KCXg9cGVycGVuZGljdWxhcngoeDMsIHkzLCB4NCwgeTQsIHgyLCB5Mik7Cgl5PXBlcnBlbmRpY3VsYXJ5KHgzLCB5MywgeDQsIHk0LCB4MiwgeTIsIHgpOwoJaWYgKCh4NC14MykqKHg0LXgzKS0oeTQteTMpKih5NC15Myk9PTApCgl7CgkJeD14MjsKCQl5PXkyOwoJfQoJaWYgKHg+PW1pbih4Myx4NCkmJng8PW1heCh4Myx4NCkmJnk+PW1pbih5Myx5NCkmJnk8PW1heCh5Myx5NCkpCgl7CgkJdGVtcD1zcXJ0KCh4Mi14KSooeDIteCkrKHkyLXkpKih5Mi15KSk7CgkJaWYgKHRlbXA8bWluaSkKCQltaW5pPXRlbXA7Cgl9Cgljb3V0PDxtaW5pPDxlbmRsOyAvLyDQstGL0LLQvtC00LjQvCDQvNC40L3QuNC80LDQu9GM0L3QvtC1INGA0LDRgdGB0YLQvtGP0L3QuNC1INC4INC/0LXRgNC10YXQvtC00LjQvCDQvdCwINC90L7QstGD0Y4g0YHRgtGA0L7QutGDCglyZXR1cm4gMDsKfQ==