Geometrie/Hlavní směry
Popis
editovatHlavní směry jsou ty směry, kde je normálová křivost extrémní.
Vyjádření
editovatV daném bodě otáčíme přímkou na ploše tak dlouho, dokud není normálová křivost křivky v bodě extrémní, to znamená hledáme nejvyšší hodnotu. Tím získáme hlavní směr. Druhý hlavní směr vypočítáme pomocí získaného.
Algoritmus
editovatPři hledání v algoritmu otáčíme křivkou na ploše tak dlouho, dokud hodnota normálové křivosti nezačne klesat. Poté otočíme směr otáčení a vylepšíme přesnost. Hledáme tak dlouho, dokud výsledek není v mezích, které jsme určili konstantou.
public static ArrayList HlavniSmer(Surface plocha, double u, double v)
{
ArrayList result=new ArrayList(); // vysledky
if(JeKruhovyBod(plocha,u,v) || JePlanarniBod(plocha,u,v))
{
return result;
}
//pocita hlavni smer s nejmenci hlavni krivosti
double uhel=0; //pocatecni uhel
double prirustek=Constants.PocatecniPrirustek;
Primka2d pomocnaPrimka=VytvorPrimku(uhel, u, v);
double NormalKrivost=NormalyPlochy.NormalovaKrivost(plocha, pomocnaPrimka, 0);
pomocnaPrimka=VytvorPrimku(uhel+prirustek, u,v);
double pomocnaKrivost=NormalyPlochy.NormalovaKrivost(plocha, pomocnaPrimka, 0);
while(Math.Abs(prirustek) > Constants.PresnostHlavSmeru)
{
if(pomocnaKrivost < NormalKrivost)
{
NormalKrivost=pomocnaKrivost;
uhel+=prirustek;
prirustek=prirustek/ -(Constants.Zpresneni);
}
else if(pomocnaKrivost == NormalKrivost)
{
prirustek=prirustek/ -(Constants.Zpresneni);
}
else
{
NormalKrivost=pomocnaKrivost;
uhel+=prirustek;
}
pomocnaPrimka=VytvorPrimku(uhel+prirustek, u,v);
pomocnaKrivost=NormalyPlochy.NormalovaKrivost(plocha, pomocnaPrimka, 0);
}
// pridava nalereny hlavni smer s nejmenci hlavni krivosti
pomocnaPrimka=VytvorPrimku(uhel, u, v);
KrivkaNaPlose krivkaNaPlose=new KrivkaNaPlose(plocha, pomocnaPrimka);
result.Add(krivkaNaPlose.FirstDeriv(Constants.presnost));
//pocita hlavni smer s nejvetsi hlavni krivosti
uhel=0; //pocatecni uhel
prirustek=Constants.PocatecniPrirustek;
pomocnaPrimka=VytvorPrimku(uhel, u, v);
NormalKrivost=NormalyPlochy.NormalovaKrivost(plocha, pomocnaPrimka, 0);
pomocnaPrimka=VytvorPrimku(uhel+prirustek, u,v);
pomocnaKrivost=NormalyPlochy.NormalovaKrivost(plocha, pomocnaPrimka, 0);
while(Math.Abs(prirustek) > Constants.PresnostHlavSmeru)
{
if(pomocnaKrivost > NormalKrivost)
{
NormalKrivost=pomocnaKrivost;
uhel+=prirustek;
prirustek=prirustek/-(Constants.Zpresneni);
}
else if(pomocnaKrivost == NormalKrivost)
{
prirustek=prirustek/-(Constants.Zpresneni);
}
else
{
NormalKrivost=pomocnaKrivost;
uhel+=prirustek;
}
pomocnaPrimka=VytvorPrimku(uhel+prirustek, u,v);
pomocnaKrivost=NormalyPlochy.NormalovaKrivost(plocha, pomocnaPrimka, 0);
}
// pridava nalereny hlavni smer s nejmenci hlavni krivosti
pomocnaPrimka=VytvorPrimku(uhel, u, v);
krivkaNaPlose=new KrivkaNaPlose(plocha, pomocnaPrimka);
result.Add(krivkaNaPlose.FirstDeriv(Constants.presnost));
return result;
}