Я пытаюсь написать Java-программу для поддержки моделирования с ограниченным анализом с неравновесной диффузией. Базовый код для моделирования движущейся частицы находится на месте, пока указанная частица не ударит по статической центральной частице. В этот момент я стараюсь, чтобы движущаяся частица просто касалась статической. Однако по неизвестным причинам он иногда терпит неудачу (первые 2 из 8 частиц пересекаются, остальные 6 - прекрасны).Круг для столкновения круга
Вот код:
boolean killed, collide;
double xp, yp, dx, dy, theta, xpp, ypp, length;
int xc = 200;
int yc = 200;
int killRadius = 200;
int releaseRadius = 150;
int partRadius = 14;
int partDiam = 2 * partRadius;
drawCircle(xc, yc, killRadius); // kill
drawCircle(xc, yc, releaseRadius); // release
drawCircle(xc, yc, partRadius); // center particle
//while (true) {
killed = false;
collide = false;
theta = Math.random() * Math.PI * 2;
xp = xc + releaseRadius * Math.cos(theta);
yp = yc + releaseRadius * Math.sin(theta);
while (true) {
theta = Math.random() * Math.PI * 2;
length = partDiam;
xpp = xp;
ypp = yp;
xp = xp + length * Math.cos(theta);
yp = yp + length * Math.sin(theta);
//drawCircle((int) xp, (int) yp, partRadius);
// Should it be killed ? (maybe could use a box to fasten
// computations...
// Would switching the test for kill w test for collision
// improve perf ?
dx = xp - xc;
dy = yp - yc;
if ((dx * dx) + (dy * dy) > killRadius * killRadius) {
killed = true;
break;
}
// Does it collide with center? replace by any particle...
dx = xp - xc;
dy = yp - yc;
if ((dx * dx) + (dy * dy) < (partDiam) * (partDiam)) {
collide = true;
break;
}
}
// Probably something is wrong here...
if (collide) {
// no absolute value because particles move at most by diameter
double depthPenetration = partDiam
- Math.sqrt((dx * dx) + (dy * dy));
dx = xpp - xp;
dy = ypp - yp;
// shorten distance travelled by penetration length to ensure
// that
// particle is tangeant
length = Math.sqrt((dx * dx) + (dy * dy)) - depthPenetration;
xp = xpp + length * Math.cos(theta);
yp = ypp + length * Math.sin(theta);
drawCircle((int) xp, (int) yp, partRadius);
}
//}
Конечно, я проверил много ссылок, прежде чем спрашивать, но не может найти ничего плохого с кодом ... Помощь будет оценена.
Слишком много кода для отладки. Начнем с того, какой результат вы получаете и чего вы ожидаете? – djechlin
Если бы я был вами, я бы создал серию модульных тестов, которые проверяют вычисления. –
Должен ли я признать, что мне все еще сложно понять, что вы пытаетесь сделать гораздо меньше, чем вопрос о том, что вы хотите исправлять? Каковы проблематичные симптомы, что вы ожидаете, и что вы получаете? – trumpetlicks