Функция определения пересечения 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-письмо!
// Функции. Можно вынести в дpугой файл.
class html_mime_mail {
var $headers;
var $multipart;
var $mime;
var $html;
var $parts = array();
function html_mime_mail($headers="") {
$this->headers=$headers;
}
function add_html($html="") {
$this->html.=$html;
}
function build_html($orig_boundary,$kod) {
$this->multipart.="--$orig_boundary\n";
if ($kod=='w' || $kod=='win' || $kod=='windows-1251') $kod='windows-1251';
else $kod='koi8-r';
$this->multipart.="Content-Type: text/html; charset=$kod\n";
$this->multipart.="BCC: del@ipo.spb.ru\n";
$this->multipart.="Content-Transfer-Encoding: Quot-Printed\n\n";
$this->multipart.="$this->html\n\n";
}
function add_attachment($path="", $name = "", $c_type="application/octet-stream") {
if (!file_exists($path.$name)) {
print "File $path.$name dosn't exist.";
return;
}
$fp=fopen($path.$name,"r");
if (!$fp) {
print "File $path.$name coudn't be read.";
return;
}
$file=fread($fp, filesize($path.$name));
fclose($fp);
$this->parts[]=array("body"=>$file, "name"=>$name,"c_type"=>$c_type);
}
function build_part($i) {
$message_part="";
$message_part.="Content-Type: ".$this->parts[$i]["c_type"];
if ($this->parts[$i]["name"]!="")
$message_part.="; name = \"".$this->parts[$i]["name"]."\"\n";
else
$message_part.="\n";
$message_part.="Content-Transfer-Encoding: base64\n";
$message_part.="Content-Disposition: attachment; filename = \"".
$this->parts[$i]["name"]."\"\n\n";
$message_part.=chunk_split(base64_encode($this->parts[$i]["body"]))."\n";
return $message_part;
}
function build_message($kod) {
$boundary="=_".md5(uniqid(time()));
$this->headers.="MIME-Version: 1.0\n";
$this->headers.="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$this->multipart="";
$this->multipart.="This is a MIME encoded message.\n\n";
$this->build_html($boundary,$kod);
for ($i=(count($this->parts)-1); $i>=0; $i--)
$this->multipart.="--$boundary\n".$this->build_part($i);
$this->mime = "$this->multipart--$boundary--\n";
}
function send($server, $to, $from, $subject="", $headers="") {
$headers="To: $to\nFrom: $from\nSubject: $subject\nX-Mailer: The Mouse!\n$headers";
$fp = fsockopen($server, 25, &$errno, &$errstr, 30);
if (!$fp)
die("Server $server. Connection failed: $errno, $errstr");
fputs($fp,"HELO $server\n");
fputs($fp,"MAIL FROM: $from\n");
fputs($fp,"RCPT TO: $to\n");
fputs($fp,"DATA\n");
fputs($fp,$this->headers);
if (strlen($headers))
fputs($fp,"$headers\n");
fputs($fp,$this->mime);
fputs($fp,"\n.\nQUIT\n");
while(!feof($fp))
$resp.=fgets($fp,1024);
fclose($fp);
}
}
// *************************************************************************
//
// В качестве аттача пpисоединяем html-письмо (открывается автоматически).
// Второй аттач - некоторый файл из каталога.
// Вот так вызывать все то, что написано выше:
//
// *************************************************************************
$mail=new html_mime_mail();
$mail->add_html("Пpивет!
".
" Посылаю двоичный файл [/bin/ls] ...".
" |