2015-04-29 31 views
9

Sto lavorando con lo jpgraph e creando il grafico del radar.Riempi il colore del gradiente nel mio poligono di forma personalizzata jpgraph

Affrontare il problema con il riempimento di poligono di forma personalizzata con sfumatura di colore.

Ho la funzione per riempire un poligono di colore sfumato con un fondo piatto e voglio riempire il colore sfumato nel mio poligono di forma personalizzata. Qualcuno può aiutarmi? Come posso fare questo?

Corrente di uscita:

enter image description here

output desiderato:

enter image description here

È possibile trovare la classe gradiente a qui.

http://code.google.com/r/linksoftafrica-maison-george/source/browse/libs/jpgraph/jpgraph_gradient.php

// Fill a special case of a polygon with a flat bottom 
// with a gradient. Can be used for filled line plots. 
// Please note that this is NOT a generic gradient polygon fill 
// routine. It assumes that the bottom is flat (like a drawing 
// of a mountain) 
function FilledFlatPolygon($pts,$from_color,$to_color) { 
    if(count($pts) == 0) return; 

    $maxy=$pts[1]; 
    $miny=$pts[1];   
    $n = count($pts) ; 
    for($i=0, $idx=0; $i < $n; $i += 2) { 
     $x = round($pts[$i]); 
     $y = round($pts[$i+1]); 
     $miny = min($miny,$y); 
     $maxy = max($maxy,$y); 
    } 

    $colors = array(); 
    $this->GetColArray($from_color,$to_color,abs($maxy-$miny)+1,$colors,$this->numcolors); 
    for($i=$miny, $idx=0; $i <= $maxy; ++$i) { 
     $colmap[$i] = $colors[$idx++]; 
    } 

    $n = count($pts)/2 ; 
    $idx = 0 ; 
    while($idx < $n-1) { 
     $p1 = array(round($pts[$idx*2]),round($pts[$idx*2+1])); 
     $p2 = array(round($pts[++$idx*2]),round($pts[$idx*2+1])); 

     // Find the largest rectangle we can fill 
     $y = max($p1[1],$p2[1]) ; 
     for($yy=$maxy; $yy > $y; --$yy) { 
      $this->img->current_color = $colmap[$yy]; 
      $this->img->Line($p1[0],$yy,$p2[0]-1,$yy); 
     } 

     if($p1[1] == $p2[1]) continue; 

     // Fill the rest using lines (slow...) 
     $slope = ($p2[0]-$p1[0])/($p1[1]-$p2[1]); 
     $x1 = $p1[0]; 
     $x2 = $p2[0]-1; 
     $start = $y; 
     if($p1[1] > $p2[1]) { 
      while($y >= $p2[1]) { 
       $x1=$slope*($start-$y)+$p1[0]; 
       $this->img->current_color = $colmap[$y]; 
       $this->img->Line($x1,$y,$x2,$y); 
       --$y; 
      } 
     } 
     else { 
      while($y >= $p1[1]) { 
       $x2=$p2[0]+$slope*($start-$y); 
       $this->img->current_color = $colmap[$y]; 
       $this->img->Line($x1,$y,$x2,$y); 
       --$y; 
      } 
     } 
    } 
} 
+0

È possibile fornire il codice in modo che possa essere riprodotto. – spenibus

risposta

1

mi sembra che il codice attuale non è adatto per questo compito. Hai bisogno del codice per i triangoli ombreggiati di Gouraud (poligoni a 3 lati).

Quando si dispone del codice per questo, si disegnano semplicemente tre triangoli in cui sul punto del triangolo si trova al centro del grafico e due punti si trovano sugli assi del radar.

Sfortunatamente, non ho trovato il codice pronto per jpgraph.