Newsgroup: it.comp.www.php
Titolo: Calcolo della posizione dei punti in un cerchio

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/
 

 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


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.

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.


 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.

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



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
?>


 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.