Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 774

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
В ходе написания программы по теорфизу столкнулся с проблемкой, а именно после задания начальных условий:

  for i:= 1 to n do begin
    x[i]:=(xmax)*random;            //начальные условия   коорд по х
    y[i]:=(ymax)*random;            // коорд по y
    vx[i]:=vmin/2+vmax/2*random;   // скорость по x
    vy[i]:=vmin/2+vmax/2*random;   // скорость по y
    En:=En+vx[i]*vx[i]/2+vy[i]*vy[i]/2;   // начальная энергия
   end;
необходимо выполнить проверку расстояний между всеми точками, и если оно меньше необходимого - задать координаты всех точек заного (иначе может наступить "взрыв" -резкий скачек энергии и соответсвенно ошибка).
Была идея создать массив размером NxN точек, в каждой строке которого будет расстояние от "итой" точки до всех остальных и последущее сравнение всех строк. К сожалению такая процедура получилась слишком большой и довольно прожорливой ( особенно если учесть возможность просчета 100+ точек).
Поэтому решил просить помощи у Вас.
(исходник прилагается, и если заинтересует результат то лучше при запуске свернуть окошко с траекториями, просчет ускорится в разы =) )

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

homerchick Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: homerchick (статус: Посетитель)
Вопрос отправлен: 23 ноября 2011, 11:13
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 22; последнее сообщение — 25 ноября 2011, 18:33; участников в обсуждении: 5.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 11:28 [#1]:

Цитата (homerchick):

К сожалению такая процедура получилась слишком большой и довольно прожорливой ( особенно если учесть возможность просчета 100+ точек).

Уж не в TStringGrid ли ты их хранишь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
homerchick

homerchick (статус: Посетитель), 23 ноября 2011, 11:39 [#2]:

нет, все координаты хранятся в обычном integer массиве
min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 11:48 [#3]:

А что нужно найти-то? Две точки, расстояние между которыми минимальное?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
homerchick

homerchick (статус: Посетитель), 23 ноября 2011, 11:55 [#4]:

нужно найти расстояния между всеми точками и сравнить его с нужным значением ( например если 3 точки то найти расстояния 1-2 1-3 2-1 2-3 3-2 3-1), точек может быть сколько угодно
Drinkenz

Drinkenz (статус: 1-ый класс), 23 ноября 2011, 12:42 [#5]:

Наверно вот так обычно делают
for i:=0 to n-1 do
  for j:=i+1 to n do
     if abs((x[i]*x[i]+y[i]*y[i])-(x[j]*x[j]+y[i]*y[j]))<miser
       then 
// где miser - квадрат минимального допустимого расстояния
min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 13:01 [#6]:

Цитата (homerchick):

нужно найти расстояния между всеми точками и сравнить его с нужным значением

И что делать дальше-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
homerchick

homerchick (статус: Посетитель), 23 ноября 2011, 13:49 [#7]:

min@y™: проблема была в сравнении растояний между всеми точками
min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 14:11 [#8]:

Объясни: вот взяли 2 точки, рассчитали расстояние, сравнили С ЧЕМ? И что делать в случаях, когда:
а) больше;
б) меньше;
ц) равно?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
homerchick

homerchick (статус: Посетитель), 23 ноября 2011, 14:32 [#9]:

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

а с чем сравнивать? если брать с запасом то МИНИМАЛЬНОЕ РАССТОЯНИЕ между точками должно быть 0.5

грубо говоря нам нужно добиться такого варианта рандомного распределения частиц по полю, чтоб они удовлетворяли условию (а)
min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 14:48 [#10]:

То есть тебе нужно создать поле точек, удовлетворяющих условию или просто проверить поле точек на соответствие условию?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
homerchick

homerchick (статус: Посетитель), 23 ноября 2011, 15:04 [#11]:

именно так
min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 15:37 [#12]:

именно КАК?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
homerchick

homerchick (статус: Посетитель), 23 ноября 2011, 15:40 [#13]:

создать поле точек, удовлетворяющих условию (а)
если после первой генерации поле не удовлетворяет условию генерировать его до тех пор пока не удовлетворит
min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 16:00 [#14]:

Короче, надо померить расстояния каждой точки от каждой, если найдена пара точек, НЕудовлетворяющих условию (а), сгенерировать опять, и так до бесконечности?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
homerchick

homerchick (статус: Посетитель), 23 ноября 2011, 16:03 [#15]:

да,это и надо
min@y™

min@y™ (статус: Доктор наук), 23 ноября 2011, 16:28 [#16]:

Ну, не знаю. Мне это представляется как-то вот так:
type
  TSinglePoint = record
    X, Y: Single;
  end;
 
  TPointArray = array of TSinglePoint;
 
procedure MakeField(var PA: TPointArray;
                    const Count: Integer;
                    const xMax, yMax: Single);
var
  Index: Integer;
begin
  SetLength(PA, Count);
  for Index:= 0 to Count - 1 do
    begin
      PA[Index].X:= xMax * Random();
      PA[Index].Y:= yMax * Random();
      // ...
    end;
end;
 
function CheckField(const PA: TPointArray; const MinSquare: Single): Boolean;
var
  Index1, Index2, Count: Integer;
  Len: Single;
begin
  Result:= False;
  Count:= Length(PA);
 
  for Index1:= 0 to Count - 2 do            // <--- обрати внимание на организацию
    for Index2:= Index1 + 1 to Count - 1 do // вложенных циклов
       begin
         LenSquare:= Sqr(PA[Index1].X - PA[Index2].X) + Sqr(PA[Index1].Y - PA[Index2].Y);
         if LenSquare < MinSquare // сравнение текущего квадрата расстояния с минимальным
           then Exit;
       end;
 
  Result:= True;
end;
 
// использование этой всей ботвы:
var
  Field: TPointArray;
begin
  repeat
    MakeField(Field, 10, 100.0, 100.0); // все числа от балды
  until CheckField(Field, 20.0); // все числа от балды
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 23 ноября 2011, 20:34 [#17]:

1-2 1-3 2-1 2-3 3-2 3-1
а зачем по два раза считать расстояние??? 1-2 2-1 ??? неужели это какое-то нелинейное пространство, где расстояние между двумя точками зависит от того, в какую сторону измерять?
Толяныч

Толяныч (статус: 4-ый класс), 23 ноября 2011, 22:30 [#18]:

В случае ориентированных графов - именно так. Бытовой пример: пункта А и пункт Б связаны дорогами с односторонним движением.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 24 ноября 2011, 20:14 [#19]:

где-то в вопросе было написано про орграфы?
homerchick

homerchick (статус: Посетитель), 24 ноября 2011, 21:09 [#20]:

min@y™: не совсем получилось вникнуть в ваш метод, попробовал сделать что-то похожее, и вот что получилось
procedure field(Xmax,Ymax,minsquare:real; n:integer);
var i,j,k:integer;
    err:boolean;
    lensquare:real;
  begin
    repeat
      for k:=1 to n do
        begin
        x[k]:=Xmax*random;
        y[k]:=Ymax*random;
        end;
        err:=false;
        for i:=1 to n-1 do
          for j:=i+1 to n do
            begin
              lensquare:=sqr(x[i]-x[j])+sqr(y[i]-y[j]);
              if lensquare<minsquare then exit;
              err:=true;
            end;
       err:=true;
    until err=true;
  end;

ошибка стала вылетать ГОРАЗДО реже, но все же вылетает... видимо что-то где-то все же накосячил...
-------------------------------------------------------------

Мережников Андрей: я имел ввиду, что нужно найти расстояния от каждой точки до каждой, не более

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:30
Выполнено за 0.03 сек.