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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2013, 11:55   #1
Margo_legion058
Новичок
Джуниор
 
Регистрация: 05.04.2013
Сообщений: 2
По умолчанию Точки в Image

Всем добрый день! Ребят,может кто поможет с кодом?! У меня точки на компоненте Image задаются графически (кликаем мышкой по компоненту в любом месте) и случайно. Графически все хорошо работает,а вот при случайном точки накладываются друг на друга. А должно быть так: в edit9 вводим количество центров скопления точек (сами центры воображаемые,они точкой не обозначаются),а в edit10 вводим число точек вокруг этих центров. И вот при щелчке на кнопку Button8 эти точки должны появляться на Image. То есть всего точек должно быть edit9*edit10 штук. А они у меня наслаиваются одна на другую.
Вот мой код:
Код:
procedure TForm1.Button8Click(Sender: TObject);
var
IW,IH,i,j,size:integer;
cx,cy:extended;
Delta:integer;
begin
size:=strtoint(edit10.text);
IW:=Image1.Width;
IH:=Image1.Height;
delta:=50;
for i:=1 to StrToInt(Edit9.Text) do begin
cx:=(random*(IW-2*delta));
cy:=(random*(IH-2*delta));
size:=random(8)+3;
for j:=1 to size do begin
Xp:=round(random*2*delta-delta);
Yp:=round(random*2*delta-delta);
Image1MouseDown(TObject (Image1), mbLeft,
  [], Round(Xp), Round(Yp));
Image1Click(TObject (Image1));

end;
end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   Xp:=X/map.Width;
 Yp:=(map.Height-Y)/map.Height;

  StatusBar1.Panels.Items[0].Text:=
  'X1: '+floattostrf(Xp,ffFixed,4,4);

  StatusBar1.Panels.Items[1].Text:=
  'X2: '+floattostrf(Yp,ffFixed,4,4);

  if (ssleft in shift)  then setpoint(Xp,Yp);
end;

Последний раз редактировалось Stilet; 20.04.2013 в 21:09.
Margo_legion058 вне форума Ответить с цитированием
Старый 20.04.2013, 15:06   #2
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

чтобы сделать красивую систему частиц, недостаточно просто рамдомно натыкать точек.
вам нужно рандомные координаты обработать так,
чтобы новый центр не появлялся рядом с существующими.

самый тупой способ сделать это - генерировать рандомные координаты, пока не появятся подходящие.
очень прост в реализации, но чем больше центров будет создано - тем больше вероятность получить бесконечный цикл...


а еще можно сделать так:
создать массив всех координат области (если единичный отрезок 1рх, то это будет array[1..Width*Height] of TPoint)
функция Random будет генерировать не координаты, а индексы этого массива,
а при создании очередного центра - удалять из массива координаты, где не должен появиться новый центр.
по-моему это наилучший способ.

такой подход подойдет только если в перспективе не понадобится анимировать эти центры...

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

с маленькими точками точно так же.
Изображения
Тип файла: jpg схема.jpg (37.0 Кб, 50 просмотров)

Последний раз редактировалось xrob; 20.04.2013 в 15:37.
xrob вне форума Ответить с цитированием
Старый 20.04.2013, 18:06   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
вам нужно рандомные координаты обработать так,
чтобы новый центр не появлялся рядом с существующими.
Так пусть же у центра будет радиус...

Пускай у нас есть квадрат 100x100. Квадратом рулит некий менеджер, он же рисует центры. Чтобы было все более эпично пускай радиус будет случайным но не более 35% доступной области для действий.

И так еть этот квадрат. В нем в случайном месте забирается место под точку N с радиусом X. Далее не хитрое дело вычесть из площади квадрата, площадь занятую окружностью плюс расстояние между окружностями. но для пущего аффекта сделал бы допущение некоторого % вхождения 1 окружности в пределы другой.
Человек_Борща вне форума Ответить с цитированием
Старый 20.04.2013, 19:22   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
чтобы сделать красивую систему частиц, недостаточно просто рамдомно натыкать точек.
Это точно.
Цитата:
а еще можно сделать так:
создать массив всех координат области (если единичный отрезок 1рх, то это будет array[1..Width*Height] of TPoint)
функция Random будет генерировать не координаты, а индексы этого массива,
а при создании очередного центра - удалять из массива координаты, где не должен появиться новый центр.
Удалять из массива - слишком дорогая операция. Вполне вероятно, что время, затраченное этим алгоритмом, окажется намного больше времени исходного алгоритма, от неоптимальности которого мы хотим избавиться.
В общем случае сложность O(N^2).

Лучше перемешать массив координат, а потом "закрасить" некоторую его часть, начиная с начала. Сложность O(N).
s-andriano вне форума Ответить с цитированием
Старый 20.04.2013, 20:14   #5
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

s-andriano, окей, можно тогда разбить область на одинаковые элементы,
и использовать в массиве их - массив будет меньше...
xrob вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к информации через точки на Image (карта с "горячими" точками) dydochnik Общие вопросы Delphi 22 18.05.2012 10:34
Поиск всех путей в лабиринте от точки до точки pavel_abelardo Помощь студентам 12 26.06.2011 00:23
Имеются координаты точки. Как проверить какого цвета соседние точки на форме? Rin Мультимедиа в Delphi 2 10.11.2009 22:47
даны две точки. организовать движение из точки А в точку Б окружности! Wi1D Помощь студентам 6 23.05.2009 19:55
Отбражение чисел - точки, это точки, а не запятые, обозначающие дробную часть Дикий Помощь студентам 7 12.05.2008 17:57