dimitriy7

BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору IbragimOFF До выходных точно уложимся... Пишу в блокноте, компилирую консольным FPC под win32, но по идее должно быть совместимо с TP7. А вообще идея такая: есть линия ("земля"), есть два квадрата - каждый описывается 4-мя парами чисел (координаты углов). Соединяющие их отрезки тоже понадобятся, например между (x1,y1) и (x2,y2) получится (y-y1)/(y2-y1)=(x-x1)/(x2-x1). Будут еще две точки - соприкосновения нижнего квадрата с землей и квадратов между собой (например r1 и r2). Теперь примерный алгоритм действий: Задаем начальное положение квадратов, задав координаты вершин. Затем в цикле: 1. Поворачиваем нижний квадрат на малый угол вокруг r1 - пересчитываем координаты его углов, а также точки r2. Переписываем соединяющие их отрезки. 2. Определяем, на сколько сдвинулась точка r2 по x и у (назовем dx и dy). 3. Для координат вершин верхнего квадрата делаем параллельный перенос на (dx,dy) и поворот на малый угол вокруг r2. 4. Самое трудоемкое и вычислительнозатратное - проверяем, не уперся ли какой квадрат каким-нибудь своим углом в сторону другого квадрата или в землю (для этого и надо знать уравнения сторон квадратов). Если вдруг уперся - вычисляем новые r1 и/или r2 для следующей итерации. 5. Затираем картинку на экране и рисуем новую. В win32 процесс небыстрый (стандартный graph в FPC притормаживает и заметно мерцает, а openGL в TP7 нет). Может, если скомпилировать TP и запустить под чистым дос, будет быстрее? Достать TP7 и попробовать на dosbox, что ли... Повторяем цикл, пока не надоест. Как-то так... P.S. перенос делается просто: x'=x+dx, y'=y+dy поворот на угол w вокруг точки (x0,y0) посложнее: x'=(x-x0)*cos(w)-(y-y0)*sin(w)+x0, y'=(x-x0)*sin(w)+(y-y0)*cos(w)+y0 и крутить придется в общей сложности 9 точек за каждый шаг цикла -> тормоза... PPS. Наверняка есть алгоритм попроще, только я его не знаю Добавлено: frost12 1. На отрицательных - не факт, что TP-шный idiv не заглючит... но ты сам попробуй: В самой процедуре замени div num на idiv num и сразу проверь DX на знак - там будет ОТРИЦАТЕЛЬНЫЙ остаток, если AX перед делением было <0 числа генерируй c[i]:=trunc(40*random-20); ну, еще замени word на integer Получится-отпиши! (главное, посмотри чтобы не писал ерунду в выводе average = ) Все элементы в массиве С[1..30], меньше среднего ариф- метического положительных чисел, заменить на макси- мальное значение массива. Или я не понял и в массиве могут быть любые числа, а среднее считаем только по положительным, не учитывая отрицательные? вроде такого: МАССИВ: 1 1 -2 0 3 -6 5 -4 -8 4 "как_бы_среднее"=(1+1+3+5+4)/5=2 (и 4 в остатке) ? 2. А у меня прекрасно выводится... Вот, например, вывод ZADACHA2.EXE > ZADACHA2.TXT Код: elements of array: -3 9 -9 -9 -6 0 -6 0 6 9 0 0 5 -7 3 0 6 2 4 7 -8 6 -7 -7 -6 zeros between min. and max. elements of array: 2 Press ENTER to exit | Вроде макс. элемент = 9 (№10), мин. = -9 (№4), между ними 2 нуля. | Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 21:20 20-12-2011 | Исправлено: dimitriy7, 22:25 20-12-2011 |
|