Geometrie/Hlavní směry

Z Wikiknih

Popis[editovat | editovat zdroj]

Hlavní směry jsou ty směry, kde je normálová křivost extrémní.

Vyjádření[editovat | editovat zdroj]

V 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[editovat | editovat zdroj]

Př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;
}