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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2011, 16:57   #1
Kewen
 
Регистрация: 13.12.2011
Сообщений: 8
Восклицание за денежку! Закончить программу на С++ с графиками

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


ЧТО ЕДИНСТВЕННОЕ НЕ СДЕЛАЛ, ЭТО Я НЕ СМОГ СОСТАВИТЬ АЛГОРИТМ ЧТО БЫ СТРОИЛСЯ ТРЕУГОЛЬНИК ТАК ЧТО БЫ ОН СОДЕРЖАЛ МАКС. КОЛИЧЕСТВО ТОЧЕК.
За 500 руб сможете сделать?
Очень очень нужно помогите!! Почти на грани жизни и смерти!)

Код:
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<graphics.h>
#include<fstream.h>

#define PIXEL_COUNT 100


struct Pt
{
	double x;
	double y;
};

//функция нахождения длины стороны треугольника.
// входными параметрами служат координаты конца и начала стороны.
double SideLength(double x1,double y1,double x2,double y2)
{
	double a = sqrt((x2-x1)/10*(x2-x1)/10+(y2-y1)/10*(y2-y1)/10);
	return a*10;
}

//функция нахождения периметра треугоника. 
//входные параметры - стороны треугольника
double Perimetr (double s1, double s2, double s3)
{
     return (s1+s2+s3);
}


//функция нахождения площади треугольника (по формуле Герона) 
//входные параметры - стороны треугольника
double Sqare (double s1, double s2, double s3)
{
      double p;
      p = (Perimetr(s1, s2, s3))/2;
      return  sqrt((p*(p-s1)*(p-s2)*(p-s3)));
}


void main()
{
	int gd,gm,flag,i;
	double s1,s2,s3,S,p,R,x1, x2, y1, y2;
	Pt t, a[PIXEL_COUNT];

	gd=DETECT;
	initgraph(&gd,&gm,"");

	start:
	cleardevice();
	randomize();


	int maxx = getmaxx();
	int maxy = getmaxy();
	int x0 = getmaxx()/2;
	int y0 = getmaxy()/2;
	putpixel(x0, y0, 13);
	moveto(x0+5, y0-10);
	outtext("0");

	//Ставим рандомно точки на плоскости
	for(i=0; i<PIXEL_COUNT; i++)
	  {
	    a[i].x = random(maxx);
	    a[i].y = random(maxy);
	    putpixel(a[i].x, a[i].y, 10);

          }



	//упорядочиваем вершины треугольника по возрастанию их y-координаты
	if(a[0].y>a[1].y & a[0].x>a[1].x) {t=a[0]; a[i]=a[1]; a[1]=t;}
	if(a[1].y>a[2].y & a[1].x>a[2].x) {t=a[1]; a[1]=a[2]; a[2]=t;}
	if(a[0].y>a[2].y & a[0].x>a[2].x) {t=a[0]; a[0]=a[2]; a[2]=t;}
	if(a[0].y>a[1].y & a[0].x>a[1].x) {t=a[0]; a[0]=a[1]; a[1]=t;}
 
	setcolor(YELLOW); circle(a[0].x,a[0].y,3);
	setcolor(WHITE);  circle(a[2].x,a[2].y,3);
 
	//чертим треугольник
        
        
	 for(i = 0; i < 3; i++)
          {
            putpixel(a[i].x,a[i].y, WHITE);
          }
         
	 line(a[0].x, a[0].y, a[1].x,a[1].y);
	 line(a[1].x, a[1].y, a[2].x,a[2].y);
	 line(a[2].x, a[2].y, a[0].x,a[0].y);
 
	 setcolor(YELLOW); circle(a[0].x,a[0].y,3);
	 setcolor(WHITE);  circle(a[2].x,a[2].y,3);
 
	//Находим длины сторон треугольника
 
	    s1=SideLength(a[0].x,a[0].y, a[1].x,a[1].y);
	    s2=SideLength(a[1].x,a[1].y, a[2].x,a[2].y);
	    s3=SideLength(a[2].x,a[2].y, a[0].x,a[0].y);
 
// Находим полупериметр треугольника и его площадь
	    p = (Perimetr(s1, s2, s3))/2;
	    S = Sqare (s1, s2, s3);

cout<<"p = "<<p<<endl;
cout<<"S = "<<S<<endl;

getch();
closegraph();  
}
Kewen вне форума Ответить с цитированием
Старый 27.12.2011, 17:20   #2
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

Если за денежку, то здесь тему создайте, быстрее найдете желающего помочь.
P.S. а сроки какие?
Nobody expects Spanish Inquisition!

Последний раз редактировалось Juffin; 27.12.2011 в 17:27.
Juffin вне форума Ответить с цитированием
Старый 27.12.2011, 17:29   #3
bananasus
Пользователь
 
Аватар для bananasus
 
Регистрация: 24.01.2011
Сообщений: 67
По умолчанию

Тут можно перебором решать...
1) берем первые 3 точки из множества
2) из трех точек треугольник строится если точки не лежат на одной прямой
3) берем точку множества, проверяем, принадлежит ли она треугольнику, если да то увеличиваем какой-нибудь счетчик и повторяем для всех остальных точек
4) находим площадь
5) повторяем все для следующих 3-х точек
6) находим тот треугольник который нужен
В общем так...

Последний раз редактировалось bananasus; 27.12.2011 в 17:32.
bananasus вне форума Ответить с цитированием
Старый 27.12.2011, 19:39   #4
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

ни к чему таким стрёмным способом площадь кстати считать, можно проще типа так:
s=abs((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3))/2
при этом не нужно никаких периметров и геронов, только координаты вершин треугольника
Camaro Chevelle вне форума Ответить с цитированием
Старый 27.12.2011, 20:13   #5
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

есть в паскале, правда долго работает
Код:
uses graph;
const
  eps=0.01;
type
  point=
    record
      x, y: real;
    end;
function dsquare(a, b, c: point): real;
  begin
    dsquare:=abs((a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y));
  end;
function inside(a, b, c, d: point): boolean;
  begin
    inside:=abs(dsquare(a, b, c)-dsquare(a, b, d)-dsquare(b, c, d)-dsquare(a, c, d))<eps;
  end;
var
  a: array[0..255] of point;
  d, m, i, j, k, l, c, cmax, n, u, v, w: integer;
  smax: real;
  x0, y0: integer;
begin
  write('n=');
  readln(n);
  d:=0;
  initgraph(d, m, 'c:\bp\bgi');
  x0:=getmaxx shr 1;
  y0:=getmaxy shr 1;
  for i:=1 to n do begin
    a[i].x:=(0.5-random)*200;
    a[i].y:=(0.5-random)*200;
    putpixel(x0+round(a[i].x), y0-round(a[i].y), white);
  end;
  for i:=1 to n-2 do
    for j:=i+1 to n-1 do
      for k:=j+1 to n do begin
        c:=0;
        for l:=1 to n do
          if inside(a[i], a[j], a[k], a[l]) then
            inc(c);
        if c>cmax then begin
          cmax:=c;
          u:=i;
          v:=j;
          w:=k;
          smax:=dsquare(a[i], a[j], a[k])/2;
        end;
      end;
  setcolor(red);
  line(x0+round(a[u].x), y0-round(a[u].y), x0+round(a[v].x), y0-round(a[v].y));
  line(x0+round(a[v].x), y0-round(a[v].y), x0+round(a[w].x), y0-round(a[w].y));
  line(x0+round(a[u].x), y0-round(a[u].y), x0+round(a[w].x), y0-round(a[w].y));
  writeln('Square=', smax);
  readln;
end.
Camaro Chevelle вне форума Ответить с цитированием
Старый 27.12.2011, 21:42   #6
Kewen
 
Регистрация: 13.12.2011
Сообщений: 8
По умолчанию

Спасибо ребят вам большое!
Kewen вне форума Ответить с цитированием
Старый 27.12.2011, 21:57   #7
Kewen
 
Регистрация: 13.12.2011
Сообщений: 8
По умолчанию

Сроки 3 дня(((
Kewen вне форума Ответить с цитированием
Старый 27.12.2011, 21:57   #8
Kewen
 
Регистрация: 13.12.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Juffin Посмотреть сообщение
Если за денежку, то здесь тему создайте, быстрее найдете желающего помочь.
P.S. а сроки какие?
Сроки 3 дня
Kewen вне форума Ответить с цитированием
Старый 27.12.2011, 22:09   #9
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

дак переделай мой код в паскале в си++, вроде достаточно просто
Camaro Chevelle вне форума Ответить с цитированием
Старый 27.12.2011, 22:11   #10
Kewen
 
Регистрация: 13.12.2011
Сообщений: 8
Печаль

Цитата:
Сообщение от Camaro Chevelle Посмотреть сообщение
дак переделай мой код в паскале в си++, вроде достаточно просто
Не могу перевести((( НЕ разу не работал с Паскалем))) Балбес я)) сможешь помоч? я тебе денюжку за это?) Срочно надо просто))
Kewen вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закончить программу... Ilya_tb4 Общие вопросы C/C++ 3 09.12.2010 23:16
Нужно закончить программу! Sem3109 Общие вопросы C/C++ 4 10.05.2010 10:44
ЗАКОНЧИТЬ ПРОГРАММУ! 4ika Общие вопросы C/C++ 3 10.02.2010 02:20
Надо закончить программу KsarK Общие вопросы C/C++ 2 15.01.2010 01:12
Как закончить программу? Cry Помощь студентам 0 21.10.2009 09:28