Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // Zufallswert setzen
- mt_srand();
- // Quadrant setzen. In diesem Fall zufällig.
- $quadrant = array(50,50);
- // Auf basis von Quadrant basierende Anzahl an sternen erzeugen. ($quadrant = array(50,50) hätte somit immer die selbe sternenanzahl)
- $stars = "auto";
- // Größe der Grafik
- $w = 200;
- $h = 140;
- // Hier ist die Option, welche ich versuchen möchte, umzusetzen.
- $radial_crop = false;
- // Zufälliger Seed-Wert auf basis von Quadrantenwert
- $seed = "auto";
- // Zwischenspeicher-Wert für bessere Variierungen zwischen Sternenpositionen und Luminanzen.
- // Der Wert hier hat keinen großen Einfluss auf Optik und Anordnung der Sterne sondern dient
- // lediglich der rekursiven Variierung des Seeds.
- $last_salt = 550;
- // Ziemlich komplexe und unübersichtliche Seed-Variierungs-Funktion.
- function calcSeed($x,$y,$salt) {
- global $seed;
- $newseed = ($x + cos($y) + pow((($seed * $x + $y + sin($x) + (cos($y) / $salt) + $salt) * $x) * $y,1.6) / (($salt * $x * $y) + 1));
- return($newseed);
- }
- // Erstellt ein Array mit X und Y Position sowie Lumineszenz auf Basis des vorhandenen Seeds.
- function generateStar($field_width,$field_height) {
- global $quadrant;
- global $last_salt;
- global $seed;
- // Seed-Vergabe
- mt_srand(calcSeed($quadrant[0],$quadrant[1],$last_salt));
- $last_salt = mt_rand(10000000,99999999);
- $calced_seed = calcSeed($quadrant[0],$quadrant[1],$last_salt);
- mt_srand($calced_seed);
- // Positionserrechnung
- $x = mt_rand(0,$field_width);
- $y = mt_rand(0,$field_height);
- // Zufälligkeits Wert neu vergeben.
- mt_srand(calcSeed($x + $quadrant[0],$y + $quadrant[1],$last_salt + $calced_seed));
- // Lumineszens-Vorauswertung
- $prelum_calc = mt_rand(0,100);
- // Lumineszens-Berechnung
- if($prelum_calc < 20) {
- $luminance = mt_rand(90,100) / 100;
- }elseif($prelum_calc < 40) {
- $luminance = mt_rand(50,90) / 100;
- }elseif($prelum_calc < 75) {
- $luminance = mt_rand(20,50) / 100;
- }else{
- $luminance = mt_rand(5,20) / 100;
- }
- $result = array($x,$y,$luminance);
- return($result);
- }
- // Falls $seed = "auto" ist, wird ein zufälliger Seed auf Basis des Quadranten erzeugt.
- if($seed == "auto") {
- mt_srand($quadrant[0] + $quadrant[1] * sqrt($quadrant[0]) + 5999);
- $seed = abs(mt_rand(-99999999,99999999));
- }
- // Bild erzeugen
- $img = imagecreatetruecolor($w,$h);
- // Schwarzer Hintergrund
- $bg = imagecolorallocate($img,0,0,0);
- // Weiß, falls man es braucht.
- $weiss = imagecolorallocate($img,255,255,255);
- // Schwarzer Hintergrund. Nochmal zeichnen, da Truecolor-Bild.
- imagefilledrectangle($img,0,0,$w,$h,$bg);
- // Farbzwischenspeicher
- $farben = array();
- // Erzeugt eine Farbe oder gibt entsprechende Farbe zurück, wenn bereits erzeugt.
- function getLumCol($img,$luminance) {
- $lum_col = floor(255 * $luminance);
- if(!isset($farben[$luminance])) {
- $farben[$luminance] = imagecolorallocate($img,$lum_col,$lum_col,$lum_col);
- }
- return($farben[$luminance]);
- }
- // Erzeugt eine Farbe oder gibt entsprechende Farbe zurück. Hierbei wird weiß nur mit der Luminanz abgedunkelt.
- function getLumColA($img,$luminance) {
- $lum_col = floor(255 * $luminance);
- if(!isset($farben["A" . $luminance])) {
- $farben["A" . $luminance] = imagecolorallocatealpha($img,255,255,255,127 - (127 * $luminance));
- }
- return($farben["A" . $luminance]);
- }
- // Wenn $stars = "auto", dann wird die Sternenanzahl zufällig auf Basis des Quadranten erzeugt.
- if($stars == "auto") {
- mt_srand(calcSeed($quadrant[0],$quadrant[1],$seed));
- $stars = (mt_rand(1,10) * floor(($w * $h) / 200)) / 10;
- }
- // Schleife für die Anzahl der Sterne.
- for($i = 0;$i < $stars;$i++) {
- // Hier wird ein Stern erzeugt.
- $stern = generateStar($w,$h);
- // Hier wird dessen Farbe erzeugt auf basis der Luminanz des Sterns.
- $farbe = getLumCol($img,$stern[2]);
- /*
- Genau hier würde ich gerne prüfen, ob der Stern ($stern[0] und $stern[1]) außerhalb der
- Ellipse ist. Diese habe ich im letzten Schritt mitzeichnen lassen.
- */
- // Hier wird der Sternenschein gezeichnet. Insofern er über 98% Helligkeit aufweist, erhält er ein 80% schwächeren Schein drum herum
- if($stern[2] > 0.98) {
- $farbe2 = getLumColA($img,$stern[2] / 5);
- imagefilledrectangle($img,$stern[0],$stern[1]-2,$stern[0],$stern[1]+2,$farbe2);
- imagefilledrectangle($img,$stern[0]-2,$stern[1],$stern[0]+2,$stern[1],$farbe2);
- }
- // Hier wird der Stern selbst gezeichnet.
- imagefilledrectangle($img,$stern[0],$stern[1],$stern[0],$stern[1],$farbe);
- }
- // Zu Testzwecke eine Ellipse
- $ell = imagecolorallocatealpha($img,255,0,0,90);
- imageellipse($img,$w / 2,$h / 2,$w - 1,$h - 1,$ell);
- // Ausgabe als Grafik
- header("Content-Type: image/png");
- imagepng($img);
- imagedestroy($img);
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement