Geometrie/Hlavní směry

Z Wikiknih

Přejít na: navigace, hledání

[editovat] Popis

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

[editovat] Vyjádření

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.

[editovat] Algoritmus

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