Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Тип точка-вектор
- type Point = record
- x,y: real;
- class function operator-(p1, p2: Point): Point;
- begin
- Result.x := p1.x - p2.x;
- Result.y := p1.y - p2.y;
- end;
- end;
- // Создание точки
- function Pnt(x, y: real): Point;
- begin
- Result.x := x;
- Result.y := y
- end;
- // Косое произведение векторов (cross-product)
- function cP(p1, p2: Point): real;
- begin
- Result := p1.x * p2.y - p1.y * p2.x;
- end;
- begin
- var (x1, y1) := ReadInteger2('Координаты точки A:');
- var a := pnt(x1, y1);
- var (x2, y2) := ReadInteger2('Координаты точки B:');
- var b := pnt(x2, y2);
- var (x3, y3) := ReadInteger2('Координаты точки C:');
- var c := pnt(x3, y3);
- var (x4, y4) := ReadInteger2('Координаты точки D:');
- var d := pnt(x4, y4);
- //Найдем координаты векторов AB, BC, CD, AD, а также BD и AC
- var ab := b - a;
- var bc := c - b;
- var cd := d - c;
- var ad := d - a;
- var ac := c - a;
- var bd := d - b;
- // Вычислим косое произведение для AB и AC, AD
- // Если эти произведения одного знака, то точки лежат по одну сторону от AB
- // Если это будет справедливо для других сторон, то ABCD - выпуклый 4-угольник
- if not sign(cP(ab, ac)) = sign(cP(ab, ad)) then
- begin
- println('Невыпуклый');
- exit;
- end;
- if not sign(cP(bc, bd)) = sign(cP(bc, Pnt(0,0)-ab)) then
- begin
- println('Невыпуклый');
- exit;
- end;
- if not sign(cP(bc, bd)) = sign(cP(bc, Pnt(0,0)-ab)) then
- begin
- println('Невыпуклый');
- exit;
- end;
- if not sign(cP(cd, Pnt(0,0)-bc)) = sign(cP(cd, Pnt(0,0)-ac)) then
- begin
- println('Невыпуклый');
- exit;
- end;
- if not sign(cP(Pnt(0,0)-ad, Pnt(0,0)-bd)) = sign(cP(cd, Pnt(0,0)-cd)) then
- begin
- println('Невыпуклый');
- exit;
- end;
- println('Выпуклый 4-угольник');
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement