Функция определения пересечения 2-х отрезков
|
Не параллельные отрезки:
=>
Если , то отрезки параллельны.
|
Теперь сама функция:
function intersection( x1,y1,x2,y2,x3,y3,x4,y4 : extended ):boolean;
var delta,c,d : extended;
begin
delta := -(x2-x1)*(y4-y3)+(y2-y1)*(x4-x3);
// В случае, когда отрезки параллельны, в этой программе мы можем считать,
// что они не пересекаются.
if abs(delta) < eps then begin result:=false; exit; end;
// Если отрезки непараллельные, то ищем коэффициенты при векторах
c := (-(x3-x1)*(y4-y3)+(y3-y1)*(x4-x3))/delta;
d := ((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1))/delta;
result := (eps < c) and (c < 1-eps) and
(eps < d) and (d < 1-eps);
end;
Окна помощи
Для всех задач используется один компонент «Окно помощи» TFHelp. Помощь к конкретной игре помещается в поле Rules. При выводе (метод Show) форма изменяет размеры подстраиваясь под содержимое поля Rules. Поле DontShowOnStart «Не показывать это окно при запуске» обрабатывается в других формах (т.е. внутри этой формы не значение поля не используется).
Задача «Шахматы со спящим противником»
Стоит задача – съесть как можно больше черных фигур белым конём. При данном на конкурс расположении можно съесть все фигуры.
Участник можете передвигать только одну фигуру – белого коня. Передвижение осуществляется при помощи «мыши» с помощью стандартной операции «Drag and drop», то есть: нужно навести курсор мыши на коня, нажать левую кнопку мыши, потом (не отпуская левой кнопки мыши) подвести курсор мыши туда, куда нужно поставить коня и отпустить левую кнопку мыши (перетащить коня).
В начале белый конь стоит в левой нижней клетке поля. Клетки, куда он может ходить, подсвечиваются красными квадратиками. Клетки, которые «бьют» чёрные фигуры, подсвечены зеленым цветом.
Кнопка «Помощь» служит для открытия окна с описанием задания.
Кнопка «Выход» служит для закрытия окна задачи. Если при нажатии на кнопку «Выход» состояние игрового поля не сохранено, выводится предупреждающее окно.
Кнопка «Откат» служит для отмены последнего хода.
В поле «Список ходов» записываются ходы участника. Если при очередном ходе участник «съел» чёрную фигуру, то название фигуры указывается после хода.
В поле «Рекорд» записывается текущее минимальное число ходов, за которые участник смог съесть все фигуры.
Поле «Осталось чёрных фигур» содержит количество оставшихся чёрных фигур.
Группа «Загрузка / сохранение»:
«Начать заново» - отменить все сделанные ходы и начать игру заново;
«Загрузить поле» - загрузить ранее сохранённое состояние игры из файла. При нажатии на кнопку появляется стандартное диалоговое окно, в котором можно выбрать имя файла.
«Сохранить поле» - записать состояние игры в файл. При нажатии на кнопку появляется стандартное диалоговое окно, в котором можно выбрать имя для файла. Расширение для файлов в этой задаче «.map».
Данные рекорда автоматически сохраняются в каталог Olymp. Эти данные используются при сборе данных для отправки на сайт в форме FUpload.
Задача «Меандры»
Задача «Автомат для голосования»
-
Не допустить пересечение элементов
Список элементов хранится в списке ElementsList. При создании/перетаскивании элемента проверяем, не пересекается ли его прямоугольник с прямоугольниками другх элементов, окружающие элементы (прямоугольники выбираются «с запасом» по краям). Если пересекаются, то не допускаем такое перемещение.
Определить, пересекаются ли прямоугольники можно следующим образом:
Проверить для каждой из 4-х вершин каждого прямоугольника, лежит ли она внутри другого прямоугольника.
Условие, что точка лежит внутри прямоугольника:
,
где - координаты точки,
- координаты верхнего левого угла прямоугольника,
- координаты левого нижнего угла прямоугольника.
Координаты отсчитываются от верхнего левого угла. Ось направлена вправо, ось направлена вниз.
Условие пересечения прямоугольников.
Пусть - параметры первого прямоугольника,
- параметры второго прямоугольника,
Тогда условие пересечения запишется в виде восьми копий условия, что точка лежит внутри прямоугольника:
// Точка внутри прямоугольника
function Point_In_Rect( X,Y:Integer; R:TRect ):boolean;
begin
Result := (R.Left <= X) and (X <= R.Right) and
(R.Top <= Y) and (Y <= R.Right);
end;
// Пересечение двух прямоугольников
function Rect_Intersect( R1,R2 : TRect ):boolean;
begin
Result := Point_In_Rect( R1.Left, R1.Top, R2 ) or
Point_In_Rect( R1.Right, R1.Top, R2 ) or
Point_In_Rect( R1.Left, R1.Bottom, R2 ) or
Point_In_Rect( R1.Right, R1.Bottom, R2 ) or
Point_In_Rect( R2.Left, R2.Top, R1 ) or
Point_In_Rect( R2.Right, R2.Top, R1 ) or
Point_In_Rect( R2.Left, R2.Bottom, R1 ) or
Point_In_Rect( R2.Right, R2.Bottom, R1 );
end;
Загрузка решений на сайт
Отправление из PHP письма с вложением
Как послать письмо в HTML виде? Присоедините к письму аттач с названием message.html и письмо превратиться в HTML-письмо!
|