Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2014, 00:15   #1
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию Равномерное распределение точек в круге

Пусть задана окружность (x0,y0,r0). Необходимо внутри разместить случайные точки так, чтобы они были распределены равномерно.

Решение в лоб:

Код:
  with canvas do begin
    Ellipse(x0-r0,y0-r0,x0+r0,y0+r0);
    for i := 1 to 10000 do begin
      a:=2*Pi*random;
      r:=r0*random;
      x:=x0+round(r*cos(a));
      y:=y0+round(r*sin(a));
      Pixels[x,y]:=clred;
    end;
  end;
Но понятно, что распределение не равномерное, плотность точек выше к центру круга:

1.PNG

Есть идеи, как распределить точки равномерно?
Arigato вне форума Ответить с цитированием
Старый 09.05.2014, 00:36   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Есть такое решение, тоже в лоб:

Код:
  with canvas do begin
    Ellipse(x0-r0,y0-r0,x0+r0,y0+r0);
    for i := 1 to 10000 do begin
      repeat
        x:=x0+random(2*r0)-r0;
        y:=y0+random(2*r0)-r0;
      until (sqr(x-x0)+sqr(y-y0)<sqr(r0));
      Pixels[x,y]:=clred;
    end;
  end;
С поставленной задачей справляется, распределение равномерное:

2.PNG

Только присутствуют лишние холостые шаги, от которых хотелось бы избавиться.
Arigato вне форума Ответить с цитированием
Старый 09.05.2014, 00:48   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...типа этого?

http://www.programmersforum.ru/showthread.php?t=252071
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 09.05.2014, 00:52   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Только там ничего нового, решение схоже с моим.

Цитата:
Сообщение от raxp Посмотреть сообщение
...типа этого?
Кстати, не аэрограф, а минное поле. Точки - мины.
Arigato вне форума Ответить с цитированием
Старый 09.05.2014, 02:06   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,cx,cy,r: Integer;
    x,y: Real;
begin
  cx:=220; cy:=220; r:=200;
  Randomize;
  Canvas.Ellipse(cx-r,cy-r,cx+r,cy+r);
  for i:=1 to 10000 do begin
    x:=r*Sqrt(Random);
    y:=2*Pi*Random;
    Canvas.Pixels[cx+Round(x*cos(y)),cy+Round(x*sin(y))]:=clRed;
  end;
end;
Изображения
Тип файла: png Безымянный.png (20.8 Кб, 312 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.05.2014 в 02:10.
Аватар вне форума Ответить с цитированием
Старый 09.05.2014, 02:49   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Получается в первое решение только добавить корень. Оригинально.
Вот только идею что-то понять не могу, видимо, время позднее. Интуитивно ясно, можно даже узреть по первой картинке, но как это обосновать?

Последний раз редактировалось Arigato; 09.05.2014 в 02:51.
Arigato вне форума Ответить с цитированием
Старый 09.05.2014, 04:15   #7
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
.. но как это обосновать?
Тоже не соображу. Может быть есть простое и изящное обоснование, но в голову не идет.

А так, тупо в лоб ...
r - равномерно распределенная СВ ( r:=r0*random; )
Рассмотрим две маленькие области ( кольцевые сегменты, серые ). Толщина сегментов одинаковая , то есть r2-r1 = r4-r3 , потому вероятности
P(r1<r<r2) = P(r3<r<r4) и поэтому вероятности попадания в сегменты тоже будет одинаковая. А площадь у них разная, она пропорциональна среднему радиус-вектору сегментов.
Точнее, почти пропорциональна, чем тоньше, тем точнее. При бесконечно малой толщине - точно пропорциональна.

Вот отсюда как то и выведется наверное.
Если надо точное теоретическое обоснование - то всякие функции плотности, функции распределения, интегралы.

PS Не уверен, что корень из равн.распр. СВ и есть точный ответ. Может быть просто очень близкий.
Изображения
Тип файла: png 11.png (29.0 Кб, 137 просмотров)

Последний раз редактировалось type_Oleg; 09.05.2014 в 04:20.
type_Oleg вне форума Ответить с цитированием
Старый 09.05.2014, 09:58   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Если построить график плотности распределения точек в круге, то получаем вот что:

Код:
  x0:=300; y0:=300; r0:=200;
  randomize;
  canvas.Rectangle(x0-r0,y0,x0+r0,y0-r0);
  for i := 1 to 15000 do begin
    a:=2*Pi*random;
    r:=r0*random;
    x:=x0+round(r*cos(a));
    y:=y0;
    while canvas.Pixels[x,y]=clred do
      dec(y);
    canvas.Pixels[x,y]:=clred;
  end;
1.PNG

С корнем:

Код:
    r:=r0*sqrt(random);
2.PNG

То есть оно тоже не равномерно, просто нет такого пика в центре.

Пока наиболее верный результат дает решение #2, но оно не рациональное. Еще решения будут?

Последний раз редактировалось Arigato; 09.05.2014 в 10:07.
Arigato вне форума Ответить с цитированием
Старый 09.05.2014, 10:51   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Хотя, я не прав. Это плотность распределения только по x. То есть с квадратным корнем распределение в круге действительно равномерное. Это видно, если количество точек увеличить с 10000 до 100000:

1.PNG
Arigato вне форума Ответить с цитированием
Старый 09.05.2014, 12:05   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Теоретическое обоснование мне слабо провести, нужно копать в сторону векторных случайных величин, интегралов Лебега или Римана, не помню. А так прикинул, что площадь квадратичная функция от радиуса, методом тыка извлек корень квадратный, визуально получилось похоже
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Равномерное распределение (алгоритм) Honr Помощь студентам 4 14.07.2013 16:19
Задаnm n точек. Найти m=3,4... точек и построить на них m-угольник: количество точек , лежащих внутри и вне его мин. различается L.Rain Помощь студентам 0 11.12.2011 22:19
Задача о круге на плоскости. pdef Помощь студентам 3 22.09.2011 00:47
Сложение объектов и равномерное распределение их последовательности Tarkh PHP 1 23.12.2009 20:16