Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #20126 > unrolled thread

Calcolo della posizione dei punti in un cerchio

Started by"leonardo.1+++" <leonardo.1@fastwebnet.it>
First post2015-12-11 18:37 +0100
Last post2015-12-14 20:33 +0000
Articles 9 — 3 participants

Back to article view | Back to it.comp.www.php


Contents

  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

#20126 — Calcolo della posizione dei punti in un cerchio

From"leonardo.1+++" <leonardo.1@fastwebnet.it>
Date2015-12-11 18:37 +0100
SubjectCalcolo 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]


#20127

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2015-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]


#20134

From"leonardo.1+++" <leonardo.1@fastwebnet.it>
Date2015-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]


#20136

FromLeonardo Serni <lserni@gmail.com>
Date2015-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]


#20137

FromLeonardo Serni <lserni@gmail.com>
Date2015-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]


#20139

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2015-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]


#20143

FromLeonardo Serni <lserni@gmail.com>
Date2015-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]


#20144

From"leonardo.1+++" <leonardo.1@fastwebnet.it>
Date2015-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]


#20145

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2015-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