Полигон - Pascal
Формулировка задачи:
В Паскале вот этот "страх" решите пожалуйста) буду оч благодарна...
Дан полигон, необязательно выпуклый. Дана точка P с координатами х0 у0. Определяется, находится ли точка Р внутри полигона.
файл Пол.тхт содержит в первой строке координаты Р. Во второй количество вершин полигона. и далее координаты вершин.
ввод
12 6
16
3 2
3 11
13 11
13 10
7 10
7 9
13 9
13 8
7 8
7 4
11 4
11 6
8 6
8 7
13 7
13 2
вывод ДА
Ребята, что никто не попробует даже?(
Решение задачи: «Полигон»
textual
Листинг программы
program n29; const e=0.0001; type polygon=record x,y:real; end; mas=array[1..50] of polygon; function check (n:integer; x,y:real; a:mas):boolean; function geron (x1,y1,x2,y2,x3,y3:real):real; function d (x1,y1,x2,y2:real):real; begin d:=sqrt(sqr(x2-x1)+sqr(y2-y1)); end; var a,b,c,p:real; begin a:=d(x1,y1,x2,y2); b:=d(x2,y2,x3,y3); c:=d(x3,y3,x1,y1); p:=(a+b+c)/2; geron:=sqrt(p*(p-a)*(p-b)*(p-c)); end; var i,j:integer; s,s1:real; begin s:=0;s1:=0; for j:=2 to n-1 do s:=s+geron(a[1].x,a[1].y,a[j].x,a[j].y,a[j+1].x,a[j+1].y); for j:=1 to n-1 do s1:=s1+geron(a[j].x,a[j].y,a[j+1].x,a[j+1].y,x,y); s1:=s1+geron(a[1].x,a[1].y,a[n].x,a[n].y,x,y); check:=abs(s1-s)<e; end; var a:mas; n,i:integer; x,y:real; BEGIN write('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® бв®а®* ¬*®Ј®гЈ®«м*ЁЄ* n='); readln(n); writeln('‚ўҐ¤ЁвҐ Є®®а¤Ё**вл Їа®Ё§ў®«м*®© в®зЄЁ'); readln(x,y); for i:=1 to n do begin writeln('‚ўҐ¤ЁвҐ Є®®а¤Ё**вл ',i,' в®зЄЁ ¬*®Ј®гЈ®«м*ЁЄ*'); readln(a[i].x,a[i].y); end; writeln(check(n,x,y,a)); readln END.
Объяснение кода листинга программы
- const - объявляются константы e и n
- type - объявляется тип данных polygon
- var - объявляются переменные a, b, c, p, i, j, s, s1, x, y
- function - объявляются функции check, geron, d
- begin - начинается выполнение программы
- s := 0; s1 := 0; - инициализируются переменные s и s1
- for j := 2 to n-1 do - выполняется цикл for j от 2 до n-1 s := s + geron(a[1].x, a[1].y, a[j].x, a[j].y, a[j+1].x, a[j+1].y); - вычисляется значение s for j := 1 to n-1 do - выполняется еще один цикл for j от 1 до n-1 s1 := s1 + geron(a[j].x, a[j].y, a[j+1].x, a[j+1].y, x, y); - вычисляется значение s1 s1 := s1 + geron(a[1].x, a[1].y, a[n].x, a[n].y, x, y); - добавляется последний элемент check := abs(s1 - s) < e; - проверяется условие
- end; - завершается цикл
- var - объявляются переменные a, b, c, p, i, j, s, s1, x, y
- BEGIN - начинается блок BEGIN
- write('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® бв®а® ¬®Ј®гЈ®«мЁЄ n='); - выводится значение переменной n
- readln(n); - считывается значение n
- writeln('‚ўҐ¤ЁвҐ Є®®а¤Ё*вл Їа®Ё§ў®«м®© в®зЄЁ'); - выводится значение переменной x
- readln(y); - считывается значение y
- for i := 1 to n do begin - выполняется цикл for i от 1 до n writeln('‚ўҐ¤ЁвҐ Є®®а¤Ё*вл ',i,' в®зЄЁ ¬®Ј®гЈ®«мЁЄ'); - выводится значение переменной i readln(a[i].x, a[i].y); - считывается значение x и y для i-го элемента end; - завершается цикл
- writeln(check(n,x,y,a)); - выводится результат проверки
- readln(); - считывается символ новой строки
- END. - завершается блок BEGIN