Добрый день. Вылетает программа при обращении к процедуре vkluch.
При тесте на данных: размер набора 3, X1=1, Y1=1, R1=4; X2=1, Y2=2, R3=5; X3=0, Y3=0, R3=40; Должна выводиться длинна границы 3 круга.
#include <iostream>
#include <math.h>
#include <locale.h>
using namespace std;
struct cir
{
int x,y;
float rad;
};
//получение координат центра и радиуса
cir vvod()
{
cir cir1;
printf("Vvedite koordinatu X ");
scanf("%i",&cir1.x);
printf("Vvedite koordinatu Y ");
scanf("%i",&cir1.y);
printf("Vvedite radius ");
scanf("%f",&cir1.rad);
return(cir1);
}
//длинна окружности
double dlinna(double length) //вычесление длинны окружности
{
length=2*M_PI*length;
return length;
}
//внешняя круговая оболочка
cir obl(cir cir1, cir cir2)
{
cir cirresult; //средний круг
cirresult.x=(cir2.x-cir1.x)/2; //середина отрезка по Х
cirresult.y=(cir2.y-cir1.y)/2; //середина отрезка по Y
cirresult.rad=(cir1.rad+cir2.rad)/2; //средний радиус
return(cirresult);
}
//сдвиг круга по осям
cir sdvig(cir cirX, int x, int y)
{
cirX.x+=x;
cirX.y+=y;
return(cirX);
}
//мастабирование круга
cir name (cir cirM, int i)
{
cirM.rad+=i;
return(cirM);
}
//серединный круг
int sredkrug (cir cir1, cir cir2)
{
double xa, ya, xb, yb, L, t, xc, yc, vt;
L = pow((cir1.x-cir2.x),2)+pow((cir1.y-cir2.y),2);
vt = pow((cir1.rad+cir2.rad),2);
if (L<=vt)
{
xc = 1 / (2*L);
t = (1 - pow((cir2.rad),2)+pow((cir1.rad),2)) * xc;
L = sqrt((vt-L)*(L-pow((cir1.rad-cir2.rad),2))) * xc;
xc = (cir2.x-cir1.x) * t + cir1.x;
yc = (cir2.y-cir1.y) * t + cir1.y;
t = (cir2.y-cir1.y)* L;
xa = xc + t;
xb = xc - t;
t = (cir1.x-cir2.x) * L;
ya = yc + t;
yb = yc - t;
cir1.x=xb-xa;
cir1.y=yb-ya;
cir1.rad=sqrt(cir1.x*cir1.x+cir1.y*cir1.y)/2;
return(1);
}
else
return(0);
}
//включение одного круга в другой
int vkluch(cir cir1, cir cir2)
{
float rast;
if (cir1.rad>cir2.rad)
{
rast<sqrt(pow((cir2.x-cir1.x),2)+pow((cir2.y-cir1.y),2));
if (cir1.rad>rast)
{
return(1);
}
else
{
return(0);
}
}
else
{
return(0);
}
}
//внутренее касание двух кругов
/*int kasanie(cir cir1, cir cir2)
{
float rast;
if (cir1.rad>cir2.rad)
{
rast=sqrt(pow((cir2.x-cir1.x),2)+pow((cir2.y-cir1.y),2));
if (rast+cir2.rad=cir1.rad)
{
return(1);
}
else
{
return(0);
}
}
else
{
return(0);
}
}*/
int peresech(cir cir1, cir cir2)
{
if ((pow((cir1.x-cir2.x),2)+pow((cir1.y-cir2.y),2))<=(pow((cir1.rad+cir2.rad),2)))
{
return(1);
}
else
{
return(0);
}
}
int main()
{
int size, //размер набора
i,j,k,n; //счетчики
double min; //наименьший круг из набора
setlocale(LC_CTYPE,"Russian"); //подключение кирилицы
printf("Vvedite razmer nabora ");
scanf("%i",&size); //количество кругов в наборе
cir *mass; //массив набора кругов
mass = new cir[size];
for (i=0; i<size; i++)
{
mass=vvod(); //ввод данных о круге
}
system("CLS");
cir sred[(size-1*size)%2]; //массив сдерних кругов
k=0; //обнуление k-счетчика
for (i=0; i<size; i++)
{
for (j=0; j<size; j++)
{
if ((i!=j) && (i<j) && (peresech(mass,mass[j]))) //если индексы неравны и второй индекс больше и есть пересечение
{
sred[k]=obl(mass,mass[j]); //получаем круговою оболочку для двух кругов
k++;
}
}
}
printf("%i", k);
min=mass[0].rad; //минимальный круг из набора включений круговых оболочек
for (i=0; i<size; i++)
{
for (j=0; j<k; j++)
{
if (vkluch(mass,sred[j])==1) //проверка на включение в круги из набора
{
if (mass.rad<min)
{
min=mass.rad;
}
}
}
}
printf("Dlinna okruznosti - %lf",dlinna(min));
delete []mass;
system("PAUSE");
return 0;
}