Předvánoční slevová akce PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26. listopadu 13:29

Potreboval bych sikovny algoritmus, ktery mi bude generovat postupne 3 nebo 2 hodnoty pro rovnomerne umistovani podel kola. (zkousim takovy experiment pro jine tema, rozmistovani lopatek ventilatoru)
Idealne v JS. Budu zkouset sam, ale kdyby mel nekdo jednodussi variantu nez mne napada, bylo by to fajn.

Zkusil jsem: Ma predstava je, napr
2 = 2
4 = 2 + 2
5 = 3 + 2
18 = 3 + 3 + 3 + 3 + 3 + 3

Koncovky lze ziskat takto (% je modulo, celociselne deleni, zbytek po deleni):
if ((max-4) % 3 == 0)
if ((max-2) % 3 == 0)
if ((max-0) % 3 == 0)

Jde mi o to, ze bych rozmistoval podel kola v pravidelnych intervalech, vzdy jen 2 nebo 3 hodnoty. Postupne pridaval do zaplneni. Ale, mozna, ze uz od zacatku uvazuji spatne :) Nebo je uvaha dobra, ale v programu to mam spatne. Naplnil jsem kolo nejmensi hodnotou a pak prepisuji. Mozna to bude treba spis doplnovat.

\.../
  |

\.|./
/ | \

\.|.//
// | \\

Zkratka, postupne pridavat.
Asi na to jdu fakt spatne. Mam jiny pokus, kdy kolo narusta s pridavanim po jedne. Nebo, kde mam cele kolo min vahu a postupne prepisuji. Tohle by melo byt podobne tem predchozim, ale caroval bych prave s rovnomernym rozmistovanim do trojuhelniku, ctverce nebo linie.

Jenom to zatim nemam moc promyslene :)

Chci docílit: .

 
Odpovědět
26. listopadu 13:29
Avatar
Jirka Jr
Člen
Avatar
Jirka Jr:26. listopadu 23:45

sorry, poslano nize jako odpoved ;-)

Editováno 26. listopadu 23:46
 
Nahoru Odpovědět
26. listopadu 23:45
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Peter Mlich
Jirka Jr:26. listopadu 23:47

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>
 
Nahoru Odpovědět
26. listopadu 23:47
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Peter Mlich
Jirka Jr:26. listopadu 23:55

jo, ted koukam, ze jsem strelil vedle :-D ty to chces v asciiartu a ne v grafice

 
Nahoru Odpovědět
26. listopadu 23:55
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Jirka Jr
Peter Mlich:28. listopadu 7:42

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.

  • seradim hmotnosti podle velikosti od nejvetsi
  • rozdelim hmotnosti na skupinky 3, 3, ... 2, 2 (3 volim zamerne, protoze je to nejmensi mozna skupinka, kde se da ziskat jakasi manipulace s tezistem, snizeni vzdalenosti od stredu kola)
  • A) pokud tam jsou nejake skupiny dvojky, tak je musim umistit asi jako prvni, ale asi pouziji ty nejmensi hmotnosti. (to jeste nevim, co s tim, nastesti testovaci sada hmotnosti ma pocet 18, coz je delitelne 3). B) Ale mozna to necham na konec a nejspis mi to ale rozhodi teziste. C) A nebo to rozmistim jako prvni, jako 2+2 nebo 2+3 dohromady
  • skupiny trojky nejspis jeste zkusim seradit podle teziste, nejhorsi na zacatek
  • a ted potrebuji ty ostatni rozmistit tak, aby tvorili hvezdici. A zajima mne prave algoritmus, ktery mi vrati 3 volne pozice do hvezdice a nebo, co nejvice do hvezdice (coz nevim, jak pujde v pripade obsazenych prvnich pozic 2+2 a 2+3). Pozice vypocitane mam pomoci sinu, cos. Spis mne zajimaji indexy pole. Ja to nejak udelam. Jenom, kdyby se nekomu chtelo tim zabyvat. Cili, mam hotove funkce na generovani pole. Spis potrebuji zpetne ziskat inddexy, kde v tom poli prepsat hmotnosti.

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;
        }
Editováno 28. listopadu 7:43
 
Nahoru Odpovědět
28. listopadu 7:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:28. listopadu 7:53
  • vypocitam polohy pro n lopatek
  • pripisu hmotnosti ze seznamu hmotnosti (pole)
  • vypocitam teziste

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.

 
Nahoru Odpovědět
28. listopadu 7:53
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Peter Mlich
Jirka Jr:28. listopadu 22:37

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

  1. mel delky lopatek podle hmotnosti
  2. měl jistotu, ze graf nikdy nevylitne z viditelne oblasti canvasu a vzdy bude v ramci zadaneho polomeru kruznice

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 :-)

 
Nahoru Odpovědět
28. listopadu 22:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.