// PascalABC.NET 3.3, сборка 1627 от 27.01.2018 // Внимание! Если программа не работает, обновите версию!
begin var n:=4; var xp:=new real[n]; var yp:=new real[n]; Writeln('Введите парами координаты четырех вершин'); for var i:=0 to n-1 do Read(xp[i],yp[i]); var (x,y):=ReadReal2('Введите координаты точки:'); var (i,j,c):=(0,n-1,False); while i<n do begin if ((yp[i]<=y) and (y<yp[j]) or (yp[j]<=y) and (y<yp [i])) and (x<(xp[j]-xp[i])*(y-yp[i])/(yp[j]-yp[i])+xp[i]) then c:=not c; j:=i; i+=1; end; if c then Writeln('Внутри') else Writeln('Не внутри') end.
Примеры Введите парами координаты четырех вершин 1 4 6 9 9 6 4 1 Введите координаты точки: 1.5 1.6 Не внутри
Введите парами координаты четырех вершин 1 4 6 9 9 6 4 1 Введите координаты точки: 4 7 Внутри
Function sq(var x1,y1,x2,y2,x3,y3: real):real; begin // вычисляем площадь треугольника с // векторного произведения sq:=abs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))/2; end; // основная программа var x,y,x1,y1,x2,y2,x3,y3,x4,y4,st,sp:real; begin write('координаты 4 вершин x1 y1 x2 y2 x3 y3 x4 y4 через пробел: '); readln(x1,y1,x2,y2,x3,y3,x4,y4); sp:=2*sq(x1,y1,x2,y2,x3,y3); write('координаты точки x y через пробел: '); readln(x,y); st:=sq(x1,y1,x2,y2,x,y) + sq(x2,y2,x3,y3,x,y) + sq(x3,y3,x4,y4,x,y) + sq(x4,y4,x1,y1,x,y); if abs(sp-st)<1.0e-9 then writeln('точка принадлежит прямоугольнику') else writeln('точка не принадлежит прямоугольнику'); end.
координаты 4 вершин x1 y1 x2 y2 x3 y3 x4 y4 через пробел: 1 4 6 9 9 6 4 1 координаты точки x y через пробел: 4 7 точка принадлежит прямоугольнику
координаты 4 вершин x1 y1 x2 y2 x3 y3 x4 y4 через пробел: 1 4 6 9 9 6 4 1 координаты точки x y через пробел: 1.5 1.6 точка не принадлежит прямоугольнику
// Внимание! Если программа не работает, обновите версию!
begin
var n:=4;
var xp:=new real[n];
var yp:=new real[n];
Writeln('Введите парами координаты четырех вершин');
for var i:=0 to n-1 do Read(xp[i],yp[i]);
var (x,y):=ReadReal2('Введите координаты точки:');
var (i,j,c):=(0,n-1,False);
while i<n do begin
if ((yp[i]<=y) and (y<yp[j]) or (yp[j]<=y) and (y<yp [i]))
and (x<(xp[j]-xp[i])*(y-yp[i])/(yp[j]-yp[i])+xp[i]) then c:=not c;
j:=i;
i+=1;
end;
if c then Writeln('Внутри')
else Writeln('Не внутри')
end.
Примеры
Введите парами координаты четырех вершин
1 4 6 9 9 6 4 1
Введите координаты точки: 1.5 1.6
Не внутри
Введите парами координаты четырех вершин
1 4 6 9 9 6 4 1
Введите координаты точки: 4 7
Внутри
begin
// вычисляем площадь треугольника с
// векторного произведения
sq:=abs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))/2;
end;
// основная программа
var x,y,x1,y1,x2,y2,x3,y3,x4,y4,st,sp:real;
begin
write('координаты 4 вершин x1 y1 x2 y2 x3 y3 x4 y4 через пробел: ');
readln(x1,y1,x2,y2,x3,y3,x4,y4);
sp:=2*sq(x1,y1,x2,y2,x3,y3);
write('координаты точки x y через пробел: '); readln(x,y);
st:=sq(x1,y1,x2,y2,x,y) + sq(x2,y2,x3,y3,x,y) +
sq(x3,y3,x4,y4,x,y) + sq(x4,y4,x1,y1,x,y);
if abs(sp-st)<1.0e-9 then
writeln('точка принадлежит прямоугольнику')
else writeln('точка не принадлежит прямоугольнику');
end.
координаты 4 вершин x1 y1 x2 y2 x3 y3 x4 y4 через пробел: 1 4 6 9 9 6 4 1
координаты точки x y через пробел: 4 7
точка принадлежит прямоугольнику
координаты 4 вершин x1 y1 x2 y2 x3 y3 x4 y4 через пробел: 1 4 6 9 9 6 4 1
координаты точки x y через пробел: 1.5 1.6
точка не принадлежит прямоугольнику