Diskuze: algoritmus rozmistovani po obvodu kola

Člen

Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
a co pouzit analytickou geometrii a kreslit javascriptem v prohlizeci na <canvas>?
tedy jestli jsem spravne pochopil, o co ti jde ...
x = xs + r * cos(alfa)
y = ys + r * sin(alfa)
kde:
[xs, ys] jsou souradnice stredu kruznice
r je polomer kruznice
alfa je uhel (v radianech) rotace daneho bodu kruznice kolem stredu kruznice ve
vzdalenosti r
a vysledkem dvou vzorcu vyse je bod [x,y] na kruznici
staci plny uhel ( 360° ve stupních nebo v našem případě v radiánech v javascriptu 2*Math.PI) podělit počtem lopatek a máš úhel, o který se po kružnici pohneš před vykreslením každé lopatky
tedy pro napr 8 lopatek ti nasledujici kod vykresli 8 usecek presne jako na obrazku v priloze
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Lopatky</title>
</head>
<body>
<canvas id="mujcanvas" width="200" height="200"></canvas>
<script>
var plopatek = 8; // pocet lopatek
var krok = (Math.PI*2)/plopatek;
var xs = 100; ys = 100; // souradnice stredu kruznice
var r = 50; // polomer kruznice
var alfa = 0; // aktualni uhel rotace
var canvas = document.getElementById('mujcanvas');
if (canvas.getContext)
{
var context = canvas.getContext('2d');
for(var i=0;i<plopatek;i++)
{
var x = xs + r * Math.cos(alfa);
var y = ys + r * Math.sin(alfa);
context.beginPath();
context.moveTo(xs,ys);
context.lineTo(x,y);
context.stroke();
alfa += krok;
}
}
</script>
</body>
</html>
jo, ted koukam, ze jsem strelil vedle ty to chces v asciiartu a ne v
grafice
Dik. Problem nespociva v kresleni, ale v umistovani lopatek do kola (to dal
nekdo do forka u c#, tusim a celkem mne to zaujalo), pole tak, aby celkove
teziste bylo uprostred.
Jen zkousim vykutit na to nejaky logicky algoritmus. Mam par reseni, ktera
nejsou prilis dobra. A jako nejlepsi zatim vychazi rozmistit to nahodne a pak
zkusit nahodne dve vzajemne propojit a prepocitat, zda je teziste lepcejsi.
To, co chci ted zkusit, a uz mam par napadu, kde delam chybu proti puvodnimu planu.
0: [x:1, y:0, m:-1, vz:-1]
1: [x:-1, y:0, m:-1, vz:-1] // v pripade dvou je to treba x = +-1, y = 0
...
app.func.lopatkaPoloha = function(lopatka, n, n_max)
{
var alfa;
alfa = n/(n_max) * 2 * Math.PI;
// lopatka.rad = alfa;
lopatka.n = n;
lopatka.x = Math.cos(alfa);
lopatka.y = Math.sin(alfa);
return lopatka;
}
Hmotnosti ale muzu zasat treba serazene podle velikosti za sebou na pozice 0, 1, 2, 3, ... nebo je rozmistovat jinak, jinym algoritmem, treba do hvezdice. V pripade 18 lopatek jsou to pozice 0-5-11, 2-8-14,... 2 je stred mezi 0 a 5 a pak se to cele komplikuje a nechtelo se mi premyslet. Takhle to je v pripade, ze mam 18 lopatek, 18 pozic. Ale mozna to budu resit postupnym doplnovanim, zacnu skolem jen se 3 pozicemi, pak pridam dalsi a s koncim s kolem s 18 pozicemi. to by asi mohlo jit lepe resit.
jenom bych asi spis dal
lopatka.x = n*(polomer/n_max)*Math.cos(alfa);
lopatka.y = n*(polomer/n_max)*Math.sin(alfa);
nez
lopatka.x = Math.cos(alfa);
lopatka.y = Math.sin(alfa);
abys
ale jestli uz to mas poresene nekde jinde, tak sorry
jinak problém vývahy samotné mi bude ještě trvat, než to celé pozřu a
mentálně zpracuju. zatím na to spíš koukám z uctivé vzdálenosti
Zobrazeno 7 zpráv z 7.