Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #20126 > unrolled thread
| Started by | "leonardo.1+++" <leonardo.1@fastwebnet.it> |
|---|---|
| First post | 2015-12-11 18:37 +0100 |
| Last post | 2015-12-14 20:33 +0000 |
| Articles | 9 — 3 participants |
Back to article view | Back to it.comp.www.php
Calcolo della posizione dei punti in un cerchio "leonardo.1+++" <leonardo.1@fastwebnet.it> - 2015-12-11 18:37 +0100
Re: Calcolo della posizione dei punti in un cerchio Alessandro Pellizzari <shuriken@amiran.it> - 2015-12-12 08:58 +0000
Re: Calcolo della posizione dei punti in un cerchio "leonardo.1+++" <leonardo.1@fastwebnet.it> - 2015-12-13 19:54 +0100
Re: Calcolo della posizione dei punti in un cerchio Leonardo Serni <lserni@gmail.com> - 2015-12-13 20:02 +0100
Re: Calcolo della posizione dei punti in un cerchio Leonardo Serni <lserni@gmail.com> - 2015-12-13 20:03 +0100
Re: Calcolo della posizione dei punti in un cerchio Alessandro Pellizzari <shuriken@amiran.it> - 2015-12-13 19:14 +0000
Re: Calcolo della posizione dei punti in un cerchio Leonardo Serni <lserni@gmail.com> - 2015-12-14 00:56 +0100
Re: Calcolo della posizione dei punti in un cerchio "leonardo.1+++" <leonardo.1@fastwebnet.it> - 2015-12-14 11:18 +0100
Re: Calcolo della posizione dei punti in un cerchio Alessandro Pellizzari <shuriken@amiran.it> - 2015-12-14 20:33 +0000
| From | "leonardo.1+++" <leonardo.1@fastwebnet.it> |
|---|---|
| Date | 2015-12-11 18:37 +0100 |
| Subject | Calcolo della posizione dei punti in un cerchio |
| Message-ID | <eRDay.37561$pt.35065@tornado.fastwebnet.it> |
Come da oggetto avrei questa necessità
Ho trovato questi 2 script, qui;
http://stackoverflow.com/questions/5300938/calculating-the-position-of-points-in-a-circle
ma non riesco a farli funzionare, qualcuno mi può dare una mano?
Questa è la function da chiamare per i caolcoli
<?php
function drawCirclePoints($points, $radius, $center){
$pointarray = array();
$slice = (2*pi())/$points;
for($i=0;$i<$points;$i++){
$angle = $slice*$i;
$newx = (int)(($center->getX() + $radius) * cos($angle));
$newy = (int)(($center->getY() + $radius) * sin($angle));
$point = new point();
$point->setX($newx);
$point->setY($newy);
array_push($pointarray,$point);
}
return $pointarray;
}
?>
è questa la classe da utilizzare per i punti trovati
<?php
class point{
private $x = 0;
private $y = 0;
public function setX($xpos){
$this->x = $xpos;
}
public function setY($ypos){
$this->y = $ypos;
}
public function getX(){
return $this->x;
}
public function getY(){
return $this->y;
}
public function printX(){
echo $this->x;
}
public function printY(){
echo $this->y;
}
}
?>
Ringrazio chi vorrà mettermi sulla strada giusta
Leonardo
--
Non sono su facebook
Se anche tu vuoi cancellarti
http://www.giardiniblog.com/come-cancellarsi-da-facebook-eliminare-account/
[toc] | [next] | [standalone]
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2015-12-12 08:58 +0000 |
| Message-ID | <dd25uiFj6fdU1@mid.individual.net> |
| In reply to | #20126 |
Il Fri, 11 Dec 2015 18:37:10 +0100, leonardo.1+++ ha scritto:
> Come da oggetto avrei questa necessità Ho trovato questi 2 script, qui;
> http://stackoverflow.com/questions/5300938/calculating-the-position-of-
points-in-a-circle
> ma non riesco a farli funzionare, qualcuno mi può dare una mano?
Se non ci dici cosa esattamente stai cercando di fare ("trovare punti su
una circonferenza" non è molto chiaro) e soprattutto quali errori ti dia,
è impossibile risponderti.
La risposta di fmassei l'hai vista?
Bye.
[toc] | [prev] | [next] | [standalone]
| From | "leonardo.1+++" <leonardo.1@fastwebnet.it> |
|---|---|
| Date | 2015-12-13 19:54 +0100 |
| Message-ID | <U9jby.37645$pt.14297@tornado.fastwebnet.it> |
| In reply to | #20127 |
Il 12/12/2015 09:58, Alessandro Pellizzari ha scritto:
> Il Fri, 11 Dec 2015 18:37:10 +0100, leonardo.1+++ ha scritto:
>
>> Come da oggetto avrei questa necessità Ho trovato questi 2 script, qui;
>> http://stackoverflow.com/questions/5300938/calculating-the-position-of-
> points-in-a-circle
>> ma non riesco a farli funzionare, qualcuno mi può dare una mano?
>
> Se non ci dici cosa esattamente stai cercando di fare ("trovare punti su
> una circonferenza" non è molto chiaro) e soprattutto quali errori ti dia,
> è impossibile risponderti.
>
> La risposta di fmassei l'hai vista?
>
> Bye.
>
Questo è il problema che tento di risolvere:
Su di un piano cartesiano di 500x500 origine x,y è in alto a sn.
Sul piano è disegnata una circonferenza con centro x=250, y=250 e
raggio=150.
La circonferenza è divisa in 6 archi con angoli 20,40,82,58,85,75.
Arco 1 ha origine ad ore 3, proseguono gli altri in senso orario.
Quali sono, sul p.cartesiano, punti x,y inizio (o finale) ogni arco?
Come probabilmente avrai notato la somma degli angoli è 360, ma questo è
irrilevante perché deve funzionare indipendentemente dalla quantità
degli archi e del valore degli angoli in quanto deve servire a creare
una legenda introno ad un diagramma circolare.
(ad es. la percentuale di ciascun valore rappresentata da uno spicchio)
è un problema di trigonometria, puoi darmi una dritta?
Saluti
Leonardo
--
Non sono su facebook
Se anche tu vuoi cancellarti
http://www.giardiniblog.com/come-cancellarsi-da-facebook-eliminare-account/
[toc] | [prev] | [next] | [standalone]
| From | Leonardo Serni <lserni@gmail.com> |
|---|---|
| Date | 2015-12-13 20:02 +0100 |
| Message-ID | <n0gr6b17v3e5je9060v2eago4b93ll778s@L.Serni> |
| In reply to | #20134 |
On Sun, 13 Dec 2015 19:54:39 +0100, "leonardo.1+++" <leonardo.1@fastwebnet.it> wrote: >Su di un piano cartesiano di 500x500 origine x,y è in alto a sn. >Sul piano è disegnata una circonferenza con centro x=250, y=250 e >raggio=150. >Quali sono, sul p.cartesiano, punti x,y inizio (o finale) ogni arco? X = 250 + 150 * COS(a), Y = 250 + 150 * SIN(a), dove a = arco in radianti. Siccome la circonferenza è 2*PI radianti, se hai N archi uguali ogni arco è largo (2*PI/N), per cui l'arco i-esimo inizia a a = 2*PI*i/N; X = 250 + 150 * COS(a); Y = 250 + 150 * SIN(a); Leonardo -- Now suppose -just suppose- I could show you a way to manufacture a wall that would do the same job... but was only one inch thick.
[toc] | [prev] | [next] | [standalone]
| From | Leonardo Serni <lserni@gmail.com> |
|---|---|
| Date | 2015-12-13 20:03 +0100 |
| Message-ID | <q5gr6blt8jboi639fvu8bvsqvpnck79r9p@L.Serni> |
| In reply to | #20136 |
On Sun, 13 Dec 2015 20:02:00 +0100, Leonardo Serni <lserni@gmail.com> wrote: >X = 250 + 150 * COS(a), >Y = 250 + 150 * SIN(a), ...quanto sopra supponendo che COS e SIN vogliano l'argomento in radianti. Ci sta che lo vogliano in gradi. In quel caso semplicemente al posto di 2*PI metti 360. Leonardo -- Now suppose -just suppose- I could show you a way to manufacture a wall that would do the same job... but was only one inch thick.
[toc] | [prev] | [next] | [standalone]
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2015-12-13 19:14 +0000 |
| Message-ID | <dd5ud9Fhg2jU2@mid.individual.net> |
| In reply to | #20134 |
Il Sun, 13 Dec 2015 19:54:39 +0100, leonardo.1+++ ha scritto: > Questo è il problema che tento di risolvere: OK, molto più comprensibile. :) > Su di un piano cartesiano di 500x500 origine x,y è in alto a sn. > Sul piano è disegnata una circonferenza con centro x=250, y=250 e > raggio=150. > La circonferenza è divisa in 6 archi con angoli 20,40,82,58,85,75. > Arco 1 ha origine ad ore 3, proseguono gli altri in senso orario. > Quali sono, sul p.cartesiano, punti x,y inizio (o finale) ogni arco? Allora, il tuo primo problema è che le funzioni sin e cos prendono radianti e non gradi, quindi devi convertirli con deg2rad() o con la formula che ti ha dato fmassei ($angolo * pi() / 180.0). Il secondo problema è che in trigonometria il cerchio va in senso antiorario, mentre a te serve in senso orario, quindi devi fare $angoloTuo = 360 - $angolo; Il terzo problema è che in geometria il piano parte dal basso a sinistra, mentre su schermo in alto a destra, quindi dovrai invertire la coordinata y: $y = $height - sin(blabla); Vedi se con queste riesci ad avvicinarti alla soluzione. Io, che non amo particolarmente la trigonometria, ho bestemmiato per un paio di giorni quando l'ho dovuto fare. :D Bye.
[toc] | [prev] | [next] | [standalone]
| From | Leonardo Serni <lserni@gmail.com> |
|---|---|
| Date | 2015-12-14 00:56 +0100 |
| Message-ID | <s91s6btg1agba41fkb985kprvqjofghqug@L.Serni> |
| In reply to | #20139 |
On 13 Dec 2015 19:14:49 GMT, Alessandro Pellizzari <shuriken@amiran.it> wrote: >> Su di un piano cartesiano di 500x500 origine x,y è in alto a sn. >Il secondo problema è che in trigonometria il cerchio va in senso >antiorario, mentre a te serve in senso orario, No, se ho capito bene l'asse Y è invertito rispetto al piano cartesiano, quindi va bene così: le due inversioni si annullano. Spero :-D Leonardo -- Now suppose -just suppose- I could show you a way to manufacture a wall that would do the same job... but was only one inch thick.
[toc] | [prev] | [next] | [standalone]
| From | "leonardo.1+++" <leonardo.1@fastwebnet.it> |
|---|---|
| Date | 2015-12-14 11:18 +0100 |
| Message-ID | <_Hwby.37668$pt.24961@tornado.fastwebnet.it> |
| In reply to | #20139 |
Il 13/12/2015 20:14, Alessandro Pellizzari ha scritto:
> Il Sun, 13 Dec 2015 19:54:39 +0100, leonardo.1+++ ha scritto:
>
>> Questo è il problema che tento di risolvere:
>
> OK, molto più comprensibile. :)
>
>> Su di un piano cartesiano di 500x500 origine x,y è in alto a sn.
>> Sul piano è disegnata una circonferenza con centro x=250, y=250 e
>> raggio=150.
>> La circonferenza è divisa in 6 archi con angoli 20,40,82,58,85,75.
>> Arco 1 ha origine ad ore 3, proseguono gli altri in senso orario.
>> Quali sono, sul p.cartesiano, punti x,y inizio (o finale) ogni arco?
>
> Allora, il tuo primo problema è che le funzioni sin e cos prendono radianti
> e non gradi, quindi devi convertirli con deg2rad() o con la formula che ti
> ha dato fmassei ($angolo * pi() / 180.0).
>
> Il secondo problema è che in trigonometria il cerchio va in senso
> antiorario, mentre a te serve in senso orario, quindi devi fare
>
> $angoloTuo = 360 - $angolo;
>
> Il terzo problema è che in geometria il piano parte dal basso a sinistra,
> mentre su schermo in alto a destra, quindi dovrai invertire la coordinata
> y:
>
> $y = $height - sin(blabla);
>
> Vedi se con queste riesci ad avvicinarti alla soluzione.
>
> Io, che non amo particolarmente la trigonometria, ho bestemmiato per un
> paio di giorni quando l'ho dovuto fare. :D
>
> Bye.
>
Ti ringrazio, come sempre il tuo contributo è stato importantissimo.
Di seguito quello che ho scritto, spero serva anche ad altri.
Per vederlo devi fare in modo che lo script trovi:
// Tipo di carattere
$Font = "font/arial.ttf";
Cambiando il valore nella variabile:
$InizioArco=0;//zero corrisponde ore 3
Il primo arco inizia dove voglio e tutto si adegua di conseguenza.
Inoltre ho fatto in modo che gli spicchi possano essere "estratti";
è gradito un tuo parere, anche sul metodo di allocare i colori.
Sto cercando di scrivere una funzione che ne allochi quanto necessari
alla quantità dei valori. Il problema è che devono essere tutti
ragionevolmente diversi ed i contigui avere tonalità contrastanti.
<?php
$L = 700; $A = $L;
$Imma = imagecreate($L, $A);
imagecolorallocate($Imma, 150, 150, 150); // sfondo
$Raggio = 300;
$Nome = array('A','B','C','D','E','F'); // nome dei settori
$Valore = array (31,29,23,19,17,13); // valore dei settori
$Totale = array_sum($Valore); // totale valore rappresentato
$Colore = array();
$Colore[0] = imagecolorallocate($Imma, 255,0,0);
$Colore[1] = imagecolorallocate($Imma, 0,255,0);
$Colore[2] = imagecolorallocate($Imma, 0,0,255);
$Colore[3] = imagecolorallocate($Imma, 255,255,0);
$Colore[4] = imagecolorallocate($Imma, 255,0,255);
$Colore[5] = imagecolorallocate($Imma, 0,255,255);
$Cx = $L/2; // centro x
$Cy = $A/2; // centro y
$InizioArco = 0; // valore in gradi inizio primo arco, zero corrisponde
a ore 3
// Tipo di carattere
$Font = "font/arial.ttf";
// scorre array $Valore e $Colore, disegnando gli archi
foreach($Valore as $index => $V ) {
// dimensioni angolo/arco corrente
$Arco = number_format((360 * $V) / $Totale);
// percentuale sul totale del valore corrente
$Percentuale = number_format(($V * 100) / $Totale, 2, '.', '');
// *** calcola X,Y sul piano ***
$VerticeArco = ($InizioArco + $Arco/2) + 90; //vertice arco
// seno e coseno in radianti
$sin = sin(deg2rad($VerticeArco)); $cos = cos(deg2rad($VerticeArco));
$RadX = round($cos*(0) - $sin*($Raggio * -1));//Vertice arco X su p.c.
$RadY = round($sin*(0) + $cos*($Raggio * -1));//Vertice arco Y su p.c.
$estr = 0;// scala della quantità estrazione spicchio
if($index == 1){$estr = .05;} // estrae II elemento di .05
if($Nome[$index] == 'D'){$estr = .1;} // estrae elemento D di .1
imagefilledarc($Imma, // diagramma circolare
$Cx + $RadX * $estr, $Cy + $RadY * $estr, //coordinate x,y del centro
$Raggio, $Raggio,
$InizioArco,
($InizioArco + $Arco), // fine arco
$Colore[$index], // colore corrente
IMG_ARC_PIE // area circoscritta è riempita con $Colore[$index]
);
$Linea = .8;// scala dimensioni linea
// segmento diagramma circolare/testo
imageline ($Imma,
$Cx + $RadX * $estr, $Cy + $RadY * $estr, // x,y inizio linea
$Cx + $RadX * $Linea, $Cy + $RadY * $Linea, // x,y fine linea
$Colore[$index]
);
// legenda circolare
$OrientamentoTesto = -20 * $sin; // orientamento testo
imagettftext($Imma,12,
$OrientamentoTesto,
$Cx + $RadX * $Linea, $Cy + $RadY* $Linea,
$Colore[$index],
$Font,
$Nome[$index].":$V:".$Percentuale."%"
);
$InizioArco += $Arco; // inizio nuovo arco
}
header("Content-Type: image/png");
imagepng($Imma); // al browser
imagedestroy($Imma); // libera memoria
?>
Saluti
Leonardo
--
Non sono su facebook
Se anche tu vuoi cancellarti
http://www.giardiniblog.com/come-cancellarsi-da-facebook-eliminare-account/
[toc] | [prev] | [next] | [standalone]
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2015-12-14 20:33 +0000 |
| Message-ID | <dd8nd4F8jsfU1@mid.individual.net> |
| In reply to | #20144 |
Il Mon, 14 Dec 2015 11:18:30 +0100, leonardo.1+++ ha scritto: > è gradito un tuo parere, anche sul metodo di allocare i colori. > Sto cercando di scrivere una funzione che ne allochi quanto necessari > alla quantità dei valori. Il problema è che devono essere tutti > ragionevolmente diversi ed i contigui avere tonalità contrastanti. È un problema abbastanza comune. Per esempio d3.js usa un algoritmo simile per allocare colori per i grafici. Ho trovato questo su stackoverflow: http://stackoverflow.com/a/4382138 nella risposta trovi un link a questo: http://alumni.media.mit.edu/~wad/color/palette.html Se ti servono meno di 15 colori è un'ottima base, altrimenti puoi provare a convertire uno degli algoritmi proposti (la maggior parte delle formule matematiche sono comuni a tutti i linguaggi). Bye.
[toc] | [prev] | [standalone]
Back to top | Article view | it.comp.www.php
csiph-web