Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2011, 23:41   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию Задача на двумерные массивы.

Из заданного на плоскости множества точек выбрать три различные точки так, чтобы разность между площадью круга, ограниченного окружностью, проходящей через эти три точки, и площадью треугольника с вершинами в этих точках была минимальной.

Собственно хотелось бы не решение всей задачи, это я постараюсь сам, а решение делемы с выбором точек. А точнее как определить что окружность будет проходить через все эти точки.
Нужен даже не код, а алгоритм. С кодом разберусь.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 30.07.2011, 00:06   #2
.S9
Волшебник
 
Аватар для .S9
 
Регистрация: 12.04.2011
Сообщений: 8
По умолчанию

Ну раз надо только натолкнуть на решение задачи, то воспользуйся уравнением окружности (тобиш x^2 + y^2 = R^2). Выбор точки будет таким: если все три точки принадлежат окружности (ур. обращается в тождество) то окружность, описанная вокруг треугольника существует. Ну а дальше считаешь площади и находиш необходимую разницу и пр.


Если что-то слишком подробно - то просьба не критиковать

Чуть не забыл. Разница будет минимальной если треугольник равностороний (хотя в этом точно не уверен)
Есть решебник М.Э.Абрамян http://www.youtube.com/watch?v=B681QmT5WvA
Скачать можно тут http://vk.com/AnswerBook
Также в группе можно абсолютно бесплатно заказать решение нужной Вам задачи

Последний раз редактировалось Stilet; 30.07.2011 в 12:50.
.S9 вне форума Ответить с цитированием
Старый 30.07.2011, 00:09   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Спасибо. Что-то совсем засох мой мозг, развивать надо. Я то искал решение в другой стороне. Искал какое-нибудь условие, при котором вокруг треугольника можно описать окружность и оттуда толкаться. Эх, вроде молодой, а мозг не соображает. Еще раз спасибо

P.S.

Решу - выложу код. Посмеёмся
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 30.07.2011 в 00:20.
MooNDeaR вне форума Ответить с цитированием
Старый 30.07.2011, 00:59   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от .S9 Посмотреть сообщение
...воспользуйся уравнением окружности (тобиш x^2 + y^2 = R^2). Выбор точки будет таким: если все три точки принадлежат окружности (ур. обращается в тождество) то окружность, описанная вокруг треугольника существует
Через любые три точки не принадлежащие одной прямой можно провести окружность и на построить на них треугольник. То есть координаты точек не должны быть пропорциональными.
Цитата:
Разница будет минимальной если треугольник равностороний (хотя в этом точно не уверен)
Правильно что не уверен. Треугольники по площади разные, если один равнобедренный большой, а другой неравнобедренный, но маленький, то уже ответ неверен.
Площадь треугольника можно найти, например, по формуле Герона. Площадь круга через радиус R=abc/4S

Точки выбирать в тройном цикле полным перебором
eoln вне форума Ответить с цитированием
Старый 30.07.2011, 12:13   #5
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Я отказался от пляски с x^2 + y^2 = r^2
Вспомнил по поводу того, что вокруг любого треугольника можно описать окружность А тут еще и вы написали

Так что я посидел и пополнил список своих табличек в стиле "ТАК ПИСАТЬ НЕЛЬЗЯ!"

Выкладываю свой код на растерзание критикой. (P.S. написано в IDE Eclipse)

Код:
//============================================================================
// Из заданного на плоскости множества точек выбрать три различные точки так,
// чтобы разность между площадью круга, ограниченного окружностью, проходящей
// через эти три точки, и площадью треугольника с вершинами в этих точках
// была минимальной.
//============================================================================

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <cmath>
#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)));
}
Прошу сильно помидорами не закидывать
Я ж только учусь.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 30.07.2011 в 12:35.
MooNDeaR вне форума Ответить с цитированием
Старый 30.07.2011, 18:38   #6
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Собственно у меня возник еще вопрос: а как протестировать?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 31.07.2011, 20:07   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а как протестировать?
Тоесть? Запусти программу что она выдаст?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2011, 20:20   #8
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Тоесть? Запусти программу что она выдаст?
Предлагаешь считать площадь и искать самому эту разницу?
Ладн, вопрос всё равно не актуален. Всё проверил, всё работает. Можно даже тему закрыть. Всем спасибо.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 31.07.2011, 20:33   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Предлагаешь считать площадь и искать самому эту разницу?
Ну да. Первый раз вручную посчитай. Я лично для проверки брал решебники, зная их входные параметры и ответы заранее мне и просчитывать не нужно было
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на двумерные массивы. patisson74 Помощь студентам 4 15.11.2009 01:18
Задача на двумерные массивы 2 Sanek87 Общие вопросы C/C++ 4 17.05.2009 19:29
Задача на двумерные массивы N1R0 Общие вопросы C/C++ 12 21.12.2008 20:41