Archief - [PROG]C++ een array van structs sorten..

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

zarathustra

Legacy Member
ik heb dit

Code:
	struct pixel{
		float phi;
		float theta;
		float red;
		float green;
		float blue;
	}pixeldata[1500*1500];

en nu moet ik die uitprinten in een text file als volgt

voor theta0 van phi0 tot phiN, dan voor theta1 van phi0 tot phiN etc tot thetaN

Iemand enige suggestie hoe ik dat snel kan sorten ?

Daedie

Legacy Member
ik snap de voorwaarden van uw sortering niet echt. Maar ge kunt een operator overloaden waarin ge bepaald op welke basis een pixel kleiner is dan het ander.

en dan kunt ge zo'n pixel dus gewoon rechstreeks vergelijk met "<". En dan gebruikt ge deze in een standaard sorteeralgoritme. of ge maakt een STL vector/lijst/... (in plaats van uw array)die al vrij efficiente sorteeralgoritmes heeft ingebouwd.

Als ik uw voorwaarden zou snappen zou ik u meer uitleg kunnen verschaffen :p.

edit: ik vermoed dat ge wilt sorteren op theta van klein naar groot, en voor theta's die even groot zijn sorteren op phi van klein naar groot. Heb ik het juist of fout? :p

zarathustra

Legacy Member
kijk ik zal het eens uitgebreid uitleggen :p

ik heb een lightprobe van hier ==> http://www.debevec.org/Probes/ Zo een van die bolvormige images.

Nu heb ik dat naar openEXR omgezet en ingelezen waardoor ge een array krijgt van lengte 1500*1500 met daarin wat rgb data. Zoals je ziet staan op die site kunt ge uit de images de theta en phi hoeken voor coordinaten op die bol afleiden. (1500*1500 herleiden naar een [-1 1]* [-1 1] ding )

zoiets dus:

u = (Xvalue - 750)/750;
v = (Yvalue - 750)/750;

float theta=atan2(v,u);
float phi=PI*sqrt(u*u+v*v);


Bon, nu wat ik wil doen is/nodig heb is eg. de rood waarden listen als volgt
rood(theta0, phi0)
rood(theta0, phi1)
...
rood(theta0, phiN)
rood(theta1, phi0)
...

etc

ik hoop dat het zo duidelijker is?

Ik heb ondertussne idd wel die < operator overloaded en daarmee trachten te sorten, probleem is nu wel dat die floats niet exact gelijk zijn waardoor ik zoiets krijg als ik orden op theta:


-3.14026
-3.14026
-3.14026
-3.14025
-3.14025
-3.14025
-3.14025
-3.14025
-3.14024
-3.14024
-3.14024
-3.14024
-3.14024
-3.14024
-3.14023
-3.14023
-3.14023
-3.14023
-3.14023
-3.14022
-3.14022
-3.14022
-3.14022
-3.14022


En nu kan ik me vergissen maar ik denk dat er in zo'n image wel meer dan 5 of 6 gelijke theta waarden zitten. Moest ik nu zeker weten hoeveel gelijke theta waarden er in zitten dan zou ik ze miss gewoon zo kunnen samen nemen natuurlijk >_<

Daedie

Legacy Member
vind ik eigenaardig. operator< zou uw data niet mogen aanpassen. Dit is hoe volgens mij de operator< moet uitzien:

Code:
bool Pixel::operator<(const Pixel& rhs)
{
      bool lt = false; //lesser then

      if(theta < rhs.theta)
            lt = true;
      else if(theta == rhs.theta && phi < rhs.phi)
            lt = true;

      return lt;
}

en om te kijken ivm die gelijk theta waardes kunt ge toch wel debuggen? gewoon een theta deruit pakken en alles printen waarvoor de theta gelijk is aan uwe theta.

zarathustra

Legacy Member
mja dat bedoel ik niet :) Ik denk dat er door afrondingsfouten (omdat ge eerst van een 0-1500 range naar een -1 1 range gaat en daar dan wat met pi en atan zit te prutsen) lichte variaties onstaan op theta waardes die an sich wel gelijk zouden moeten zijn.

Daedie

Legacy Member
ah, een nieuw probleem :p. Maar als gij 2 exact dezelfde waardes naar een nieuwe domein transformeert zouden die waardes nog altijd exact hetzelfde moeten zijn (met eventueel dezelfde afwijking).

Maar zoals ik al zei. voer de transformatie uit. pak er zo'n waarde uit. en dan print es alle pixels waarvoor de theta gelijk is aan uw gekozen waarde. Dan weet ge iig als er iets snort aan uw transformatie of iets anders.

zarathustra

Legacy Member
hmm, voor theta == 0 krijg ik dan 750 waarden (wat ergens logisch is vermoed ik )

blijkbaar voor het eerste element in mijn array pixeldata[0] dus krijg ik 750 waarden, en dan voor alle volgende pixeldata[x*750] ook. Maar voor al wat er tussen ligt is er een variabel aantal theta waardes. Maar als ik de uitgeprinte waarden dan vergelijk dan zie ik dat ie soms een stap van 0.00133 neemt en soms eentje van 0.00134 >_<

Dit gaat nog een miserie worden :p

edit, waarschijnlijk dat sorting gedoe aanpassen zodat het een soort van epsilon waarde in aanmerking neemt. iets van a < b als het a kleiner dan b en het verschil tussen a en b minder dan 0.00005 ofzo

Cycloon

Legacy Member
zarathustra zei:
edit, waarschijnlijk dat sorting gedoe aanpassen zodat het een soort van epsilon waarde in aanmerking neemt. iets van a < b als het a kleiner dan b en het verschil tussen a en b minder dan 0.00005 ofzo

Idd, iets zoals dit:

Code:
if(fabs(a-b)<0.00001) return true

Op uw opdracht:

Code:
bool Pixel::operator<(const Pixel& rhs)
{
      bool lt = false; //lesser then

      if(theta < rhs.theta)
            lt = true;
      else if(fabs(theta-rhs.theta)<0.0001 && phi < rhs.phi)
            lt = true;

      return lt;
}

Wel nog ff checken met welke waarde je best kan vergelijken natuurlijk :)

Daedie

Legacy Member
in de eerste test moet ge die epsilon ook in beschouwing nemen he ^^.

zarathustra

Legacy Member
uhu, het is nog zo simpel niet als het lijkt :p

Er zijn in totaal 2250000 koppels van theta en phi
en in "theorie" zijn er 1500 theta waarden die er elke 1500 keer instaan. In praktijk daarentegen zijn er als ik geluk heb voor elke theta waarde gemiddeld een 6 tal met dezelfde waarde.

Dus ik had zo gedacht om mjn array van structs te ordenen van klein naar groot op basis van theta (dat lukt) en dan gewoon de eerste 1500 structs in die array te nemen, die te ordenen op basis van phi en dat dan herhalen voor elke volgende batch van 1500 theta's. Probleem is dat mijn c++ kennis beperkt is en dit een hele hoop gegoochel met arrays vraagt >_< En het is allemaal nogal irritant om te checken aangezien ik met zo'n grote aantallen werk. niks zo leuk als .dat bestanden van 50MB door te nemen

noot: mijn spheric harmonic convolution die ik er na doe werkt nu wel. Maar aangezien mijn phi waarden atm @ random staan kan ik het image niet reconstrueren >_<

Cycloon

Legacy Member
Als ge snel en makkelijk wilt sorteren dan kunt ge gewoon uw structs allemaal in een multiset laden, een multiset sorteert automatisch dus die doet alle werk voor jou ;) Natuurlijk moet je dan wat info zoeken over multisets, maar stelt niet zo heel veel voor :)

zarathustra

Legacy Member
mja maar dat lost het probleem van het sorteren op phi er na niet op natuurlijk ^^

soit, ik zal er wel een vreemd eoplossing voor bedenken morgen ofzo

Cycloon

Legacy Member
Jawel toch...

Je steekt eerst al die structs in een multiset (als je die overloading toepast weet hij hoe te sorteren). Nu haal je de eerste x aantal structs eruit en je steekt deze in een andere struct met bv naam pixel2 en nu schrijf je voor pixel2 weer zo'n overloaded parameter (maar dan voor phi) en steek je alles wederom in die multiset. Nu zal alles gesorteerd staan op uw phi.

zarathustra

Legacy Member
ah zo bedoel je :p Ja zo lost het het wel op natuurlijk.

In ieder geval dit probleem is opgelost, nu een wiskunde probleem oplossen voor ik weer programmeer problemen kan aanmaken
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan