Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] Алгоритм поиска квадратов на плоскости, Курсовая работа 1 курс ФКТИ ЛЭТИ =) 
V
    Опции темы
HooFoo
Дата 27.1.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.1.2009

Репутация: нет
Всего: нет



Здравствуйте, я тут пока еще новичок, поэтому пишу тут. Народ, помогите реализовать Алгоритм поиска квадратов на плоскости.

Мое задание таково: Дано множество точек на плоскости. Среди них необходимо выбрать такие, которые будут являться вершинами квадратов и среди этих квадратов найти квадрат с наибольшим периметром.

Вариант моего решения
 
Код

#include <iostream.h>
#include <fstream.h>
#include <process.h>
#include <conio.h>
#include <math.h>
#include <dos.h>
#include <iomanip.h>

const int capacity=100;




double CalcLength(float* p1,float* p2)
{
 return sqrt( pow(*p1-*p2,2) + pow(*(p1+1)-*(p2+1),2)  );
}


int S(float* p1, float* p2, float* p3, float* p4)
{ofstream log;   log.open("log.txt",ios::app);
 double Length[6];
 int Sides[4];

 log<<"nahodim dliny do tochek"<<endl;
 Length[0]=CalcLength(p1,p2);
 log<<"Length0="<<Length[0]<<endl;
 Length[1]=CalcLength(p1,p3);
 log<<"Length1="<<Length[1]<<endl;
 Length[2]=CalcLength(p1,p4);
 log<<"Length2="<<Length[2]<<endl;
 Length[3]=CalcLength(p2,p3);
 log<<"Length3="<<Length[3]<<endl;
 Length[4]=CalcLength(p2,p4);
 log<<"Length4="<<Length[4]<<endl;
 Length[5]=CalcLength(p3,p4);
 log<<"Length5="<<Length[5]<<endl;

 int count;

 for(int i=0; i<3; i++)
 {
   count=0;
   log<<"vipolnyaem proverki"<<endl;
   Sides[count]=i;
   log<<"sides["<<count<<"]="<<Sides[count]<<endl;
   for(int j=i+1; j<6;j++)
   {
     if(Length[i]==Length[j])
     {
       count++;
       Sides[count]=j;log<<"sides["<<count<<"]="<<Sides[count]<<endl;
     }
   }

   if(count==3)
   {
     int a=-1, b;
     for(int q=0; q<6; q++)
     {
     if(q==Sides[3-count])
     {count--;log<<"count="<<count<<endl;}
     else
     {(a==-1)?a=q:b=q;log<<"a="<<a<<endl;}
     }



     if(Length[a]==Length[b])
     {
    return Length[i]*4;
     }
     else
    return 0;

   }

 }
 return 0;
}



int Square(float* ArrStart, float* Res, int&length)
{ ofstream log;  log.open("log.txt",ios::app);
  float* ArrEnd=ArrStart+2*length;
  float Max=0;int tmp=0;
  int answers=0;


  for(float* p1=ArrStart; p1<=ArrEnd-6; p1+=2)
    for(float* p2=p1+2; p2<=ArrEnd-4; p2+=2)
      for(float* p3=p2+2; p3<=ArrEnd-2; p3+=2)
    for(float* p4=p3+2; p4<=ArrEnd; p4+=2)
    {
      tmp=S(p1,p2,p3,p4);
      log<<"tmp="<<tmp<<endl;
      if (tmp!=0){log<<"Kvadrat sushestvuet"<<endl;}else {log<<"Kvadratas nema"<<endl;}
      if(tmp>=Max)
      {
       if(tmp==Max)
       { answers++; log<<"answers="<<answers<<endl;}
       else
       { answers=0; Max=tmp;log<<"max="<<Max<<endl;log<<"answers="<<answers<<endl;}

       tmp=8*answers;
       log<<"Tmp="<<tmp<<endl;
       *(Res+tmp)=*p1;
       *(Res+tmp+1)=*(p1+1);
       *(Res+tmp+2)=*p2;
       *(Res+tmp+3)=*(p2+1);
       *(Res+tmp+4)=*p3;
       *(Res+tmp+5)=*(p3+1);
       *(Res+tmp+6)=*p4;
       *(Res+tmp+7)=*(p4+1);

      }


    }

  length=answers+1;
  log<<"max="<<Max<<endl;
  return Max;
}



int Input(float* ArrStart, int cap)
{  ofstream log; log.open("log.txt",ios::app);
   ifstream IN;
   IN.open("in.txt");

   if(IN.bad())
   {
     cout<<"Bad file";
     IN.close();
     getch();
     exit;
   }


   do{
   IN>>*ArrStart;
   ArrStart++;
   IN>>*ArrStart;
   ArrStart++;

   cap--;
   } while (!IN.eof()&&cap>0);
   IN.close();

   return capacity-cap-2;
}


void Output(float* ArrStart, int length, int S)
{ ofstream log;log.open("log.txt",ios::app);
  ofstream OF;
  OF.open("out.txt");

  OF<<"Perimetr kvadrata(ov)= "<<S<<"\r\n";
  log<<"Perimetr kvadrata(ov)= "<<S<<"\r\n";
  OF<<"Kvadrat(y) zadan(y) tochkami:\r\n";
  log<<"Kvadrat(y) zadan(y) tochkami:\r\n";
  for(int i=0; i<length; i++)
  {
    OF<<"("<<*ArrStart<<";"; log<<"("<<*ArrStart<<";";
    ArrStart++;
    OF<<*ArrStart<<"), "; log<<*ArrStart<<"), ";
    ArrStart++;

    if((i+1)%4==0) {OF<<"\r\n";}
  }



}




void main(void)
{ ofstream log;
  clrscr();
  log.open("log.txt",ios::app);
  float Array[capacity][2];
  float Result[capacity][2];


  int count=Input(&Array[0][0], capacity);
  log<<"count="<<count<<endl;
  float Max=Square(&Array[0][0], &Result[0][0], count);
  log<<"max=="<<Max<<endl;
  Output(&Result[0][0],4*count, Max);

  cout<<count<<" Ok. "<<"All done";
  getch();


}




Есть одна проблема. Например фигура user posted image по моему алгоритму тоже являтся квадратом =( предложите вариант исключения таких случаев?
PM MAIL   Вверх
HooFoo
Дата 28.1.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.1.2009

Репутация: нет
Всего: нет



Вобщем решил я эту проблему и сдал. Добавил проверку длин на разницу в корень из 2 раза , и если это условие выполняется 2 раза, то фигура точно квадрат.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0401 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.