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

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

Форум «Всё о Паскале» _ Задачи _ Задача на графику

Автор: -tania- 3.04.2007 23:58

Задача такая: на паскале пользователь вводит координаты четырех углов ромба. Нужно нарисовать ромб, в центре маленькую окружность, и по кнопкам вверх, вниз, вправо, влево ромб с окружностью должны соответственно двигаться. Задачка простая, но я не могу ее никак написать: ромб я нарисовала, рассчитала координаты центра окружности, акогда начала рисовать саму окружность
circle(xcentra,ycentra,r),
то паскаль мне пишет ошибку type mismatch. xcentra,ycentra у меня real, но как округлять здесь числа я понятия не имею. Помогите пожалуйста!

Автор: Tan 4.04.2007 0:01

round(x) - округление до целого

Автор: -tania- 4.04.2007 0:03

Я и так пробовала, пишут ту же самую ошибку.

Автор: mamont001 4.04.2007 0:07

Можеш привести код программы?

Автор: -tania- 4.04.2007 0:13

uses graph,crt;
var d,m:integer;x1,x2,x3,x4,y1,y2,y3,y4:integer; xc,yc:real;
begin
clrscr;
initgraph(d,m,'');
readln(x1);
readln(x2);
readln(x3);
readln(x4);
readln(y1);
readln(y2);
readln(y3);
readln(y4);

line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
line(x4,y4,x1,y1);
xc:=(x4+x2)/2;
yc:=(y1+y3)/2; round(x); round(yc);
circle(xc,yc,10);

end.


 ! 
Пользуемся тегами !


Автор: Tan 4.04.2007 0:13

Цитата
Задача такая: на паскале пользователь вводит координаты четырех углов ромба

Вероятно речь идёт о вершинах ромба. В таком случае не забывай что пользователь может ввести координаты фигуры, которая не будет ромбом.

Автор: -tania- 4.04.2007 0:14

Здесь она выдает мне ошибку, дальше вообще не знаю как.

Добавлено через 2 мин.
Tan, и как в этом случае писать? Тогда вообще непонятно, как эту окружность туда впихнуть.

Автор: Tan 4.04.2007 0:17

circle (round(xc),round(yc),10). А ты по пифагору проверь, все ли стороны равны. Немного неправильно выразился, то есть используй теорему пифагора чтобы найти длины сторон фигуры и потом сравни их.

Автор: -tania- 4.04.2007 0:48

окружность нарисовать получилось, а как тогда двигать целую фигуру, а не одну точку?

Автор: klem4 4.04.2007 0:57

Есть несколько вариантов как можно перемещать ихображение оп экрану

- отрисоывать каждый раз заново, относительно некой базовой точки
- отрисовать изображение 1 раз, захватить его с помощью GetImage, а за тем выводить где угодно с помощью PutImage


Воспользуйся поиском, решалось много задач на движение фигур, шариков всяких ...

Автор: Tan 4.04.2007 0:59

Притивно : идти по всем точкам экрана и проверять их цвет, если это цвет нарисованной фигуры, то двигаем пиксель в зависимости от клавиши, при этом ставя цвет точки на которую "напоролись" цветом экрана . То есть когда пройдёшь по всем точкам, они будут подвинуты. Но это не лучший вариант.

Автор: mamont001 4.04.2007 1:03

Начнём из далека-считывание клавиши:


Procedure otris(x1,y1,x2,y2,x3,y3,x4,y4);
var
xc,yc:word;
begin
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
line(x4,y4,x1,y1);
xc:=(x4+x2) div 2;
yc:=(y1+y3) div 2;
circle(xc,yc,10);
end;
{Вначале обьявляем переменную}
ch:char;
{.................................}
{потом считываем клавишу:}
ch:=readkey;
{Стрелочки это отдельная тема, поетому хватит W,S,A,D}
if ch=97 then
begin
setcolor(0);
otris(x1,y1,x2,y2,x3,y3,x4,y4);
setcolor(4);
x1:=x1-1;
x2:=x2-1;
x3:=x3-1;
x4:=x4-1;
otris(x1,y1,x2,y2,x3,y3,x4,y4);

end; {Клавиша a}
{...........................}



Добавлено через 3 мин.
2 Tan
Цитата
... это не самый лучший вариант...

Это не вариант это такой геморой ,что сложнее сложно было придумать...

2 klem4
Цитата
...getimage...

Я сомневаюсь, что этот человек знает указатели....

Автор: -tania- 4.04.2007 1:29

[tag=]uses graph,crt;
var d,m:integer;x1,x2,x3,x4,y1,y2,y3,y4:integer; xc,yc:real; c:char;
begin
clrscr;
initgraph(d,m,'');
readln(x1);
readln(x2);
readln(x3);
readln(x4);
readln(y1);
readln(y2);
readln(y3);
readln(y4);
repeat
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x4,y4);
line(x4,y4,x1,y1);
xc:=(x4+x2)/2;
yc:=(y1+y3)/2;
circle(round(xc),round(yc),10);
gotoxy(x1,y1);
c:=readkey;
case c of
'd':if(x3+1)<640 then x1:=x1+1;
's':if(y2+1)<480 then y1:=y1+1;
'a':if (x4-1)>0 then x1:=x1-1;
'w':if(y1-1)>0 then y2:=y2-1;
until c=chr(27);
end.

Добавлено через 1 мин.
он мне подчеркивает где until и выдает какую-то ошибку

Автор: Tan 4.04.2007 1:38

end после case надо

Автор: -tania- 4.04.2007 1:44

Я сейчас написала. Он мне двигает только точки которые в if, больше ничего не делает, только "растягивает" фигуру, а мне нужно чтобы она просто вся перерисовывалась.

Автор: volvo 4.04.2007 4:35

Цитата
Я сомневаюсь, что этот человек знает указатели....
А я сомневаюсь, что ты знаешь, что такое GetImage в таком случае, ибо для ее использования совершенно не нужны указатели... Буфер нужен, а вот указатели - совсем нет...