|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 23 ноября 2011, 11:13
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 22; последнее сообщение — 25 ноября 2011, 18:33; участников в обсуждении: 5.
Страницы: [1] [2] [Следующая »]
|
min@y™ (статус: Доктор наук), 23 ноября 2011, 11:28 [#1]:
Цитата (homerchick):
К сожалению такая процедура получилась слишком большой и довольно прожорливой ( особенно если учесть возможность просчета 100+ точек).
Уж не в TStringGrid ли ты их хранишь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
homerchick (статус: Посетитель), 23 ноября 2011, 11:39 [#2]:
нет, все координаты хранятся в обычном integer массиве
|
|
min@y™ (статус: Доктор наук), 23 ноября 2011, 11:48 [#3]:
А что нужно найти-то? Две точки, расстояние между которыми минимальное?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
homerchick (статус: Посетитель), 23 ноября 2011, 11:55 [#4]:
нужно найти расстояния между всеми точками и сравнить его с нужным значением ( например если 3 точки то найти расстояния 1-2 1-3 2-1 2-3 3-2 3-1), точек может быть сколько угодно
|
|
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™ (статус: Доктор наук), 23 ноября 2011, 13:01 [#6]:
Цитата (homerchick):
нужно найти расстояния между всеми точками и сравнить его с нужным значением
И что делать дальше-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
homerchick (статус: Посетитель), 23 ноября 2011, 13:49 [#7]:
min@y™: проблема была в сравнении растояний между всеми точками
|
|
min@y™ (статус: Доктор наук), 23 ноября 2011, 14:11 [#8]:
Объясни: вот взяли 2 точки, рассчитали расстояние, сравнили С ЧЕМ? И что делать в случаях, когда:
а) больше;
б) меньше;
ц) равно?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
homerchick (статус: Посетитель), 23 ноября 2011, 14:32 [#9]:
нам известно приблизительное минимальное расстояние на котором частицы ведут себя нормально.
а)если расстояние больше - идеальный вариант, частицы появляются далеко и не возникает неприятного глюка
б) если равно - 90% того что заглючит
ц) если меньше - большая проблема, частицы разлетаются с огромной скоростью, вызывая ошибку
а с чем сравнивать? если брать с запасом то МИНИМАЛЬНОЕ РАССТОЯНИЕ между точками должно быть 0.5
грубо говоря нам нужно добиться такого варианта рандомного распределения частиц по полю, чтоб они удовлетворяли условию (а)
|
|
min@y™ (статус: Доктор наук), 23 ноября 2011, 14:48 [#10]:
То есть тебе нужно создать поле точек, удовлетворяющих условию или просто проверить поле точек на соответствие условию?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
homerchick (статус: Посетитель), 23 ноября 2011, 15:04 [#11]:
именно так
|
|
min@y™ (статус: Доктор наук), 23 ноября 2011, 15:37 [#12]:
именно КАК?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
homerchick (статус: Посетитель), 23 ноября 2011, 15:40 [#13]:
создать поле точек, удовлетворяющих условию (а)
если после первой генерации поле не удовлетворяет условию генерировать его до тех пор пока не удовлетворит
|
|
min@y™ (статус: Доктор наук), 23 ноября 2011, 16:00 [#14]:
Короче, надо померить расстояния каждой точки от каждой, если найдена пара точек, НЕудовлетворяющих условию (а), сгенерировать опять, и так до бесконечности?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
homerchick (статус: Посетитель), 23 ноября 2011, 16:03 [#15]:
да,это и надо
|
|
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 (статус: Посетитель), 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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|