0

私は取得パラメータとして角度を取り、その角度で円のセグメントを出力するこのphpプログラムを持っています:

<?php
$size = 600;
$img = imagecreatetruecolor($size, $size);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);

imagefilledrectangle($img,0,0,$size,$size,$white);

function Vector($palette,$startx,$starty,$angle,$length,$colour){
    $angle = deg2rad($angle);
    $endx = $startx+cos($angle)*$length;
    $endy = $starty-sin($angle)*$length;
    return(imageline($palette,$startx,$starty,$endx,$endy,$colour));
}

$ang = 0;
while($ang <= $_GET['angle']){
Vector($img,$size/2,$size/2,$ang,200,$black);
$ang += 1;
}


header("Content-type: image/png");
imagepng($img);

?>

関数ベクトルは基本的に、指定されたパラメーターで線を描画します。したがって、何度もループし、ループするたびに角度を1ずつ増やします。次に、基本的に指定された角度で一種の円セグメントを描画するベクトル関数を呼び出します。

しかし、前の円の終点から始まる円の別のセクターを描画したい場合、それは重なります! ちなみにコードはこんな感じ。

<?php
$size = 600;
$img = imagecreatetruecolor($size, $size);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
$blue = imagecolorallocate($img, 0, 0, 255);

imagefilledrectangle($img,0,0,$size,$size,$white);

function Vector($palette,$startx,$starty,$angle,$length,$colour){
    $angle = deg2rad($angle);
    $endx = $startx+cos($angle)*$length;
    $endy = $starty-sin($angle)*$length;
    return(imageline($palette,$startx,$starty,$endx,$endy,$colour));
}

$int = 0;
while($int <= $_GET['angle']){
Vector($img,$size/2,$size/2,$int,200,$black);
$int += 0.01;
}

$int = 0;
while($int <= $_GET['angle']){
Vector($img,$size/2,$size/2,$int,200,$blue);
$int += 0.01;
}


header("Content-type: image/png");
imagepng($img);

?>

上記のコードでは、ある角度で円セクターを描画し、同じ角度で青色の別のセクターを描画することを期待しています。

最初のセクターが終了したところから 2 番目のセクターを開始したいのですが、重複していますか?

では、前のものが停止した場所から開始するにはどうすればよいですか?

4

2 に答える 2

1

ある角度のベクトルを描く機能があるということですね。次に、ループを 360 回行い、ループごとに角度を 1 度増やしてベクトルを描画します。サークルができます。

円グラフの場合、セグメントの角度に応じて特定の間隔で色を変更するだけです...

投票システムで作業している場合、これは PHP 画像ジェネレーターの完全なソース コードです。これは、nいくつかの QueryString 引数を受け取り、それらすべての QueryString 引数を含む円グラフを作成し、それらの凡例を挿入します。

<?php
$size = 600;
$img = imagecreatetruecolor($size, $size);

$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);

imagefilledrectangle($img,0,0,$size,$size,$white);

function Vector($palette,$startx,$starty,$angle,$length,$colour){
    $angle = deg2rad($angle);
    $endx = $startx+cos($angle)*$length;
    $endy = $starty-sin($angle)*$length;
    return(imageline($palette,$startx,$starty,$endx,$endy,$colour));
}

$sum__ = array_sum($_GET);
$items = array();
foreach($_GET as $key => $value){
$items[$key] = ($value/$sum__)*360;
}

$items2 = array();

$cur = 0;
foreach($items as $key => $value){
$cur += $value;
$items2[$key]=$cur;
}

$colors = array();
foreach($items as $key => $value){
while(array_key_exists($key,$colors) == False){
$tempcolor = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
if(in_array($tempcolor,$colors) == False){
$colors[$key] = $tempcolor;
}
}
}

$int = 0;
foreach($items2 as $key => $value){
while($int <= $value){
Vector($img,$size/2,$size/2,$int,200,$colors[$key]);
$int += 0.01;
}
}

$container = 10;
foreach($items2 as $key => $value){
imagefilledrectangle($img, 4, $container, 50, $container+15, $colors[$key]);
imagestring($img,5,4+60,$container,$key,$black);
$container += 20;
}

header("Content-type: image/png");
imagepng($img);

?>

それが役立つことを願っています...

于 2013-08-14T01:24:52.403 に答える
0

参考までに、元のコードの 2 行を変更するだけで、やりたいことを実行できます。2 番目の行を削除$int = 0;し、次の行を次のように変更します。

$int = 0;
while($int <= $_GET['angle']){
Vector($img,$size/2,$size/2,$int,200,$blue);
$int += 0.01;
}

なる:

//delete '$int = 0;'
while($int <= ($_GET['angle']) * 2){
Vector($img,$size/2,$size/2,$int,200,$blue);
$int += 0.01;
}

これは一般的な解決策ではありませんが、最初に間違っていたことを確認できるようになることを願っています。

于 2013-08-14T01:43:25.690 に答える