Ограничение на количество эллипсов

LadN

Новичок
Ограничение на количество эллипсов

Всем привет!
Решаю тривиальную задачу: есть массив данных, хочу построить график. Использую линии, чтобы строить сам график (imageLine) и в качестве точек (значений функции) использую эллипс (imagefilledellipse).
Столкнулся с таким глюком: если количество эллипсов превышает примерно 250, то они просто перестанут рисоваться...
Для примера даю код, который рисует просто кучу эллипсов. Попробуйте сменить количество итераций на 300-400-500 и убедитесь сами
PHP:
<?php
$img = imageCreate(1000, 300);
$color = imageColorAllocate($img, 0, 0, 0);
imageColorTransparent($img, $color);
for ($i=0; $i<200;$i++){
   $col_ellipse = imagecolorallocate($img, 0, 0, 255);
   $y=rand(100, 150);
   imagefilledellipse($img, $i, $y, 5, 5, $col_ellipse);
}
header("Content-type: image/gif");
imageGif($img);
imagedestroy($img);
?>
Может кто-то сталкивался с такой проблемой?
 

damngood

Мозг был, но ушел...
<?php
$img = imageCreate(1000, 1000);
$color = imageColorAllocate($img, 0, 0, 0);
imageColorTransparent($img, $color);
for ($i=0; $i<20000;$i++){
$col_ellipse = imagecolorallocate($img, 0, 0, 255);
$y=rand(10, 1900);
imagefilledellipse($img, $i, $y, 5, 5, $col_ellipse);
}
header("Content-type: image/gif");
imageGif($img);
imagedestroy($img);
?>


Все отлично рисуется

-----------
ХМ. нет, вру. Простите. Коряво все, больше не рисует.
 

LadN

Новичок
не, то ли лыжи не едут...
не работает!!!!
картинка что на 300, что на 2000 итераций картинка одинаковая!
 

craz

Нестандартное звание
да что вы говорите а то что вы круги друг на друге рисуете это как ваще? пофик ваще на радиус?

<?php
$img = imageCreate(1000, 1000);
$color = imageColorAllocate($img, 0, 0, 0);
imageColorTransparent($img, $color);
$r=50; //radius
for ($i=0; $i<20000;$i++){
$col_ellipse = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
$y=rand(10, 1900);
imagefilledellipse($img, $i*$r+$r/2, 500, $r, $r, $col_ellipse);
}
header("Content-type: image/gif");
imageGif($img);
imagedestroy($img);
?>
кстати могу вам сразу сказать что количество итераций конечно и легко считается то есть вы не можете нарисовать больше кругов в данной области двигаясь по оси х ну эт и так понятно наверное
 

LadN

Новичок
возможно что-то с настройками сервера, gd, php и пр. дряни...
предлагаю следующий эксперимент:
берем нижеприведенный код, запускаем у себя и результат (картинки) с разным числом итераций выкладываем здесь
итерации можно менять через параметр maxi в адресной сроке
PHP:
<?php
if (isset($_GET['maxi'])) {
$maxi = $_GET['maxi'];
$img = imageCreate(1000, 100);
$color = imageColorAllocate($img, 0, 0, 0);
imageColorTransparent($img, $color);
$r=4; //radius
for ($i=0; $i<$maxi;$i++){
$col_ellipse = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
$y=rand(0, 100);
imagefilledellipse($img, $i, $y, $r, $r, $col_ellipse);
}
header("Content-type: image/gif");
imageGif($img);
imagedestroy($img);
}
?>
-~{}~ 22.10.09 15:13:

200

300

500

1000


-~{}~ 22.10.09 15:15:

как видите после 300 рисунок не "расширяется"...
 

craz

Нестандартное звание
Автор оригинала: LadN

PHP:
imagefilledellipse($img, $i, $y, $r, $r, $col_ellipse);
че за чушь вы пишите?? посмотрите описание команды и второй атрибут! это х у вас +1 - итерация значит будет рисовать центры через один пиксель! и все круги сливаются в линию! я же написал формулу расчета для х, что не понятным осталось? скрипт рисует все правильно и именно пятьсот кругов! или скока вам там надо!

а ваш $_Get['max'] расчитываеться из w картинки деленной на радиус эллипса! если радиус эллипса 4 картинка 200 то линия из эллипсов которые соприкасаются друг с другом будет 200 и кол-во эллипсов будет 50.

как видите после 300 рисунок не "расширяется"...
Да потому что скрипт уже нарисовал вам все эллипсы которые был должен сделайте блин радиус больше и посчитайте кол-во эллипсов


<?php

$maxi = $_GET['maxi']; //ЭТО КОЛИЧЕСТВО ЭЛЛИПСОВ
$img = imageCreate(1000, 100); //КАКОЙ ШИРИНЫ СОЗДАННАЯ КАРТИНКА?
$color = imageColorAllocate($img, 0, 0, 0);
imageColorTransparent($img, $color);
$r=4; //radius //СКОЛЬКО В 100 ПИКСЕЛЯХ БУДЕТ ЦЕНТРОВ? 100! ЕСЛИ ВЫ НЕ БУДЕТЕ ИХ РАЗМЕЩАТЬ В СОПРИКОСНОВЕНИЕ А РИСОВАТЬ ЦЕНТРЫ БУДЕТЕ ЧЕРЕЗ 1 ПИКСЕЛЬ!
for ($i=0; $i<$maxi;$i++){
$col_ellipse = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
$y=rand(0, 100);
imagefilledellipse($img, $i, $y, $r, $r, $col_ellipse);
//$i СТАЛО РАВНО 101? КУДА РИСУЕМ? В НИКУДА У НАС КАРТИНКА ВСЕГО 100 ПИКСЕЛЕЙ
}
header("Content-type: image/gif");
imageGif($img);
imagedestroy($img);
}
?>
 

LadN

Новичок
//$i СТАЛО РАВНО 101? КУДА РИСУЕМ? В НИКУДА У НАС КАРТИНКА ВСЕГО 100 ПИКСЕЛЕЙ

дык картинка по высоте 100 пикселей а по ширине 1000
очевидно что есть куда рисоваться
 

craz

Нестандартное звание
я напротив думаю что я вас даже очень хорошо понимаю просто вы не понимаете что хотите сделать у вас ширина и кол-во кругов должно быть равным если вы хотите ставить центры через пиксель.

-~{}~ 22.10.09 13:28:

Автор оригинала: LadN
ок, попробую разобраться
удачи вроде уже должно стать все понятно)
 

LadN

Новичок
//$i СТАЛО РАВНО 101? КУДА РИСУЕМ? В НИКУДА У НАС КАРТИНКА ВСЕГО 100 ПИКСЕЛЕЙ

дык картинка по высоте 100 пикселей а по ширине 1000
очевидно что есть куда рисоваться
Отредактировано LadN 22.10.09 в 15:31

-~{}~ 22.10.09 15:35:

вопрос остается открытым
 

craz

Нестандартное звание
да тут прогнал сорь, но все равно то что я пишу вы не понимаете

давайте так

у нас есть эллипс радиусом 4пикселя с центром в (х=2,у=2) его самая удаленная точка по оси х от этой точки (х=4,у=2), мы рисуем эллипс с центром в точке (х=3,у=2) самая удаленная точка по оси х, (х=5,у=2) и т.д. то есть если мы начинаем в точке (2,2) рисуем 400 эллипсов какая длина будет нарисованного по оси х?
правильно 400 это центры то есть линия из центров + 2 это начальное значение откуда начали рисовать + 2 это самая удаленная точка по оси х самого последнего элипса
и того мы хотим нарисовать картинку в 1000 пиксель но заняли всего 404 пикселя, так ведь? значит остальная часть будет пустой?
 

LadN

Новичок
вы говорите все правильно! я согласен с вами на 100%
но все таки, пожалуйста, попробуйте запустить вышеприведенный скрипт и покажите результаты выполнения
 

craz

Нестандартное звание
ваш скрипт не правильно написан с точки зрения алгоритма. смысла его запускать нет.
это ваше:
PHP:
<?php $img = imageCreate(100, 100); $color = imageColorAllocate($img, 0, 0, 0); imageColorTransparent($img, $color); $r=5; //radius for ($i=0; $i<20;$i++){ $col_ellipse = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255)); $y=rand(10, 90); imagefilledellipse($img, $i, $y, $r, $r, $col_ellipse);  } header("Content-type: image/gif"); imageGif($img); imagedestroy($img); ?>
это как правильно занять всю область картинки:
PHP:
<?php $img = imageCreate(100, 100); $color = imageColorAllocate($img, 0, 0, 0); imageColorTransparent($img, $color); $r=5; //radius for ($i=0; $i<20;$i++){ $col_ellipse = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255)); $y=rand(10, 90); imagefilledellipse($img, $i*r+$r/2, $y, $r, $r, $col_ellipse);  } header("Content-type: image/gif"); imageGif($img); imagedestroy($img); ?>
-~{}~ 22.10.09 14:29:

а дальше думайте нет никакой причины для пхп не рисовать вам больше 300 кружков, поверьте он к вам относиться так же хорошо как к другим)

-~{}~ 22.10.09 14:30:

считайте кол-во кружков
 

LadN

Новичок
и все таки мы друг друга не понимаем )))
1. у меня нет цели заполнить равномерно картинку эллипсами
2. нет цели сделать так, чтобы эллипсы не соприкасались (пусть соприкасаются сколько угодно)

цель: с координаты [0,50] заполнить картинку размером 1000х100 эллипсами радиусом 4 пикселя с частотой по Х в 1 пиксель.

например, если кол-во итераций будет не 1000 (как ширина картинки), а 300, в этом случае, картинка будет заполнена от левого края чуть больше чем на треть.
если, 500 итераций, то на половину. если 600, то чут меньше чем на две третьих...
так?
 

craz

Нестандартное звание
толи вы меня запутали толи это реально какая то не понятная фича...

PHP:
<?php
$img = imageCreate(10000, 1000);
$color = imageColorAllocate($img, 0, 0, 0);
imageColorTransparent($img, $color);
$r=5; //radius
for ($i=0; $i<20000;$i++){
if ($i%20==0){
	imageline($img,$i*$r+$r/2+2,450,$i*$r+$r/2+2,550,$col_ellipse);
}
$col_ellipse = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
$y=rand(10, 1900);
imagefilledellipse($img, $i*$r+$r/2, 500, $r, $r, $col_ellipse);

}
header("Content-type: image/gif");
imageGif($img);
imagedestroy($img);
?>
 

dimagolov

Новичок
эллипсами радиусом 4 пикселя
извините, что вмешиваюсь в плодотворную беседу, но ме могли бы Вы мне пояснить, что такое "эллипс радиусом 4 пикселя" Это, как я могу догадаться, фигура, которая занимает в область 4х4 пикселя? Примерно так?
Код:
.OO.
O..O
O..O
.OO.
и зачем, простите, рисовать сотни таких какашек?
 

craz

Нестандартное звание
та я проверил даже больше 202(! если быть точным) пикселей именно imagesetpixels не выводиться. какая-то замута странная.
 

dimagolov

Новичок
craz, а ты посмотри на объем распределенной памяти. GD еще тот глюкогон.

но это не отменяет моего вопроса :)
 

craz

Нестандартное звание
та какая разница зачем, вопрос реальный почему не рисует больше 202 какашек?)
 

dimagolov

Новичок
craz, разница принципиальная. потому что никому не интересны высосанные из пальца задачи не имеющие практического смысла.
 
Сверху