Preskočiť na hlavný obsah

Ako umiestniť body na kružnicu

Problém ako umiestniť body po na kružnici som riešil nedávno a vôbec to nie je zložité. Potrebujeme k tomu 3 údaje a to počet bodov, šírku a výšku plátna na ktoré ideme body umiestňovať. Prvú vec ktorú si spočítame sú okraje kružnice. V mojom uvedenom príklade je to veľkosť plátna mínus 10%. Ďalej si určíme uhol alfa ktorý vypočítame ako 2 × π a to celé deleno počet vrcholov. Ako ďalšiu vec si určíme stred kružnice a polomer. A na koniec už len prechádzame počtom vrcholov a jednoduchou matematickou operáciou pre x-ovú súradnicu je to stred + (polomer × cos(poradie vrchola × uhol alfa)) a pre y-ovú je postup rovnaký avšak zmeníme funkciu cos() na funkciu sin() počítame už konkrétne body.

Realizácia v Jave

/**
 * placePointsOnCircle - Regular distribution of points on a circle
 * 
 * @author Tomas Adamjak <thomas @ adamjak.net>
 *
 * @see http://thomas.adamjak.net/2014/03/27/ako-umiestnit-body-na-kruznicu/
 * 
 * @param numberOfPoint (Integer) - Number of points that we want to place the circle (must be at least 1)
 * @param width (Integer) - canvas width
 * @param height (Integer) - canvas height
 * 
 * @return List<Point> - List of points
 * 
 * @throws Exception If number of points is less than 1
 * @throws Exception If width of canvas is less than 1
 * @throws Exception If height of canvas is less than 1
 */
public List<Point> placePointsOnCircle(Integer numberOfPoint, Integer width, Integer height) throws Exception
{
	if (width < 0)
	{
		throw new Exception("Width must be more than 0.");
	}
	else if (height < 0)
	{
		throw new Exception("Height must be more than 0.");
	}
	else if (numberOfPoint < 0)
	{
		throw new Exception("Number of points must be more than 0.");
	}
	
	Integer minWidth = width / 100 * 10;
	Integer maxWidth = width - minWidth;
	Integer minHeight = height / 100 * 10;
	Integer maxHeight = height - minHeight;
	
	Double angleAlfa = (2 * Math.PI) / numberOfPoint;

	Point center = new Point((maxWidth + minWidth) / 2, (maxHeight + minHeight) / 2);
	
	Integer radius = null;
	
	if ((maxWidth - center.x) > (maxHeight - center.y))
	{
		radius = maxHeight - center.y;
	}
	else
	{
		radius = maxWidth - center.x;
	}
	
	List<Point> points = new ArrayList<Point>();
	
	for (int i = 0; i < numberOfPoint; i++)
	{
		Double x = center.x + (radius * Math.cos(i * angleAlfa));
		Double y = center.y + (radius * Math.sin(i * angleAlfa));
		
		points.add(new Point(x.intValue(), y.intValue()));
	}
	
	return points;
}

Komentáre

Obľúbené príspevky z tohto blogu

Ako previesť .mp3 súbor do .wav v Linuxe

Počas Vianočných sviatkov som skúmal ako previesť pesničky ktoré mám v počítači vo formáte MP3 do formátu audio CD ktorý by bez problémov načítala aj moja postaršia veža. Samozrejme našiel som veľa spôsobov avšak asi najjednoduchším bol veľmi jednoduchý shell skript. Inštalácia je veľmi jednoduchá: # Ubuntu sudo apt-get install mpg123 # Fedora yum install mpg123 Používať tento shell skript sa dá dvoma spôsobmi. Buď budete prevádzať každý MP3 súbor samostatne pomocou tohto príkazu: mpg123 -w vystup.wav vstup.mp3 Alebo využijete jednoduchú funkciu ktorú vložíte do súboru .bashrc v vašom koreňovom adresári. mp3towav(){      [[ $# -eq 0 ]] && { echo "mp3wav mp3file"; exit 1; }      for i in "$@"      do           # create .wav file name           local out="${i%/*}.wav"           [[ -f "$i" ]] && { echo -n "Processing ${i}..."; mpg123 -w ...

MathJax: Vkladanie matematických vzorcov na stránku

Asi 2 roky dozadu som tu písal o jazyku MathML. Jedná sa o jazyk z rodiny XML ktorý nám umožňuje vkladať na web matematické vzorce. Tento jazyk má však jednu nevýhodu a to, že aj na zapísanie jednoduchého a relatívne malého vzorca musíme napísať veľa neprehľadných riadkov. Tento problém zdá sa rieši MathJax . MathJax taktiež vkladá do stránky matematické vzorce ale dokáže ich vyrenderovať aj napríklad zo syntaxe ktorú používa LaTeX či AsciiMath a ta je oveľa kratšia a čitateľnejšia ako MathML. Použitie si ukážeme na jednoduchom zápise kvadratickej rovnice a vzorca slúžiaceho na jej výpočet. Ak $a \ne 0$, potom \(ax^2 + bx + c = 0\) má práve 2 korene ktoré vypočítame nasledovne: $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$ Použitie LaTeX-u <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>MathJax LaTeX Test</title> <script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {in...

Ako zrušiť odskok prvého riadku v LaTeXe

Dnes som riešil problém ktorý som si myslel, že nebude žiadnym problémom ale opak bol pravdou. Potreboval som aby mi pri jednoduchom LaTeX -ovom dokumente automaticky neodsadzovalo prvý riadok odstavca. Asi po hodinke hľadania som na to prišiel a naozaj to bolo veľmi jednoduché. Do hlavičky dokumentu stačilo napísať tento riadok: \setlength{\parindent}{0in} Toto však vytvorilo jeden problém s ktorým som nepočítal. Odstavce sú spolu a bez odsadenia prvého riadku čo znamená, že text je dosť neprehľadný. Potreboval som teda vyriešiť ďalší problém a to ako pred alebo za odstavec vložiť nejakú medzeru. Riešenie bolo opäť veľmi jednoduché. \setlength{\parskip}{5mm}