dW5pdCBNYWluOwoKaW50ZXJmYWNlCgp1c2VzCiAgV2luZG93cywgTWVzc2FnZXMsIFN5c1V0aWxzLCBWYXJpYW50cywgQ2xhc3NlcywgR3JhcGhpY3MsIENvbnRyb2xzLCBGb3JtcywKICBEaWFsb2dzLCBTdGRDdHJscywgU3BpbiwgRXh0Q3RybHMsIEJ1dHRvbnMsIE1hdGg7Cgp0eXBlCiAgVEZpdCA9IGNsYXNzKFRGb3JtKQogICAgU1gwOiBUU2hhcGU7CiAgICBTWTA6IFRTaGFwZTsKICAgIFNQb2ludDogVFNoYXBlOwogICAgU0VDb29yZFg6IFRTcGluRWRpdDsKICAgIFNFQ29vcmRZOiBUU3BpbkVkaXQ7CiAgICBMYWJlbDE6IFRMYWJlbDsKICAgIExhYmVsMjogVExhYmVsOwogICAgTGFiZWwzOiBUTGFiZWw7CiAgICBMUmVzdWx0OiBUTGFiZWw7CiAgICBCQkV4aXQ6IFRCaXRCdG47CiAgICBwcm9jZWR1cmUgU0VDb29yZFhDaGFuZ2UoU2VuZGVyOiBUT2JqZWN0KTsKICAgIHByb2NlZHVyZSBGb3JtQ3JlYXRlKFNlbmRlcjogVE9iamVjdCk7CiAgcHJpdmF0ZQogICAgeyBQcml2YXRlIGRlY2xhcmF0aW9ucyB9CiAgICBmdW5jdGlvbiBQb2ludEluVHJpYW5nbGUocHgsIHB5LCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzOiBJbnRlZ2VyKTogQm9vbGVhbjsKICBwdWJsaWMKICAgIHsgUHVibGljIGRlY2xhcmF0aW9ucyB9CiAgZW5kOwoKdmFyCiAgRml0OiBURml0OwoKaW1wbGVtZW50YXRpb24KCnskUiAqLmRmbX0KCmZ1bmN0aW9uIFRGaXQuUG9pbnRJblRyaWFuZ2xlKHB4LCBweSwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MzogSW50ZWdlcik6IEJvb2xlYW47CnZhcgogIGFyZWEsIGFyZWExLCBhcmVhMiwgYXJlYTM6IERvdWJsZTsKYmVnaW4KICAvLyDQktGL0YfQuNGB0LvRj9C10Lwg0L/Qu9C+0YnQsNC00Ywg0L7RgdC90L7QstC90L7Qs9C+INGC0YDQtdGD0LPQvtC70YzQvdC40LrQsAogIGFyZWEgOj0gQWJzKCh4MiAtIHgxKSAqICh5MyAtIHkxKSAtICh4MyAtIHgxKSAqICh5MiAtIHkxKSkgLyAyOwogIAogIC8vINCS0YvRh9C40YHQu9GP0LXQvCDQv9C70L7RidCw0LTQuCDRgtGA0LXRhSDQv9C+0LTRgtGA0LXRg9Cz0L7Qu9GM0L3QuNC60L7QsgogIGFyZWExIDo9IEFicygoeDEgLSBweCkgKiAoeTIgLSBweSkgLSAoeDIgLSBweCkgKiAoeTEgLSBweSkpIC8gMjsKICBhcmVhMiA6PSBBYnMoKHgyIC0gcHgpICogKHkzIC0gcHkpIC0gKHgzIC0gcHgpICogKHkyIC0gcHkpKSAvIDI7CiAgYXJlYTMgOj0gQWJzKCh4MyAtIHB4KSAqICh5MSAtIHB5KSAtICh4MSAtIHB4KSAqICh5MyAtIHB5KSkgLyAyOwogIAogIC8vINCi0L7Rh9C60LAg0LLQvdGD0YLRgNC4INGC0YDQtdGD0LPQvtC70YzQvdC40LrQsCDQtdGB0LvQuCDRgdGD0LzQvNCwINC/0LvQvtGJ0LDQtNC10Lkg0L/QvtC00YLRgNC10YPQs9C+0LvRjNC90LjQutC+0LIg0YDQsNCy0L3QsCDQv9C70L7RidCw0LTQuCDQvtGB0L3QvtCy0L3QvtCz0L4KICBSZXN1bHQgOj0gQWJzKGFyZWEgLSAoYXJlYTEgKyBhcmVhMiArIGFyZWEzKSkgJmx0OyAwLjAwMDE7CmVuZDsKCnByb2NlZHVyZSBURml0LlNFQ29vcmRYQ2hhbmdlKFNlbmRlcjogVE9iamVjdCk7CnZhcgogIFgsIFk6IEludGVnZXI7CmJlZ2luCiAgLy8g0J/QvtC70YPRh9Cw0LXQvCDQutC+0L7RgNC00LjQvdCw0YLRiyDQuNC3IFNwaW5FZGl0CiAgWCA6PSBTRUNvb3JkWC5WYWx1ZTsKICBZIDo9IFNFQ29vcmRZLlZhbHVlOwoKICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0L/QvtC/0LDQtNCw0L3QuNC1INCyINGE0LjQs9GD0YDRgyDQstCw0YDQuNCw0L3RgtCwIDIxCiAgLy8g0KbQtdC90YLRgNCw0LvRjNC90YvQuSDQutCy0LDQtNGA0LDRgiAoMTAsMTApLSgxNSwxNSkKICBpZiAoWCAmZ3Q7PSAxMCkgYW5kIChYICZsdDs9IDE1KSBhbmQgKFkgJmd0Oz0gMTApIGFuZCAoWSAmbHQ7PSAxNSkgdGhlbgogIGJlZ2luCiAgICBMUmVzdWx0LkZvbnQuQ29sb3IgOj0gY2xHcmVlbjsKICAgIExSZXN1bHQuQ2FwdGlvbiA6PSAn0J/QvtC/0LDQu9CwJzsKICBlbmQKICAvLyDQktC10YDRhdC90LjQuSDQu9C10LLRi9C5INGC0YDQtdGD0LPQvtC70YzQvdC40LogKNC+0LHRi9GH0L3Ri9C5KSAtINCy0LXRgNGI0LjQvdGLOiAoNSw1KSwgKDEwLDUpLCAoNSwxMCkKICBlbHNlIGlmIFBvaW50SW5UcmlhbmdsZShYLCBZLCA1LCA1LCAxMCwgNSwgNSwgMTApIHRoZW4KICBiZWdpbgogICAgTFJlc3VsdC5Gb250LkNvbG9yIDo9IGNsR3JlZW47CiAgICBMUmVzdWx0LkNhcHRpb24gOj0gJ9Cf0L7Qv9Cw0LvQsCc7CiAgZW5kCiAgLy8g0JLQtdGA0YXQvdC40Lkg0L/RgNCw0LLRi9C5INGC0YDQtdGD0LPQvtC70YzQvdC40LogKNGB0LrRgNGD0LPQu9C10L3QvdGL0LkpIC0g0L7QutGA0YPQttC90L7RgdGC0Ywg0LIg0LrQstCw0LTRgNCw0YLQtSAoMTUsNSktKDIwLDEwKQogIGVsc2UgaWYgKFggJmd0Oz0gMTUpIGFuZCAoWCAmbHQ7PSAyMCkgYW5kIChZICZndDs9IDUpIGFuZCAoWSAmbHQ7PSAxMCkgYW5kCiAgICAgICAgICAoU3FyKFggLSAxNSkgKyBTcXIoWSAtIDEwKSAmbHQ7PSAyNSkgdGhlbgogIGJlZ2luCiAgICBMUmVzdWx0LkZvbnQuQ29sb3IgOj0gY2xHcmVlbjsKICAgIExSZXN1bHQuQ2FwdGlvbiA6PSAn0J/QvtC/0LDQu9CwJzsKICBlbmQKICAvLyDQndC40LbQvdC40Lkg0LvQtdCy0YvQuSDRgtGA0LXRg9Cz0L7Qu9GM0L3QuNC6ICjRgdC60YDRg9Cz0LvQtdC90L3Ri9C5KSAtINC+0LrRgNGD0LbQvdC+0YHRgtGMINCyINC60LLQsNC00YDQsNGC0LUgKDUsMTUpLSgxMCwyMCkKICBlbHNlIGlmIChYICZndDs9IDUpIGFuZCAoWCAmbHQ7PSAxMCkgYW5kIChZICZndDs9IDE1KSBhbmQgKFkgJmx0Oz0gMjApIGFuZAogICAgICAgICAgKFNxcihYIC0gMTApICsgU3FyKFkgLSAxNSkgJmx0Oz0gMjUpIHRoZW4KICBiZWdpbgogICAgTFJlc3VsdC5Gb250LkNvbG9yIDo9IGNsR3JlZW47CiAgICBMUmVzdWx0LkNhcHRpb24gOj0gJ9Cf0L7Qv9Cw0LvQsCc7CiAgZW5kCiAgLy8g0J3QuNC20L3QuNC5INC/0YDQsNCy0YvQuSDRgtGA0LXRg9Cz0L7Qu9GM0L3QuNC6ICjQvtCx0YvRh9C90YvQuSkgLSDQstC10YDRiNC40L3RizogKDE1LDE1KSwgKDIwLDE1KSwgKDIwLDIwKQogIGVsc2UgaWYgUG9pbnRJblRyaWFuZ2xlKFgsIFksIDE1LCAxNSwgMjAsIDE1LCAyMCwgMjApIHRoZW4KICBiZWdpbgogICAgTFJlc3VsdC5Gb250LkNvbG9yIDo9IGNsR3JlZW47CiAgICBMUmVzdWx0LkNhcHRpb24gOj0gJ9Cf0L7Qv9Cw0LvQsCc7CiAgZW5kCiAgZWxzZQogIGJlZ2luCiAgICBMUmVzdWx0LkZvbnQuQ29sb3IgOj0gY2xSZWQ7CiAgICBMUmVzdWx0LkNhcHRpb24gOj0gJ9Cd0LUg0L/QvtC/0LDQu9CwJzsKICBlbmQ7CgogIC8vINCf0LXRgNC10LzQtdGJ0LDQtdC8INGC0L7Rh9C60YMg0L3QsCDQutC+0L7RgNC00LjQvdCw0YLQvdGD0Y4g0L/Qu9C+0YHQutC+0YHRgtGMCiAgU1BvaW50LkxlZnQgOj0gU1gwLkxlZnQgKyBSb3VuZChYICogKDI2MCAvIDI1KSkgLSAoU1BvaW50LldpZHRoIGRpdiAyKTsKICBTUG9pbnQuVG9wIDo9IFNZMC5Ub3AgLSBSb3VuZChZICogKDI1MCAvIDI1KSkgLSAoU1BvaW50LkhlaWdodCBkaXYgMik7CmVuZDsKCnByb2NlZHVyZSBURml0LkZvcm1DcmVhdGUoU2VuZGVyOiBUT2JqZWN0KTsKYmVnaW4KICAvLyDQndCw0YfQsNC70YzQvdGL0LUg0L3QsNGB0YLRgNC+0LnQutC4CiAgQ2FwdGlvbiA6PSAn0J/QvtC/0LDQtNCw0L3QuNC1INGC0L7Rh9C60Lgg0LIg0YTQuNCz0YPRgNGDICjQktCw0YDQuNCw0L3RgiAyMSknOwogIAogIC8vINCd0LDRgdGC0YDQvtC50LrQsCDQutC+0L7RgNC00LjQvdCw0YLQvdGL0YUg0L7RgdC10LkKICBTWDAuTGVmdCA6PSA1MDsKICBTWDAuVG9wIDo9IDI1MDsKICBTWDAuV2lkdGggOj0gMjYwOwogIFNYMC5IZWlnaHQgOj0gMTsKICBTWDAuQnJ1c2guQ29sb3IgOj0gY2xCbGFjazsKICBTWDAuUGVuLkNvbG9yIDo9IGNsQmxhY2s7CiAgCiAgU1kwLkxlZnQgOj0gNTA7CiAgU1kwLlRvcCA6PSAyOwogIFNZMC5XaWR0aCA6PSAxOwogIFNZMC5IZWlnaHQgOj0gMjUwOwogIFNZMC5CcnVzaC5Db2xvciA6PSBjbEJsYWNrOwogIFNZMC5QZW4uQ29sb3IgOj0gY2xCbGFjazsKICAKICAvLyDQndCw0YHRgtGA0L7QudC60LAg0YLQvtGH0LrQuAogIFNQb2ludC5XaWR0aCA6PSAxMDsKICBTUG9pbnQuSGVpZ2h0IDo9IDEwOwogIFNQb2ludC5TaGFwZSA6PSBzdENpcmNsZTsKICBTUG9pbnQuQnJ1c2guQ29sb3IgOj0gY2xSZWQ7CiAgU1BvaW50LlBlbi5Db2xvciA6PSBjbFJlZDsKICAKICAvLyDQndCw0YfQsNC70YzQvdC+0LUg0L/QvtC70L7QttC10L3QuNC1INGC0L7Rh9C60LgKICBTRUNvb3JkWC5WYWx1ZSA6PSAwOwogIFNFQ29vcmRZLlZhbHVlIDo9IDA7CiAgCiAgLy8g0J3QsNGB0YLRgNC+0LnQutCwIFNwaW5FZGl0CiAgU0VDb29yZFguTWluVmFsdWUgOj0gMDsKICBTRUNvb3JkWC5NYXhWYWx1ZSA6PSAyNTsKICBTRUNvb3JkWC5JbmNyZW1lbnQgOj0gMTsKICAKICBTRUNvb3JkWS5NaW5WYWx1ZSA6PSAwOwogIFNFQ29vcmRZLk1heFZhbHVlIDo9IDI1OwogIFNFQ29vcmRZLkluY3JlbWVudCA6PSAxOwogIAogIC8vINCd0LDRgdGC0YDQvtC50LrQsCDQutC90L7Qv9C60Lgg0LLRi9GF0L7QtNCwCiAgQkJFeGl0LktpbmQgOj0gYmtDbG9zZTsKICBCQkV4aXQuQ2FwdGlvbiA6PSAn0JLRi9GF0L7QtCc7CiAgCiAgLy8g0J3QsNGH0LDQu9GM0L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRggogIExSZXN1bHQuRm9udC5Db2xvciA6PSBjbFJlZDsKICBMUmVzdWx0LkNhcHRpb24gOj0gJ9Cd0LUg0L/QvtC/0LDQu9CwJzsKZW5kOwoKZW5kLgo=
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, ExtCtrls, Buttons, Math;
type
TFit = class(TForm)
SX0: TShape;
SY0: TShape;
SPoint: TShape;
SECoordX: TSpinEdit;
SECoordY: TSpinEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
LResult: TLabel;
BBExit: TBitBtn;
procedure SECoordXChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
function PointInTriangle(px, py, x1, y1, x2, y2, x3, y3: Integer): Boolean;
public
{ Public declarations }
end;
var
Fit: TFit;
implementation
{$R *.dfm}
function TFit.PointInTriangle(px, py, x1, y1, x2, y2, x3, y3: Integer): Boolean;
var
area, area1, area2, area3: Double;
begin
// Вычисляем площадь основного треугольника
area := Abs((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2;
// Вычисляем площади трех подтреугольников
area1 := Abs((x1 - px) * (y2 - py) - (x2 - px) * (y1 - py)) / 2;
area2 := Abs((x2 - px) * (y3 - py) - (x3 - px) * (y2 - py)) / 2;
area3 := Abs((x3 - px) * (y1 - py) - (x1 - px) * (y3 - py)) / 2;
// Точка внутри треугольника если сумма площадей подтреугольников равна площади основного
Result := Abs(area - (area1 + area2 + area3)) < 0.0001;
end;
procedure TFit.SECoordXChange(Sender: TObject);
var
X, Y: Integer;
begin
// Получаем координаты из SpinEdit
X := SECoordX.Value;
Y := SECoordY.Value;
// Проверяем попадание в фигуру варианта 21
// Центральный квадрат (10,10)-(15,15)
if (X >= 10) and (X <= 15) and (Y >= 10) and (Y <= 15) then
begin
LResult.Font.Color := clGreen;
LResult.Caption := 'Попала';
end
// Верхний левый треугольник (обычный) - вершины: (5,5), (10,5), (5,10)
else if PointInTriangle(X, Y, 5, 5, 10, 5, 5, 10) then
begin
LResult.Font.Color := clGreen;
LResult.Caption := 'Попала';
end
// Верхний правый треугольник (скругленный) - окружность в квадрате (15,5)-(20,10)
else if (X >= 15) and (X <= 20) and (Y >= 5) and (Y <= 10) and
(Sqr(X - 15) + Sqr(Y - 10) <= 25) then
begin
LResult.Font.Color := clGreen;
LResult.Caption := 'Попала';
end
// Нижний левый треугольник (скругленный) - окружность в квадрате (5,15)-(10,20)
else if (X >= 5) and (X <= 10) and (Y >= 15) and (Y <= 20) and
(Sqr(X - 10) + Sqr(Y - 15) <= 25) then
begin
LResult.Font.Color := clGreen;
LResult.Caption := 'Попала';
end
// Нижний правый треугольник (обычный) - вершины: (15,15), (20,15), (20,20)
else if PointInTriangle(X, Y, 15, 15, 20, 15, 20, 20) then
begin
LResult.Font.Color := clGreen;
LResult.Caption := 'Попала';
end
else
begin
LResult.Font.Color := clRed;
LResult.Caption := 'Не попала';
end;
// Перемещаем точку на координатную плоскость
SPoint.Left := SX0.Left + Round(X * (260 / 25)) - (SPoint.Width div 2);
SPoint.Top := SY0.Top - Round(Y * (250 / 25)) - (SPoint.Height div 2);
end;
procedure TFit.FormCreate(Sender: TObject);
begin
// Начальные настройки
Caption := 'Попадание точки в фигуру (Вариант 21)';
// Настройка координатных осей
SX0.Left := 50;
SX0.Top := 250;
SX0.Width := 260;
SX0.Height := 1;
SX0.Brush.Color := clBlack;
SX0.Pen.Color := clBlack;
SY0.Left := 50;
SY0.Top := 2;
SY0.Width := 1;
SY0.Height := 250;
SY0.Brush.Color := clBlack;
SY0.Pen.Color := clBlack;
// Настройка точки
SPoint.Width := 10;
SPoint.Height := 10;
SPoint.Shape := stCircle;
SPoint.Brush.Color := clRed;
SPoint.Pen.Color := clRed;
// Начальное положение точки
SECoordX.Value := 0;
SECoordY.Value := 0;
// Настройка SpinEdit
SECoordX.MinValue := 0;
SECoordX.MaxValue := 25;
SECoordX.Increment := 1;
SECoordY.MinValue := 0;
SECoordY.MaxValue := 25;
SECoordY.Increment := 1;
// Настройка кнопки выхода
BBExit.Kind := bkClose;
BBExit.Caption := 'Выход';
// Начальный результат
LResult.Font.Color := clRed;
LResult.Caption := 'Не попала';
end;
end.