|
できたー! さっきに比べてめっちゃ簡単やないか... なんでこっちを先に思いつかなかったんだろ orz これでDashStyleみたいにパターンで長方形を描けばいけそう!わーい!
<?php
//////////////////////////////////////////////////// // 点(x, y) を、点 (cx, cy) を中心に、rad ラジアンだけ // 回転させた座標 (tx, ty) させ、x方向にdx、y方向にdy // だけ平行移動させる関数 //////////////////////////////////////////////////// function rotate_move($cx, $cy, $rad, $x, $y, $dx, $dy, &$tx, &$ty) { $tx = $cx + $dx + ($x - $cx) * cos($rad) - ($y - $cy) * sin($rad); $ty = $cy + $dy - ($x - $cx) * sin($rad) + ($y - $cy) * sin($rad); }
//////////////////////////////////////////////////// // 600 * 480 の長方形の画像に、(100, 100) から (499, 379) // を結ぶ直線を引く //////////////////////////////////////////////////// $w = 600; $h = 480; $x0 = 100; $y0 = 100; // 始点の座標 $x1 = 499; $y1 = 379; // 終点の座標 $image = imagecreatetruecolor($w, $h); $blue = imagecolorallocate($image, 128, 128, 255); $red = imagecolorallocate($image, 255, 0, 0); imagefill($image, 0, 0, $blue);
//////////////////////////////////////////////////// // 座標から線の長さを求めとく //////////////////////////////////////////////////// $xlen = $x1 - $x0; $ylen = $y0 - $y1; $lineLen = sqrt($xlen * $xlen + $ylen * $ylen);
//////////////////////////////////////////////////// // 回転の角度 //////////////////////////////////////////////////// $t = $ylen / $xlen; // 垂直な線は書けない $rad = atan($t);
//////////////////////////////////////////////////// // 細長い長方形を座標変換して imagefillpolygon する。 // 今回は簡略化のために、破線等ではなく実線にする。 //////////////////////////////////////////////////// $thick = 3;
// 座標を変換 $tx0; $ty0; $tx1; $ty1; $tx2; $ty2; $tx3; $ty3; $cx = 0; $cy = $thick / 2; rotate_move($cx, $cy, $rad, 0, 0, $x0, $y0, $tx0, $ty0); rotate_move($cx, $cy, $rad, $lineLen, 0, $x0, $y0, $tx1, $ty1); rotate_move($cx, $cy, $rad, $lineLen, $thick, $x0, $y0, $tx2, $ty2); rotate_move($cx, $cy, $rad, 0, $thick, $x0, $y0, $tx3, $ty3); $points = array($tx0, $ty0, $tx1, $ty1, $tx2, $ty2, $tx3, $ty3);
$num_points = 4; $r = 0; $g = 0; $b = 0; // ペンの色(とりあえず黒で $penColor = imagecolorallocate($image, $r, $g, $b); imagefilledpolygon($image, $points, $num_points, $penColor); imageline($image, $x0, $y0, $x1, $y1, $red);
header("Content-type: image/png"); imagepng($image); imagedestroy($image);
?>
|