Из заданного на плоскости множества точек выбрать три различные точки
Категория: C/C++
2011-08-25 21:56:16
Из заданного на плоскости множества точек выбрать три различные точки так, чтобы разность между площадью круга, ограниченного окружностью, проходящей через эти три точки, и площадью треугольника с вершинами в этих точках была минимальной
code: #cpp
- #include
- #include
- #include
- #include
- #include
- #define NPnt 10
- #define XY 2
- #define PI 3.141592653589
- using namespace std;
- void randomfill(double(*)[XY]);
- void matrix_print(double(*)[XY]);
- inline double geron(double,double,double);
- long factorial(int);
- inline int combination(int,int);
- inline double vectormod(double,double,double,double);
- struct Circle
- {
- double rad;
- double area;
- };
- struct Triangle
- {
- int i;
- int j;
- int k;
- double a;
- double b;
- double c;
- double area;
- };
- int main() {
- double crd[NPnt][XY];
- int N = combination(NPnt,3);
- Circle MasC[N];
- Triangle MasT[N];
- int cnt = 0;
- srand(time(NULL));
- randomfill(crd);
- matrix_print(crd);
- for(int i = 0; i < (NPnt-2); i++)
- for(int j = i+1; j < (NPnt-1); j++)
- for(int k = j+1; k < NPnt; k++)
- {
- MasT[cnt].a = vectormod(crd[i][0],crd[j][0],crd[i][1],crd[j][1]);
- MasT[cnt].b = vectormod(crd[j][0],crd[k][0],crd[j][1],crd[k][1]);
- MasT[cnt].i = i; MasT[cnt].j = j; MasT[cnt].k = k;
- MasT[cnt++].c = vectormod(crd[i][0],crd[k][0],crd[i][1],crd[k][1]);
- }
- for(int i = 0; i < N; i++)
- {
- MasT[i].area = geron(MasT[i].a,MasT[i].b,MasT[i].c);
- MasC[i].rad = (MasT[i].a * MasT[i].b * MasT[i].c)/(4*MasT[i].area);
- MasC[i].area = PI * MasC[i].rad * MasC[i].rad;
- }
- int buf[3] = {0,1,2};
- double min_diff = 1E18;
- for(int i = 0; i < N; i++)
- {
- double temp = MasC[i].area - MasT[i].area;
- if(temp < min_diff)
- {
- min_diff = temp;
- buf[0] = MasT[i].i;
- buf[1] = MasT[i].j;
- buf[2] = MasT[i].k;
- }
- }
- cout << "Были сделаны вычисления:" << endl;
- cout << "Минимальная разность в площадях была на точках:" << endl << endl;
- for(int i = 0; i < 3; i++)
- cout << crd[buf[i]][0] << " " << crd[buf[i]][1] << endl << endl;
- return 0;
- }
- void randomfill(double mtx[][XY])
- {
- for(int i = 0; i < NPnt; i++)
- for(int j = 0; j < XY; j++)
- mtx[i][j] = rand()%31 - 15;
- }
- void matrix_print(double mtx[][XY])
- {
- cout << "Печатаю координаты:" << endl;
- cout << setw(5) << "X " << setw(4) << "Y " << endl << endl;
- for(int i = 0; i < NPnt; i++)
- {
- for(int j = 0; j < XY; j++)
- cout << setw(4) << mtx[i][j];
- cout << endl;
- }
- }
- inline double geron(double a,double b,double c)
- {
- return 0.25*sqrt((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c));
- }
- long factorial(int N)
- {
- if(!N) return 1;
- long result = 1;
- for(int i = 1; i <= N; i++)
- result *= i;
- return result;
- }
- inline int combination(int n, int k)
- {
- return (factorial(n)/(factorial(k)*factorial(n-k)));
- }
- inline double vectormod(double x1, double x2, double y1, double y2)
- {
- return (sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)));
- }
Поделиться: