» »

[C#] izpis ugodnih točk iz seznama

[C#] izpis ugodnih točk iz seznama

eXoo ::

Imam seznam točk v katerem so shranjene koordinate klikov na canvas. Ker iščem convex hull sem najprej naredil for loop čez vse točke in poiskal točko z največjim y(to je točka najnižje na canvas), ker je ta zagotovo članica lupine. Potem sem iz te najnižje točke izračunal polarni kot na vse točke (for loop), tako je naslednja točka, ki ima najmanjši polarni kot zagotovo točka lupine. Problem pa nastane, ker se ne znam v zanki premaknit v naslednjo točko (tisto ki ima naslednja najmanjši polarni kot, možno je tudi da ni več naslednje). Tukaj imam primer kako najdem točko z najmanjšim kotom, ne znam pa se potem postavit v to najdeno točko in spet poiskat naslednjo točko z najmanjšim kotom.
for (int i = 0; i < tocke.Count; i++)
    {
        myvector = new Point(tocke[i].X, tocke[i].Y);
        temp_angle = angle(maxYTocka, myvector);  // maxYtocka je točka z največjo koordinato y.

        if (temp_angle > result)
        {
            naslednjaTocka = tocke[i]; // tukaj shranim točko z najmanjšim kotom
            result = temp_angle;
        }
    }
    seznamTockLupine.add(tocke[naslednjaTocka]); // shranim najdeno točko v seznam


Torej sedaj bi se moral postavit v točko "naslednjaTocka" in izračunati vse kote, ter se potem spet prestavit v naslednjo točko. ki ima najmanjši kot. V bistvu bi moral to for zanko ponavljat dokler mi ne zmanjka točk, spremeniti bi moral samo "maxYTocka" z "naslednjaTocka".

darkolord ::

Najlažje je, če narediš metodo/funkcijo, ki ji boš podal to začetno točko in jo potem kličeš toliko časa, dokler ne prideš okrog.

Nekaj v tem stilu (čisto na hitro, ni preizkušeno):

	Point poisciNaslednjoTocko(Point zacetnaTocka)
	{
        var naslednjaTocka = new Point();
        var result = 0;

	    foreach (var myvector in tocke)
	    {
		    if (seznamTockLupine.Contains(myvector)) // preskocim ze uporabljene tocke
		        continue;
	
	  	    var temp_angle = angle(zacetnaTocka, myvector);  
	 
	        if (temp_angle > result)
	        {
	            naslednjaTocka = myvector; // tukaj shranim točko z najmanjšim kotom
	            result = temp_angle;
	        }
	    }
		
	    return naslednjaTocka;
	}


Potem pa to kličeš recimo v while zanki dokler nisi obdelal vseh točk oz. prišel okrog.

	var naslednjaTocka = maxYTocka;
	while (true)
	{
		naslednjaTocka = poisciNaslednjoTocko(naslednjaTocka);
		
		if (naslednjaTocka.IsEmpty)
			break; // koncali
		
		seznamTockLupine.Add(naslednjaTocka);
	}

Zgodovina sprememb…

  • spremenilo: darkolord ()


Vredno ogleda ...

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

[C#] Graham scan - problem kolinearnosti

Oddelek: Programiranje
71582 (1466) AnriK
»

Java Objekti

Oddelek: Programiranje
102249 (1943) Mavrik
»

Java

Oddelek: Programiranje
335803 (4404) Spura
»

programiranje C

Oddelek: Programiranje
62429 (2291) bozjak
»

[C/C++] Konveksna lupina - brute force

Oddelek: Programiranje
71900 (1774) WarpedGone

Več podobnih tem