Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Новый участник


Сообщения: 28
Благодарности: 3

Профиль | Отправить PM | Цитировать


Компилировал в Visual Studio 2010, если нужны будут поправки, пишите...

Код: Выделить весь код
#include <iostream>
#include <cstdlib>
#include <clocale>
#include <ctime>
#include <cmath>
using namespace std;

struct point {
	double x,y;
};

struct okr {
	double x,y,r;
};

const int nmax=20;

/* функция определяет пересекается прямая с окржуностью или нет */
bool Peres(point a, point b, okr c);

int main() {
	setlocale(0,"");

	point a[nmax];
	okr b[nmax];
	int n,m,i,j,k,p,mx,imx,jmx;

	srand(time(0));

	do {
		cout << "Количество точек до " << nmax << " n=";
		cin >> n;
	}while(n<1 || n>20);

	do {
		cout << "Количество окружностей до " << nmax << " m=";
		cin >> m;
	}while(m<1 || m>20);

	for(i=0; i<n; ++i) {
		a[i].x=rand()%30-10;
		a[i].y=rand()%30-10;
	}

	for(i=0; i<m; ++i) {
		b[i].x=rand()%30-10;
		b[i].y=rand()%30-10;
		b[i].r=5*rand();
	}

	cout << "Координаты точек:\nX:";
	for(i=0;i<n;++i)
		cout << a[i].x << " ";
	cout << "\nY:";
	for(i=0;i<n;++i)
		cout << a[i].y << " ";
	cout << "\n\nПараметры окружностей:\nX:";
	for(i=0;i<m;++i)
		cout << b[i].x << " ";
	cout << "\nY:";
	for(i=0;i<m;++i)
		cout << b[i].y << " ";
	cout << "\nR:";
	for(i=0;i<m;++i)
		cout << b[i].r << " ";
	cout << "\n\n";
	/* ищем прямую с максимальными пересечениями */
	mx=0;
	imx=0;
	jmx=0;

	for(i=0;i<n-1;++i)
		for(j=i+1;j<n;++j) {
			k=0;
			for(p=1;p<m;++p)
				if(Peres(a[i],a[j],b[p]))
					++k;
			if(k>mx) {
				mx=k;
				imx=i;
				jmx=j;
			}
		}

	if(mx==0)
		cout << "Нет пересекающихся прямых и окружностей\n";
	else
		cout << "Максимальное число пересечений прямой с окружностями=" << mx
			<< "\nЭта прямая проходит через точки ("<<a[imx].x<<';'<<a[imx].y<<") и ("<<a[jmx].x<<';'<<a[jmx].y<<")\n";
	cout << "\n";
	system("pause");
}

bool Peres(point a, point b, okr c) {
	double s, ab, h;
	/*	строим треугольник на точках прямой о центре окружности
		определяем его площадь, длину стороны на прямой и высоту на нее
	*/

	s = abs(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y));
	ab = sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
	h = s/ab;
	return (h<c.r); // если высота больше радиуса, пересекаются
}

-------
подпись

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:17, 12-03-2012 | #2