2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Построить треугольник по заданным условиям (на С++)
Сообщение01.04.2014, 15:00 
Аватара пользователя
Здравствуйте.
Помогите, пожалуйста, найти ошибки в программе.
Условие:
На вход подаётся шесть точек. Нужно вычислить расположение треугольника и вывести координаты его вершин исходя из условий:
1) вершинами треугольника должны быть три точки из полученных на вход,
2) треугольник должен располагаться так, чтобы внутри него оказалось как можно больше точек из оставшихся (не попавших в вершины).
Ответом должны быть три точки - вершины полученного треугольника.
Для написания программы использовать язык С++.

Программа написана, но работает некорректно: она выдает 3 точки, 2 из которых одинаковые, чаще всего это точки с индексами 3 и 4 из исходного массива. Т.е. вместо треугольника получается отрезок.
Алгоритм такой:
На точках строим всевозможные треугольники. Проверяем для них условия, запоминаем результаты. Затем сравниваем в каком случае условие было выполнено наилучшим образом, т.е когда внутри оказалось больше всего точек и выводим координаты вершин, удовлетворяющие этому условию.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdafx.h>
#define N 6
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main()
{
        //ввод точек
        int R[N][2];
        int i,j,k;
       
        cout<<"VVedite tochki\n";
        for(i=0;i<N;i++)
        {
                cout<<"x"<<"["<<i<<"]=";
                cin>>R[i][0];
                //cout<<"x"<<"["<<i<<"]="<<R[i][0]<<"\n";

                cout<<"y"<<"["<<i<<"]=";
                cin>>R[i][1];
                //cout<<"x"<<"["<<i<<"]="<<R[i][1]<<"\n";
                cout<<"\n";
        }

        for(j=0;j<N;j++)
        {
                cout<<"x"<<"["<<j<<"]="<<R[j][0]<<"\n";
                cout<<"y"<<"["<<j<<"]="<<R[j][1]<<"\n";
                cout<<"\n";
        }

        double a,b,c,p,S,S1,S2,S3,S4;
        double t,t1,t2,h1,p1,rad,g1;
        double a1,b1,c1,p2,p3;
        int F[3][2]; //для фиксации точек
        int n,m,n1,m1;//n-внешние точки m-внутренние точки
        h1=1;
        //n1=0;
        //m1=-1;
       
        int l,fuct,g;
        int e=5;

        fuct=0;
        for(i=0;i<3;i++)
        {
                F[i][0]=0;
                F[i][1]=0;
        }
        S4=0;

        for(i=0;i<N-1;i++)
        {
                //cout<<"x"<<"["<<i<<"]="<<R[i][0]<<"\n";
                //cout<<"y"<<"["<<i<<"]="<<R[i][1]<<"\n";
                for(j=0;j<N-1;j++)
                {
                        fuct=1;
                        g1=0;
                        if(j!=i)
                        {
                                for(l=0;l<N-1;l++)
                                {
                                        //if (fuct=1)
                                        //{
                                        if(j!=l || F[i][0]!=F[j][0] && F[l][0]!=F[i][0] || F[i][1]!=F[j][1] && F[l][1]!=F[i][1] )
                                        {
                                                if (fuct=1)
                                        {
                                                //длина стороны 1
                                                        t1=abs(R[i][0]-R[j][0]);
                                                        t2=abs(R[i][1]-R[j][1]);
                                                        t=t1*t1+t2*t2;
                                                        //a=sqrt(t);
                                                        a=pow(t,0.5);

                                                //длина стороны 2
                                                        t1=abs(R[i][0]-R[l][0]);
                                                        t2=abs(R[i][1]-R[l][1]);
                                                        t=t1*t1+t2*t2;
                                                        //b=sqrt(t);
                                                        b=pow(t,0.5);

                                                //длина стороны 3
                                                        t1=abs(R[l][0]-R[j][0]);
                                                        t2=abs(R[l][1]-R[j][1]);
                                                        t=t1*t1+t2*t2;
                                                        //c=sqrt(t);
                                                        c=pow(t,0.5);

                                                //подсчет полупериметра и площади
                                                        p=(a+b+c)/2;
                                                        //S=sqrt(p*(p-a)*(p-b)*(p-c));
                                                        rad=sqrt((p-a)*(p-b)*(p-c)/p);
                                                        fuct=fuct+1;
                                                        g=l;
                                                }//закрывает иф внутри цикла по Л
                                               
                                        }
                                        if (fuct=2 && g!=l)
                                                {
                                                        S4++;
                                                        t1=abs(R[i][0]-R[g][0]);
                                                        t2=abs(R[i][1]-R[g][1]);
                                                        t=t1*t1+t2*t2;
                                                        if (t<=rad){g1=g1+1;}

                                                        t1=abs(R[j][0]-R[g][0]);
                                                        t2=abs(R[j][1]-R[g][1]);
                                                        t=t1*t1+t2*t2;
                                                        if (t<=rad){g1=g1+1;}

                                                        t1=abs(R[l][0]-R[g][0]);
                                                        t2=abs(R[l][1]-R[g][1]);
                                                        t=t1*t1+t2*t2;
                                                        if (t<=rad){g1=g1+1;}

                                                        if (g1=3){m1=m1+1;}
                                                        else {n1=n1+1;}
                                                        g1=0;
                                                }
                                }//закрытие цикла по Л
                                if (m1>n1 )//&& m1-n1>e)
                                {
                                        F[0][0]=R[i][0];
                                        F[0][1]=R[i][1];
                                       
                                        F[1][0]=R[j][0];
                                        F[1][1]=R[j][1];

                                        F[2][0]=R[g][0];
                                        F[2][1]=R[g][1];
                                       
                                        m=m1;
                                        n=n1;
                                        //e=m-n;

                                }
                               
                        }//закр условие внутри цикла по джи


                }//закрытие цикла по джи


        }//закрытие цикла по и


        cout<<"answer:\n";
        for(i=0;i<3;i++)
        {
                cout<<"x"<<"["<<i<<"]="<<F[i][0]<<"\n";
                cout<<"y"<<"["<<i<<"]="<<F[i][1]<<"\n";
                cout<<"\n";
        }
        //cout<<"S4="<<S4<<"\n";

    system("pause");
        return 0;
}
 

 
 
 
 Re: Построить треугольник по заданным условиям (на С++)
Сообщение01.04.2014, 15:09 
В коде не разбирался, но навскидку надо правильно перебирать все возможные треугольники - чтобы не дублировать уже проверенные в другом порядке вершин и чтобы гарантированно все 3 вершины были различны - тогда программа в принципе не сможет выдать 2 одинаковые точки, да и количество переборов будет сведено к минимуму. Сделать это очень просто. Для начала напишите словами и реализуйте в коде алгоритм перебора треугольников, удовлетворяющий этим требованиям.

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group