» »

hierarhično rojenje, beleženje združevanja rojev, c++

hierarhično rojenje, beleženje združevanja rojev, c++

fraktal ::

Zdravo, pišem program za hierarhični postopek iskanja rojev(http://luks.fe.uni-lj.si/sl/studij/RVO/..., od strani 25) in se mi zatakne pri beleženju kateri roji so že združeni.

Če malo posplošim problem: imam recimo 10 točk v x-y ravnini. Med vsemi točkami izračunam evklidsko razdaljo in vse te razdalje vpišem v neko matriko velikosti 10x10. Nato v tej matriki poiščem najmanjšo razdaljo in ugotovim njeno pozicijo v matriki, torej vem kateri točki sta si najbližji. Recimo T1 in T2 sta si najbližje zato jih združim, torej nova točka T1'=T1+T2. Sedaj zoper izračunam razdalje te nove točke T1' do vseh ostalih. Torej dobim novo matriko 9x9 in postopek znova ponavljam, dokler ne dobim samo še ene razdalje v matriki.

Zatakne se mi, ker ne vem kako bi napisal algoritem, da bi si shranjeval katere točke/roji se združijo, da bi lahko narisal drevo združevanja-dendrogram....Če ima mogoče kdo kakšno idejo... Aha še to pišem v c++, katerega ne poznam dobro-delam prvič in se mi res ne sanja kako bi to sprogramiral.. Hvala.

koda:
#include <iostream>
#include <math.h>
#include <vector>
#include <array>

using namespace std;


//data;
int S1x [8]={4, 6, 4, 8, 9, 9, 8, 14};
int S1y [8]={15, 14, 12, 9, 7, 5, 3, 3};
const int l=8;				//stevilo znacilk;

double D [l][l];			//matrika razdalj;
static double d [l];		//vektor minimalnih razdalj med roji;
static double L[l][l];

//funkcije;
//calculate euclidean distance between two points;
double dist (double x1, double x2, double y1, double y2);	
//razdalja med roji;
double Rdist(double sik, double sjk, double sij);
//find min value;
int minc(double matrix[l][l]);		//minimum stolpci;
int minr(double matrix[l][l]);		//minimum vrstice;
double minn(double matrix[l][l]);	//minimum value;

//for min value;
const double eps=1e-10;
double temp;
int xtemp, ytemp;	//position of smallest element;

int i, j, k, idx;
double T=1e10;			//T index elementov v matriki D, ki so vecji od 0, ko T==1, imamo samo se en stolpec in se program zakljuci;

int main () 
{
	//calculate starting distance matrix, without distances between the same points; 
	temp=dist(S1x[1], S1x[2], S1y[1], S1y[2]);	//search for min value;
	for(i=0; i<l; ++i)
	{
		for(j=i; j<l; ++j)
		{
			D[i][j]=dist(S1x[i], S1x[j], S1y[i], S1y[j]);
			if(D[i][j]< temp & D[i][j]>eps) 
			{
				temp=D[i][j];
				ytemp=i;
				xtemp=j;
			}
		}
	}
	d[0]=temp;
	L[0][0]=ytemp; L[0][1]=xtemp;

	for(i=0; i<l; ++i)
	{
		for(j=0; j<l; ++j)
		{
			cout << D[i][j] << " ";
		}
		cout << endl;
	}

	cout << endl;
	cout << "min value is: " <<temp << endl; 
	cout << "position of min value is: " << ytemp << "," << xtemp << endl;
	cout << D[ytemp][xtemp]<< endl;

for(idx=1; T>1; ++idx)	//Združevanje rojev
{
	T=0;
	for(i=0; i<l; ++i)
	{
		for(j=l-1; j>=0; --j)
		{
			if(j==xtemp) 
			{       
					D[i][j]=Rdist( D[i][j], D[i][idx-1+ytemp], D[ytemp][xtemp]);
			}
			if(i==ytemp)
			{
				D[i][j]=Rdist(D[i][j], D[xtemp+1-idx][j], D[ytemp][xtemp]);
			}

			if((j<xtemp) & (j>0))
			{
				D[i][j]=D[i][j-1];
			}
			if(j>xtemp)
			{
				D[i][j]=D[i][j];	
			}
			if(i>(xtemp+1-idx))
			{
			D[i-1][j]=D[i][j];
			}
		}
	}

	cout << endl;
	cout << endl;
	cout << endl;
	for(i=0; i<l; ++i)
	{
		for(j=0; j<l; ++j)
		{			
			if(D[i][j]>eps) {T++;}
			cout << D[i][j] << " ";
		}
		cout << endl;
	}

	d[idx]=minn(D);
	xtemp=minc(D);
	ytemp=minr(D); 

	cout << minn(D) << endl;
	cout << ytemp << endl;
	cout << xtemp << endl;

}

	system("PAUSE");
  return 0;
}


double dist (double x1, double x2, double y1, double y2)
{
	double d, x, y;

	x=x1-x2;
	y=y1-y2;
	d=pow(x,2) + pow(y,2); d=sqrt(d);	//euclidean distance;
	//d=abs(x+y);						//city block distance;
	return d;
}

double Rdist(double sik, double sjk, double sij)
{
	double ai=0.5, aj=0.5, b=0, c=-0.5;
	//double ai=0.5, aj=0.5, b=0, c=0.5;

	double Rdist;
	
	Rdist=aj*sik + aj*sjk + b*sij + c*abs(sik-sjk);
	return Rdist;
}


double minn(double matrix[l][l])
{
	double minn=1e10;

	for(i=0; i<l; ++i)
	{
		for(j=i; j<l; ++j)
		{
			if(matrix[i][j]< minn & matrix[i][j]>eps) 
			{
				minn=matrix[i][j];
			}
		}
	}
	return minn;
}

int minc(double matrix[l][l])
{	
	double minn=1e10;

	for(i=0; i<l; ++i)
	{
		for(j=i; j<l; ++j)
		{
			if(matrix[i][j]< minn & matrix[i][j]>eps) 
			{
				minn=matrix[i][j];
				ytemp=i;
				xtemp=j;
			}
		}
	}
	return xtemp;
}

int minr(double matrix[l][l])
{	
	double minn=1e10;

	for(i=0; i<l; ++i)
	{
		for(j=i; j<l; ++j)
		{
			if(matrix[i][j]< minn & matrix[i][j]>eps) 
			{
				minn=matrix[i][j];
				ytemp=i;
				xtemp=j;
			}
		}
	}
	return ytemp;
}

Spura ::

Naredis razred Roj, ki lahko vsebuje druge roje. Potem je dost easy napisat kako so roji sestavljeni.

fraktal ::

hja več ko gledam te razrede manj mi je jasno vse skupaj...

recimo tako nekako definiram razred in v njem neko funkcijo, ki zdruzi I-ti in J-ti roj?
class roj{
public:
    void zdruzi(rojI, rojJ);  
};

Cacamas ::

Potem pa začni s čim lažjim in postavi dobre temelje objektnega programiranja.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Metode

Oddelek: Programiranje
51503 (1335) Klobasa
»

Java Objekti

Oddelek: Programiranje
102233 (1927) Mavrik
»

C++ pomoč

Oddelek: Programiranje
5866 (796) Tutankhamun
»

Program v C

Oddelek: Programiranje
51919 (1758) darkkk
»

c++ koordinatni sistem

Oddelek: Programiranje
172241 (2063) OwcA

Več podobnih tem