Линии и PHP

D
На сайте с 14.01.2007
Offline
153
462

дано: координаты изогнутой линии.

задача: нарисовать линию определённой толщины

стандартными средствами ПХП изменить толщину линии невозможно(?). есть imagesetthickness, но работает она по меньшей мере странно.

в результате пары часов интенсивного мозго**ства появилась эта функция lines2poly. в качестве параметров нужен массив с координатами линии, толщина линии и boolean, закруглять края или нет. в результате получаем массив с координатами полигона. может кому понадобится :)


function lines2poly( $coor, $buffer, $halb)
{
$tp = r(array_slice($coor,0,4), $buffer);
$tp2 = halbkreis(array_slice($coor,0,4), 1, $buffer);
if ( $halb == 0)
{
$start = array_slice($tp,0,4);
}
else
{
$start = array_merge( array_slice($tp, 0, 2), $tp2, array_slice($tp,2,2));
}
$tp = r(array_slice($coor,-4,4), $buffer);
$tp2 = halbkreis(array_slice($coor,-4,4), 2, $buffer);
if ( $halb == 0)
{
$mitte = array_slice($tp,-4,4);
}
else
{
$mitte = array_merge(array_slice($tp, -4, 2),$tp2, array_slice($tp, -2, 2));
}
$hin = array();
$back = array();
for ( $i=0; $i< count($coor)-5; $i+=2)
{

$tp = e(array_slice( $coor, $i, 6), $buffer);
$back = array_merge( $back, array_slice($tp,0,2));
$hin = array_merge( $hin, array_slice($tp,2,2));
}
$back = custom_reverse($back);

return array_merge($start, $hin, $mitte, $back);
}
function r( $c, $buffer)
{
$winkel = deg2rad(90-rad2deg(atan2(($c[3]-$c[1]),($c[2]-$c[0]))));

$nc[0]=$c[0]+cos($winkel)*$buffer;
$nc[1]=$c[1]-sin($winkel)*$buffer;
$nc[2]=$c[0]-cos($winkel)*$buffer;
$nc[3]=$c[1]+sin($winkel)*$buffer;

$nc[4]=$c[2]-cos($winkel)*$buffer;
$nc[5]=$c[3]+sin($winkel)*$buffer;
$nc[6]=$c[2]+cos($winkel)*$buffer;
$nc[7]=$c[3]-sin($winkel)*$buffer;
return $nc;
}
function e( $c, $buffer)
{
if ( ($c[2]-$c[0]) == 0)
{
$a1 = ($c[3]-$c[1])/($c[2]-$c[0]+1);
}
else
{
$a1 = ($c[3]-$c[1])/($c[2]-$c[0]);
}
if ( ($c[4]-$c[2]) == 0 )
{
$a2 = ($c[5]-$c[3])/($c[4]-$c[2]+1);
}
else
{
$a2 = ($c[5]-$c[3])/($c[4]-$c[2]);
}

$tp = r(array_slice($c,0,4), $buffer);
$p1 = array_splice($tp,0,2);

$tp = r(array_slice($c,2,4), $buffer);
$p2 = array_splice($tp,0,2);

$b1 = $p1[1]-$a1*$p1[0];
$b2 = $p2[1]-$a2*$p2[0];

if ( ($a1 - $a2) == 0 )
{
$x1 = $p1[0];
}
else
{
$x1 = ($b2 - $b1)/($a1 - $a2);
}
$y1 = $a1*$x1+$b1;

$tp = r(array_slice($c,0,4), $buffer);
$p1 = array_splice($tp,2,2);
$tp = r(array_slice($c,2,4), $buffer);
$p2 = array_splice($tp,2,2);

$b1 = $p1[1]-$a1*$p1[0];
$b2 = $p2[1]-$a2*$p2[0];

if ( ($a1 - $a2) == 0 )
{
$x2 = $p1[0];
}
else
{
$x2 = ($b2 - $b1)/($a1 - $a2);
}
$y2 = $a1*$x2+$b1;
return array($x1,$y1,$x2,$y2);
}

function custom_reverse( $ar)
{
$ar = array_reverse($ar);
for ( $i = 0; $i < count($ar)-1; $i+=2)
{
$t = $ar[$i];
$ar[$i] = $ar[$i+1];
$ar[$i+1] = $t;
}
return $ar;
}

function halbkreis( $points, $index, $buffer)
{
$winkel = 90-rad2deg(atan2(($points[3]-$points[1]),($points[2]-$points[0])));

if ( $index == 1 )
{
$start = $winkel;
$end = $winkel +180;
}
else
{
$start = $winkel -180;
$end = $winkel;
}
for ( $i = $start; $i < $end; $i+=30)
{
$nc[]=$points[$index*2-2]+cos(deg2rad($i))*$buffer;
$nc[]=$points[$index*2-1]-sin(deg2rad($i))*$buffer;
}
return $nc;
}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий