PHP/GD: Sechseck Raster zeichnen

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php_gd_sechseck_raster_zeichnen_190729/page_1 - zur Vollversion wechseln!


kleinerChemiker schrieb am 21.01.2008 um 20:42

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);
?>


Gegi schrieb am 22.01.2008 um 10:38

also bei mir werden 6ecke angezeigt...


Obermotz schrieb am 22.01.2008 um 10:39

Gleichfalls


Nico schrieb am 22.01.2008 um 10:42

jo, aber gestern noch nicht, er hats anscheinend korrigiert :)


kleinerChemiker schrieb am 22.01.2008 um 10:46

ja, bin in der nacht draufgekommen und habs grad eben korrigiert. der fehler lag in der 6eck berechnung.


pupsy schrieb am 11.04.2008 um 16:59

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 schrieb am 11.04.2008 um 20:39

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 schrieb am 16.04.2008 um 11:24

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 schrieb am 16.04.2008 um 11:33

z.b. in dem du nach imagepolygon noch was reinschreibst


pupsy schrieb am 16.04.2008 um 11:52

auf die Idee kamm ich auch schon, bis jetzt hats aber noch nicht hingehauen :confused:


pupsy schrieb am 16.04.2008 um 11:56

ich werds mal mit imagestring versuchen, oder gibts eine bessere löung?


kleinerChemiker schrieb am 16.04.2008 um 13:13

dafür ist imagestring ja da.

ps: es gibt eine editfunktion ;)


pupsy schrieb am 17.04.2008 um 10:05

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:


kleinerChemiker schrieb am 17.04.2008 um 10:27

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.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025