Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Программа, проверяющая поподает ли точка M(x,y) в заданную область

Автор: Kosmik 27.11.2009 22:22

Написать программу, проверяющую, попадает ли точка M(x,y) с координатами x и y в заданную область. Нарисовать заданный рисунок в графическом режиме и закрасить ту область, в которую попала точка.
Написать программу, которая по заданной области автоматически составляет Паскаль-программу, проверяющую, попадает ли точка M(x,y) с координатами x и y в эту область.

Прикрепленное изображение

Для решения задачи организуйте арифметический цикл с заранее известным числом повторений.

Напишите, какие появились идеи на счет решения этой задачи...

График я сейчас попытаюсь сделать...в остальном возникли затруднения.

Автор: Archon 27.11.2009 23:35

Цитата
Написать программу, которая по заданной области автоматически составляет Паскаль-программу, проверяющую, попадает ли точка M(x,y) с координатами x и y в эту область.
А в каком виде задается область?

Автор: Kosmik 28.11.2009 0:58

Цитата(Archon @ 27.11.2009 21:35) *

А в каком виде задается область?


В заштрихованную область...там на рисунке отмечено.

Автор: Archon 28.11.2009 2:29

У тебя же два задания, верно? Как я понимаю, изображение относится к первому. Условие для него такое (я потестировал, но ты лучше сама проверь, мало ли):

(y <= 0) and (x <= 0) and ((sqr(x+2) + sqr(y) <= 4) xor ((y < (x+2)*2/3) and (y > (x+3.6641)*(-0.2837)-1.1094)))
Нарисовать картинку на экране, думаю, дело техники.

А вот со вторым заданием непонятно. Судя по всему на вход программе должна поступать некоторым образом заданная область, а на выходе она должна выдавать программу на Паскале. Вот я и спрашиваю, в каком виде должна задаваться эта область. Ну не рисунок же программа разбирать должна. Кстати, вот это:
Цитата
Для решения задачи организуйте арифметический цикл с заранее известным числом повторений.
к какой задаче относится?

Автор: Kosmik 28.11.2009 3:27

График я нарисовала...какой уж получился...простой такой правда...


program graphik;
uses crt,graph;

var gd,gm:integer;
fun:string;

procedure osicoordinat;
const step=25;
var x1,y1,r:integer;
s:string;
begin
line(210,240,440,240);
line(320,140,320,330);
line(430,235,440,240);
line(430,245,440,240);
line(315,150,320,140);
line(325,150,320,140);
outtextxy(330,140,'Y');
outtextxy(435,220,'X');
y1:=240; x1:=320; r:=0;
str(r div step, S);
outtextxy(x1-10,y1+6,S);
while x1+r<420 do
begin
r:=r+step;
str(r div step, S);
settextjustify (1,1);
outtextxy(x1+r,y1+10,S);
s:='-'+S;
outtextxy(x1-r,y1+10,S);
line(x1+r,y1-2,x1+r,y1+2);
line(x1-r,y1-2,x1-r,y1+2);
end;
r:=0;
while y1+r<315 do
begin
r:=r+step;
str(r div step, S);
settextjustify (1,1);
outtextxy(x1-10,y1-r,S);
s:='-'+S;
outtextxy(x1-10,y1+r,S);
line(x1+4,y1+r,x1-4,y1+r);
line(x1+4,y1-r,x1-4,y1-r);
end;
end;
begin
initgraph(gd,gm,'..\bgi');
osicoordinat;
circle (270,240,50);
line(370,165,395,315);
line(395,315,230,270);
line(230,270,370,165);
SetFillStyle(LtSlashFill,15);
FloodFill(235,250,15);
FloodFill(260,285,15);
FloodFill(315,270,15);
readln
end.



Правда я не знаю, правильно ли я его написала...или по другому нужно было сделать...

Автор: Archon 28.11.2009 3:35

Рисует красиво smile.gif

Автор: Kosmik 28.11.2009 3:37

Цитата(Archon @ 28.11.2009 1:35) *

Рисует красиво smile.gif


Спасибо blush.gif

Автор: Lapp 28.11.2009 15:11

Цитата(Kosmik @ 27.11.2009 23:27) *
я не знаю, правильно ли я его написала...или по другому нужно было сделать...
ммммммммне кажется, что нужно было по-другому..
Во-первых, отвыкай (лучше, еще не привыкнув) использовать абсолютные координаты на экране. Исключительный моветон. Правильно было бы задать соответствие математических координат (типа слева x1=-5, справа x2=5 и т.д.) и сделать функцию, которая переводит математические координаты в физические на эеране. Типа так:
function xPh(x: tReal): integer;
begin
xPh=Round(x/(x2-x1)*GetMaxX)
end;

function yPh(y: tReal): integer;
begin
yPh=Round((1-y/(y2-y1))*GetMaxY)
end;


Во-вторых, тебе надо было закрасить область, куда попала точка (предварительно, видимо, запросив ее ввход). Куда ПОПАЛА, а не заданная область. Чувствуешь разницу? smile.gif

А в третьих, задание не очень ясное. Я имею в виду второе.. Как там задается область? ее что, сканировать нужно?? smile.gif Я бы, может, придумал некий язык для задания и читал бы из файла тогда. В файле что-то типа такого:

Код
area

circle
-2
0
2
inner

line
0
1.5
-2
0
right

line
0
0
-2
0
left

area
....

че скажешь? smile.gif

Автор: Kosmik 28.11.2009 15:45

Цитата(Lapp @ 28.11.2009 13:11) *

че скажешь? smile.gif

Скажу что для меня пока все это сложно blush.gif а на счет задания абсолютных координат я подумаю smile.gif

Автор: Lapp 28.11.2009 16:31

Цитата(Kosmik @ 28.11.2009 11:45) *
Скажу что для меня пока все это сложно
Не так страшен черт.. smile.gif
Цитата
а на счет задания абсолютных координат я подумаю smile.gif
Думай, это дело хорошее )).
Имея такие функции, которые я написал выше, ты можешь задавать, например, линию, так:
Line(xPh(-1),yPh(2),xPh(3.5),yPh(-10.23));

Но это громоздко. Лучше, если ты сделаешь также проседурку типа такую:
procedure MathLine(x1,y1,x2,y2: tReal);
begin
Line(xPh(x1),yPh(y1),xPh(x2),yPh(y2))
end;

И вот тогда все станет намнооооого проще )).
Такие же можно сделать для рисования всех остальных примитивов. И засунь их всех в смой личный юнит MathGraph smile.gif.

Автор: Kosmik 28.11.2009 20:40

Что-то у меня вообще ничего не получается ypriamii.gif если такие задачи нам дают на первом курсе sad.gif то что будет дальше?..

Автор: Lapp 28.11.2009 20:52

Цитата(Kosmik @ 28.11.2009 16:40) *
Что-то у меня вообще ничего не получается ypriamii.gif если такие задачи нам дают на первом курсе sad.gif то что будет дальше?..
Надя, ты чего?.. Так хорошо начинала, все сама делала.. Я смотрел - не мог нарадоваться (пошерсти-ка по форуму, посмотри, как другие поступают..).

Что именно у тебя не выходит? Ты говори, разберемся вместе. Обязательно разберемся.

Автор: Kosmik 28.11.2009 22:11

Цитата(Lapp @ 28.11.2009 18:52) *

Что именно у тебя не выходит?


Я не могу построить график по координатам...вообще никак не получается...пробовала в той же программе прописать ту процедуру, которую Вы посоветовали..но как у новичка в прогроммировании..стали выходить ошибки...одну исправлю выходит другая...я уже запуталась..не могу понять что мне сейчас делать. Все что нарисовала переделывать или искать решение у второй задачи. Путаница в голове полнейшая blush.gif

Если бы я смогла как-то начертить график окружности и нарисовать треугольник по его вершинам...там наверное уже можно бы было думать на счет второй задачи. Щас буду думать как это все воплотить...может что-то и получится...надеюсь. smile.gif

Автор: Lapp 28.11.2009 22:55

Цитата(Kosmik @ 28.11.2009 18:11) *
стали выходить ошибки...одну исправлю выходит другая...я уже запуталась..не могу понять что мне сейчас делать. Все что нарисовала переделывать или искать решение у второй задачи.
Очень часто приходится переделывать всю программу, с начала до конца. Как ьы хорошо ни старался продумать заранее, все учесть невозможно. Тому, кто боится переделать все с нуля, в программировании делать нечего )). Обычно желание все переписать появляется и потом накапливается. В некоторый момент понимаешь, что все - по-старому уже нельзя. И процесс переделки далеко не всегда радужный..

Цитата
Если бы я смогла как-то начертить график окружности и нарисовать треугольник по его вершинам...там наверное уже можно бы было думать на счет второй задачи.
Боюсь, я не совсем тебя понял. Что означает "начертить график окружности"? У тебя же есть процедура Circle. Просто нужно подставить туда математические координаты. Сложность возникает в случаеЬ когда масштаб по осям не совпадает. И тогда ясно, что на самом деле нужно использовать не Circle, а Ellipse с соответствующим пересчетом осей. Сможешь сама сделать или помочь?

А треугольник по вершинам - просто с помощью MathLine .. Я что-то упускаю?

ты только не паникуй )). без трудностей не бывает. да и неинтересно.. ))

Автор: Kosmik 28.11.2009 23:15

Цитата(Lapp @ 28.11.2009 20:55) *

Очень часто приходится переделывать всю программу, с начала до конца. Как ьы хорошо ни старался продумать заранее, все учесть невозможно. Тому, кто боится переделать все с нуля, в программировании делать нечего )). Обычно желание все переписать появляется и потом накапливается. В некоторый момент понимаешь, что все - по-старому уже нельзя. И процесс переделки далеко не всегда радужный..

Переделать на боюсь, боюсь что не смогу доделать. Если честно, не люблю оставлять не закоченные дела. ночь просижу, но задачку сделаю.

Цитата(Lapp @ 28.11.2009 20:55) *

Боюсь, я не совсем тебя понял. Что означает "начертить график окружности"? У тебя же есть процедура Circle. Просто нужно подставить туда математические координаты. Сложность возникает в случаеЬ когда масштаб по осям не совпадает. И тогда ясно, что на самом деле нужно использовать не Circle, а Ellipse с соответствующим пересчетом осей. Сможешь сама сделать или помочь?


Помогите, если вам будет это не трудно blush.gif

Цитата(Lapp @ 28.11.2009 20:55) *

А треугольник по вершинам - просто с помощью MathLine .. Я что-то упускаю?

Пыталась это сделать, но на этой строчке Line(xPh(x1),yPh(y1),xPh(x2),yPh(y2)) все время выходила какая-то ошибка(только уже не помню какая, слишком их много сегодня было smile.gif).

Добавлено через 17 мин.
окружность нарисовала:) щас процедуру MathLine попытаюсь прописать...

Автор: Lapp 28.11.2009 23:58

Цитата(Kosmik @ 28.11.2009 19:15) *
Помогите, если вам будет это не трудно

Во-первых, я там ошибся выше в переводе координат sad.gif - извиняюсь..
Во-вторых, ниже я переделал все названия (это я люблю)).
В третьих, вот:
uses
Graph;

var
MaX1,MaY1,MaX2,MaY2: double;


function PhX(x: double): integer;
begin
PhX:=Round((x-MaX1)/(MaX2-MaX1)*GetMaxX)
end;


function PhY(y: double): integer;
begin
PhY:=Round((1-(y-MaY1)/(MaY2-MaY1))*GetMaxY)
end;


procedure MaLine(x1,y1,x2,y2: double);
begin
Line(PhX(x1),PhY(y1),PhX(x2),PhY(y2))
end;


procedure MaCircle(x1,y1,r: double);
begin
Circle(PhX(x1),PhY(y1),PhX(MaX1+r))
end;


procedure MaTriangle(x1,y1,x2,y2,x3,y3: double);
begin
Line(PhX(x1),PhY(y1),PhX(x2),PhY(y2));
Line(PhX(x2),PhY(y2),PhX(x3),PhY(y3));
Line(PhX(x3),PhY(y3),PhX(x1),PhY(y1))
end;


var
gd,gm: integer;


begin
gd:=0;
InitGraph(gd,gm,'');

// расставим мат. границы
MaX1:=-6;
MaX2:=6;
MaY2:=(MaX2-MaX1)/GetMaxX*GetMaxY/2;
MaY1:=-MaY2;

// рисуем оси
MaLine(-5.5,0,5.5,0);
MaLine(0,-3.5,0,3.5);

MaTriangle(-3.7, -1.2, 3, 2, 3, -3);
MaCircle(-2, 0, 2);
ReadLn
end.

С эллипсом немного потом, ладно? Когда посплю чуток)).
И зарубки на осях сделаем)).

Автор: Kosmik 29.11.2009 0:24

А может попробуем мою переделать? blush.gif окружность уже рисует по координатам smile.gif только вот с треугольником возникли проблемки..программа вот в этих строчках указывает на ошибку...скорее всего из-за этих чисел 3.6 может знаете в чем ошибка?
line(x1+3*st,y1+3*st,x1-(3.6*st),y1+1.2*st);
line(x1-3.6*st,y1+1.2*st,x1+2*st,y1-3*st);


program graphik;
uses crt,graph;
const st=25;
var gd,gm:integer;
x2,x1,y2,y1,r:integer;
fun:string;

function xPh(x: Real): integer;
begin
xPh:=Round(x/(x2-x1)*GetMaxX)
end;

function yPh(y: Real): integer;
begin
yPh:=Round((1-y/(y2-y1))*GetMaxY)
end;

procedure osicoordinat;
const step=25;
var x1,y1,r:integer;
s:string;
begin
line(210,240,440,240);
line(320,140,320,330);
line(430,235,440,240);
line(430,245,440,240);
line(315,150,320,140);
line(325,150,320,140);
outtextxy(330,140,'Y');
outtextxy(435,220,'X');
y1:=240; x1:=320; r:=0;
str(r div step, S);
outtextxy(x1-10,y1+6,S);
while x1+r<420 do
begin
r:=r+step;
str(r div step, S);
settextjustify (1,1);
outtextxy(x1+r,y1+10,S);
s:='-'+S;
outtextxy(x1-r,y1+10,S);
line(x1+r,y1-2,x1+r,y1+2);
line(x1-r,y1-2,x1-r,y1+2);
end;
r:=0;
while y1+r<315 do
begin
r:=r+step;
str(r div step, S);
settextjustify (1,1);
outtextxy(x1-10,y1-r,S);
s:='-'+S;
outtextxy(x1-10,y1+r,S);
line(x1+4,y1+r,x1-4,y1+r);
line(x1+4,y1-r,x1-4,y1-r);
end;
end;

begin
initgraph(gd,gm,'..\pp');
osicoordinat;

y1:=240; x1:=320; r:=2*st;
circle (x1-2*st,y1,r);
line(x1+2*st,y1-3*st,x1+3*st,y1+3*st);
line(x1+3*st,y1+3*st,x1-(3.6*st),y1+1.2*st);
line(x1-3.6*st,y1+1.2*st,x1+2*st,y1-3*st);
SetFillStyle(LtSlashFill,15);
FloodFill(235,250,15);
FloodFill(260,285,15);
FloodFill(315,270,15);
readln
end.




Добавлено через 10 мин.

Ошибку решила так
line(x1+3*st,y1+3*st,x1-trunc(3.6*st),y1+trunc(1.2*st));
line(x1-trunc(3.6*st),y1+trunc(1.2*st),x1+2*st,y1-3*st);
теперь все работает blush.gif

Теперь осталась вторая часть задания smile.gif да?

Автор: Kosmik 29.11.2009 1:10

вот моя программка все координаты абсолютные smile.gif Прикрепленный файл  graphik.pas ( 1.69 килобайт ) Кол-во скачиваний: 515
программка теперь отмечает ту область куда поподает точка smile.gif а как сделать чтобы в определенную область попадала, еще не знаю mega_chok.gif

Добавлено через 5 мин.
просто в моей программке мне все понятно smile.gif а вашей я запуталась blush.gif

Автор: Kosmik 29.11.2009 5:27

Оставляю здесь мой "шедевр" Прикрепленный файл  graphik.pas ( 1.97 килобайт ) Кол-во скачиваний: 510

Сделала все что смогла...

Автор: Lapp 29.11.2009 12:32

Цитата(Kosmik @ 29.11.2009 1:27) *
Сделала все что смогла...
Уверена? smile.gif
Я так и не понял, что тебе не было понятно в моем коде. Ты пишешь: "запуталась" - но не говоришь, в чем. Не получилось разметить оси координат? Заштриховать? Что именно вызвало трудность?

Дело ведь в чем.. В абсолютные координаты можно пересчитать одну несложную картинку - ну, две.. А знаешь, как выглядит твоя картинка на моем мониторе (1920х1280)? Почему не заставить компьютер делать работу по пересчету координат? Он это умеет лучше людей )). Можно учесть разные размеры экрана. Можно вообще делать несколько окон с графиками на экране одновременно. Ты только представь, как бы ты стала рисовать, скажем, синус в левом окошке, косинус справа и экспоненту в центре.. Везде же нужно делать свой сдвиг! А программными же средствами - только не забывай переключать окна.. ))
Не выглядит заманчивым? .. нет?
Или ты думаешь, что программирование - это значит правильно вычислить число на калькуляторе, а потом занести его в программный код?.. smile.gif

Автор: Kosmik 29.11.2009 14:15

Цитата(Lapp @ 29.11.2009 10:32) *

Я так и не понял, что тебе не было понятно в моем коде. Ты пишешь: "запуталась" - но не говоришь, в чем. Не получилось разметить оси координат? Заштриховать? Что именно вызвало трудность?

я не люблю работать с функциями nea.gif я начинаю в них путаться, где что про писывается...это для меня пока "лес дремучий" sad.gif
Цитата(Lapp @ 29.11.2009 10:32) *

А знаешь, как выглядит твоя картинка на моем мониторе (1920х1280)?

Не знаю no1.gif как?
Цитата(Lapp @ 29.11.2009 10:32) *

Можно вообще делать несколько окон с графиками на экране одновременно. Ты только представь, как бы ты стала рисовать, скажем, синус в левом окошке, косинус справа и экспоненту в центре..

я хочу сделать все правильно....но не всегда задуманное может стать явью...

я не унываю..попробую все сделать так как Вы посоветовали...может что-то и получится.

Автор: Kosmik 29.11.2009 15:21

У меня тут возникла идея на счет того: поподает ли точка в заданую область или нет (пусть будет заданная область та, которая заштрихованна на рисунке)...мы можем просто найти площадь заштрихованных фигур через интеграл, а остальное дело техники, будем проверять попала ли точка в найденную нами площадь или нет.

Я правильно думаю? Или у вас на счет этого появились свои какие-то идеи???

А на счет рисования графика...мне пока нужна ваша помощь...

Автор: Lapp 29.11.2009 17:09

Цитата(Kosmik @ 29.11.2009 10:15) *
я не люблю работать с функциями nea.gif я начинаю в них путаться, где что про писывается
Ok, значит, нужно разбираться ))

Цитата
Не знаю no1.gif как?
Как почтовая марка..

Цитата
я хочу сделать все правильно....но не всегда задуманное может стать явью...
именно для этого мы тут ))

Цитата(Kosmik @ 29.11.2009 11:21) *
У меня тут возникла идея на счет того: поподает ли точка в заданую область или нет (пусть будет заданная область та, которая заштрихованна на рисунке)...мы можем просто найти площадь заштрихованных фигур через интеграл, а остальное дело техники, будем проверять попала ли точка в найденную нами площадь или нет.
Я правильно думаю? Или у вас на счет этого появились свои какие-то идеи???

Нет, Kosmik, ты что-то путаешь на этот раз.. Площадь фигур тут абсолютно ни при чем (если ты только не собираешься вычислять ее по Монте-Карло smile.gif). Но я не понимаю, какая тут проблема. Тебе же Archon давно уже написал условие проверки, причем на паскале - о чем тут еще думать? Я и не думал, что у тебя с этим недопонимание.. Или это я чего-то не понимаю?

Цитата
А на счет рисования графика...мне пока нужна ваша помощь...
anytime, anywhere.

Автор: Kosmik 29.11.2009 17:17

Цитата(Lapp @ 29.11.2009 15:09) *

Я и не думал, что у тебя с этим недопонимание.. Или это я чего-то не понимаю?

У меня пока во многом недопонимание...я сама пытаюсь разобраться в Паскале...нам ничего в институте не показывали...а сижу я и разбираюсь с этой программой только 7 день...поэтому пока результаты положительными или такими, какие я бы хотела чтобы они были, не могут быть...увы, но это так.

Автор: Archon 29.11.2009 17:29

Цитата
У меня пока во многом недопонимание...я сама пытаюсь разобраться в Паскале...нам ничего в институте не показывали...а сижу я и разбираюсь с этой программой только 7 день...поэтому пока результаты положительными или такими, какие я бы хотела чтобы они были, не могут быть...увы, но это так.
Надеюсь учебник есть? Не стесняйся с ним сверяться. Например, прочитай главу про процедуры и функции smile.gif.

Что касается условия, которое я привел, работать с ним примерно так (x и y - координаты точки):
if (y <= 0) and (x <= 0) and ((sqr(x+2) + sqr(y) <= 4) xor ((y < (x+2)*2/3) and (y > (x+3.6641)*(-0.2837)-1.1094))) then
{ точка (x, y) попадает в область }
else
{ точка (x, y) не попадает в область};

Автор: Kosmik 29.11.2009 18:03

Цитата(Archon @ 29.11.2009 15:29) *

Надеюсь учебник есть? Не стесняйся с ним сверяться. Например, прочитай главу про процедуры и функции smile.gif.

есть smile.gif без него вообще бы было туго...