/// <param name="dolzinaTraku">Dolzina traku podana v milimetrih</param> /// <param name="sirinaTraku">Sirina traku podana v milimetrih</param> /// <param name="polmer">Polmer rondelice podan v milimetrih</param> /// <param name="razMedSos">Razdalja med sosednjima rondelicama, podana v milimetrih</param> /// <param name="razMedStran">Razdalja med rondelico in robom traku, podana v milimetrih</param> public static List <OkroglaRondelica> Izracunaj(double dolzinaTraku, double sirinaTraku, double polmer, double razMedSos, double razMedStran) { List <OkroglaRondelica> ret = new List <OkroglaRondelica>(); if (PrviTest(polmer, razMedStran, sirinaTraku, dolzinaTraku) == false) { return(ret); } double x = polmer + razMedStran; // koordinate prve rondelice na traku double y = x; // OkroglaRondelica rond = new OkroglaRondelica(x, y, polmer); ret.Add(rond); bool postavljena = false; // Spremenljivka za glavno zanko, true, dokler je možno postaviti rondelico na trak bool gorAliDol = true; // true, da postavlja rondelice visje, false, da jih postavlja nizje do { rond = new OkroglaRondelica(x, y, polmer); postavljena = PostaviRondelico(ret, ref rond, sirinaTraku, dolzinaTraku, razMedSos, razMedStran, ref gorAliDol); if (postavljena) { x = rond.XPos; y = rond.YPos; ret.Add(rond); } } while (postavljena); return(ret); }
public bool SeDotika(OkroglaRondelica rond, double zamik = 0) { double xRazlika = (rond.XPos - this.XPos) * (rond.XPos - this.XPos); double yRazlika = (rond.YPos - this.YPos) * (rond.YPos - this.YPos); double rRazlika = (rond.RRond + zamik + this.RRond) * (rond.RRond + zamik + this.RRond); return(xRazlika + yRazlika < rRazlika); }
private static bool PostaviRondelico(List <OkroglaRondelica> ret, ref OkroglaRondelica rond, double sirinaTraku, double dolzinaTraku, double razMedSos, double razMedStran, ref bool gorAliDol) { // Rondelico postavimo po Y - osi if (gorAliDol) // true - gremo visje, false - gremo nizje { rond.YPos += 2 * rond.RRond + razMedSos; double zgMeja = rond.YPos + rond.RRond + razMedStran; if (zgMeja > sirinaTraku) // v visino vec ne gre, smo prek traku { rond.YPos = sirinaTraku - rond.RRond - razMedStran; gorAliDol = false; } else // na trak gre po sirini vec rondelic { return(true); } } else { rond.YPos -= 2 * rond.RRond + razMedSos; double spMeja = rond.YPos - rond.RRond - razMedStran; if (spMeja < 0) // ne gre vec nizje, smo prek traku { rond.YPos = rond.RRond + razMedStran; gorAliDol = true; } else { return(true); } } // Rondelico postavimo po X - osi //OkroglaRondelica last = ret[ret.Count - 1]; foreach (OkroglaRondelica last in ret) { while (rond.SeDotika(last, razMedSos)) { rond.XPos++; } } // Preverimo se, da nismo ze cez rob traku po dolzini double desnaMeja = rond.XPos + rond.RRond + razMedStran; if (desnaMeja > dolzinaTraku) { return(false); } else { return(true); } }