Мне внезапно пришло в голову, что программа не всегда будет работать правильно. Если разность полярных углов для последовательных точек окажется
, то может получиться самопересекающаяся линия.
Исправить можно так: найдём наименьшее значение координаты
для всех заданных точек (пусть это
), а потом в качестве полюса возьмём точку
.
Это сильно упростит и вычисление угла. Не нужно проверять никаких условий, нужен только один оператор
Код:
t.x:=180*arctan(p.y/(p.x-x_m+1))/Pi;
Кроме того, как я уже писал, достаточно сортировать один раз, если проверять оба условия.
А драйвер можно пристыковать к прогамме, тогда не будет проблем с его поиском:
Код:
{************************************************}
{ }
{ BGI Demo Program }
{ Copyright (c) 1992 by Borland International }
{ }
{************************************************}
unit BGIDriv;
{
Sample unit to accompany BGILINK.PAS. This unit links the BGI graphics
driver into a single TPU file. This makes it easy to link the driver files
directly into an .EXE file. See BGILINK.PAS for more information.
}
interface
procedure ATTDriverProc;
procedure CgaDriverProc;
procedure EgaVgaDriverProc;
procedure HercDriverProc;
procedure PC3270DriverProc;
implementation
procedure ATTDriverProc; external;
{$L ATT.OBJ }
procedure CgaDriverProc; external;
{$L CGA.OBJ }
procedure EgaVgaDriverProc; external;
{$L EGAVGA.OBJ }
procedure HercDriverProc; external;
{$L HERC.OBJ }
procedure PC3270DriverProc; external;
{$L PC3270.OBJ }
end.
Код:
{************************************************}
{ }
{ BGI Demo Program }
{ Copyright (c) 1992 by Borland International }
{ }
{************************************************}
unit BGIFont;
{ Sample unit to accompany BGILINK.PAS. This unit links all the BGI graphics
fonts into a single TPU file. This makes it easy to incorporate the font
files directly into an .EXE file. See BGILINK.PAS for more information.
}
interface
procedure GothicFontProc;
procedure SansSerifFontProc;
procedure SmallFontProc;
procedure TriplexFontProc;
implementation
procedure GothicFontProc; external;
{$L GOTH.OBJ }
procedure SansSerifFontProc; external;
{$L SANS.OBJ }
procedure SmallFontProc; external;
{$L LITT.OBJ }
procedure TriplexFontProc; external;
{$L TRIP.OBJ }
end.
Код:
Unit BGILink;
{$B-,D-,E-,G+,I-,L-,N-,O-,Q-,R-,S-,V-,X+}
Interface
Var
GraphDriver,GraphMode:Integer;
Implementation
Uses Graph,BGIDriv,BGIFont;
{$B-,F+,I-,Q-,S-,V-}
Procedure Abort(Msg:String);
Begin
WriteLn(Msg,': ',GraphErrorMsg(GraphResult));
Halt(1);
End;
Begin
{Регистрация всех драйверов.}
If RegisterBGIDriver(@CGADriverProc) < 0 then Abort('CGA');
If RegisterBGIDriver(@EGAVGADriverProc) < 0 then Abort('EGA/VGA');
If RegisterBGIDriver(@HercDriverProc) < 0 then Abort('Herc');
If RegisterBGIDriver(@ATTDriverProc) < 0 then Abort('AT&T');
If RegisterBGIDriver(@PC3270DriverProc) < 0 then Abort('PC 3270');
{Регистрация всех шрифтов.}
If RegisterBGIFont(@GothicFontProc) < 0 then Abort('Gothic');
If RegisterBGIFont(@SansSerifFontProc) < 0 then Abort('SansSerif');
If RegisterBGIFont(@SmallFontProc) < 0 then Abort('Small');
If RegisterBGIFont(@TriplexFontProc) < 0 then Abort('Triplex');
{Проверка работоспособности графического режима.}
GraphDriver:=Detect;
InitGraph(GraphDriver,GraphMode,'');
If GraphResult<>grOk then
Begin
Writeln('Graphics init error: ',GraphErrorMsg(GraphDriver));
Halt(1);
End;
CloseGraph;
End.
В строке Uses нужно добавить BGILink. Из приведённых модулей можно выкинуть всё ненужное, в частности, все шрифты, поскольку они не русифицированные (и тогда ссылка на BGIFont не нужна), и из всех драйверов оставить только EGAVGA.