"We are back" « oc.at

PHP/GD: Sechseck Raster zeichnen

kleinerChemiker 21.01.2008 - 20:42 3640 13
Posts

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4295
Ich will ein Raster aus lauter Sechsecken zeichnen. Eigentlich denke ich, daß ich der COde stimmen müßte, tut er aber nicht. Anstatt Sechsecken werden Rechtecke gezeichnet. Der Punkt ganz rechts und der Punkt ganz links auf Höhe des Mittelpunktes werden nicht mitgezeichnet.

Hier das Ergebnis und hier der dazugehörige Code:

Code: PHP
<?php
$seite = 20;
$xoff = 50;
$yoff = 50;
$xzahl = 40;
$yzahl = 40;


$sin = sin(deg2rad(60));
$cos = cos(deg2rad(60));

function sechseck ($x, $y, $s) {
	global $sin, $cos;
	$e[] = $x - $s*$cos;
	$e[] = $y + $s*$sin;

	$e[] = $x + $s*$cos;
	$e[] = $y + $s*$sin;

	$e[] = $x + $s*$cos;
	$e[] = $y;

	$e[] = $x + $s*$cos;
	$e[] = $y - $s*$sin;

	$e[] = $x - $s*$cos;
	$e[] = $y - $s*$sin;

	$e[] = $x - $s*$cos;
	$e[] = $y;

	foreach ($e as $t) {
		$return[] = round($t);
	}
	#print_r($return);
	return $return;
}

function raster ($x, $y, $s, $xa, $ya) {
	global $sin, $cos;
	header ("Content-type: image/png");
	$im = imagecreate($s*$xa+2*$x, $ya*2*$sin*$s+2*$y);
	$schwarz = ImageColorAllocate ($im, 0, 0, 0);
	$weiss   = ImageColorAllocate ($im, 255, 255, 255);
	imagefill($im,0,0,$weiss);
	for ($i = 0; $i <= $xa; $i++) {
		for ($j = 0; $j < $ya; $j++){
			$xt = $x + 2*$s*$i;
			if ($i/2 == round($i/2)) {
				$yt = $y + $j*2*$sin*$s - $sin*$s;
			}
			else {
				$yt = $y + $j*2*$sin*$s;
			}
		imagepolygon($im, sechseck($xt, $yt, $s), 6, $schwarz);
		}
	}
	Imagepng($im);
}

raster($xoff, $yoff, $seite, $xzahl, $yzahl);
?>
Bearbeitet von kleinerChemiker am 22.01.2008, 15:20 (solved)

Gegi

Here to stay
Registered: Jan 2001
Location: Wien
Posts: 792
also bei mir werden 6ecke angezeigt...

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Gleichfalls
6eck_php_117956.png (downloaded 622x)

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
jo, aber gestern noch nicht, er hats anscheinend korrigiert :)

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4295
ja, bin in der nacht draufgekommen und habs grad eben korrigiert. der fehler lag in der 6eck berechnung.

pupsy

Bloody Newbie
Registered: Apr 2008
Location: germany
Posts: 5
Also ich hab nur so ne art vierecke, kannst du kleiner Chemiker kannst du vieleicht den funktionierrenden Code nochmal Posten?? wäre super danke

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4295
wie schon geschrieben, der fehler lag in der seckseck berechnung. wenn man sichs überlegt, ists eh klar.

Code: PHP
php
$seite = 20;
$xoff = 50;
$yoff = 50;
$xzahl = 40;
$yzahl = 40;


$sin = sin(deg2rad(60));
$cos = cos(deg2rad(60));

function sechseck ($x, $y, $s) {
	global $sin, $cos;
	$e[] = $x - $s*$cos;
	$e[] = $y + $s*$sin;

	$e[] = $x + $s*$cos;
	$e[] = $y + $s*$sin;

	$e[] = $x + $s;
	$e[] = $y;

	$e[] = $x + $s*$cos;
	$e[] = $y - $s*$sin;

	$e[] = $x - $s*$cos;
	$e[] = $y - $s*$sin;

	$e[] = $x - $s;
	$e[] = $y;

	foreach ($e as $t) {
		$return[] = round($t);
	}
	#print_r($return);
	return $return;
}

function raster ($x, $y, $s, $xa, $ya) {
	global $sin, $cos;
	header ("Content-type: image/png");
	$im = imagecreate($s*$xa+2*$x, $ya*2*$sin*$s+2*$y);
	$schwarz = ImageColorAllocate ($im, 0, 0, 0);
	$weiss   = ImageColorAllocate ($im, 255, 255, 255);
	imagefill($im,0,0,$weiss);
	for ($i = 0; $i <= $xa; $i++) {
		for ($j = 0; $j < $ya; $j++){
			$xt = $x + 2*$s*$i;
			if ($i/2 == round($i/2)) {
				$yt = $y + $j*2*$sin*$s - $sin*$s;
			}
			else {
				$yt = $y + $j*2*$sin*$s;
			}
		imagepolygon($im, sechseck($xt, $yt, $s), 6, $schwarz);
		}
	}
	Imagepng($im);
}

raster($xoff, $yoff, $seite, $xzahl, $yzahl);

pupsy

Bloody Newbie
Registered: Apr 2008
Location: germany
Posts: 5
Supi, danke das leuft super!

Eine frage hab ich noch, wie kann ich die einzelenen Sechsecke beschriften?

Also z.b oben links x1 / y1 ins zweite sechseck oben links x2 / y1 usw. ??

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4295
z.b. in dem du nach imagepolygon noch was reinschreibst

pupsy

Bloody Newbie
Registered: Apr 2008
Location: germany
Posts: 5
auf die Idee kamm ich auch schon, bis jetzt hats aber noch nicht hingehauen :confused:

pupsy

Bloody Newbie
Registered: Apr 2008
Location: germany
Posts: 5
ich werds mal mit imagestring versuchen, oder gibts eine bessere löung?

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4295
dafür ist imagestring ja da.

ps: es gibt eine editfunktion ;)

pupsy

Bloody Newbie
Registered: Apr 2008
Location: germany
Posts: 5
Yehhaa habs hin bekommen, kaum bringt man sein gehirn in wallung gehts auch schon ganz leicht :)

danke für deine hilfe!!

Eine frage hätte ich aber noch.... eigentlich sinds zwei :D

1) wie kann ich die sechseke mit farbe füllen? (nur die sechsecke nicht das ganze png)

2) wie kann ich die schsecke drehen so das die zwei parallelen seiten nicht horizontal stehen sondern senkrecht? Also eigentlich sind ja immer zwei seiten Parallel (liegt in der natur des secksecks ) ich will die sechsecke einmal um 90 grad drehen.


Das erste Problem hab ich inzwischen hin bekommen, beim zweiten steh ich aber ziemlich auf dem schlauch :confused:
Bearbeitet von pupsy am 17.04.2008, 10:54

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4295
ad 1: du könntest dir ruhig die php-dok anschauen, dann würdest du schnell über imagefilledpolygon() stolpern.

ad 2: überleg dir, wie die punkte in der funktion sechseck berechnet werden. dann sollte es ein leichtes sein, das 6eck zu drehen wie es dir beliebt.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz