Forum » Programiranje » [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.
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".
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):
Potem pa to kličeš recimo v while zanki dokler nisi obdelal vseh točk oz. prišel 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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C#] Graham scan - problem kolinearnostiOddelek: Programiranje | 1582 (1466) | AnriK |
» | Java ObjektiOddelek: Programiranje | 2249 (1943) | Mavrik |
» | JavaOddelek: Programiranje | 5803 (4404) | Spura |
» | programiranje COddelek: Programiranje | 2429 (2291) | bozjak |
» | [C/C++] Konveksna lupina - brute forceOddelek: Programiranje | 1900 (1774) | WarpedGone |