Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284

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

15.12.2011, 10:01. Показов 1629. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовать программу, строящую двумерное изображение заданной фигуры. Необходимо выполнить 2D преобразования и отобразить новое положение фигуры.
Миниатюры
Реализовать программу, строящую двумерное изображение заданной фигуры.  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2011, 10:01
Ответы с готовыми решениями:

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

Построить двумерное изображение заданной фигуры (аффинные преобразования)
Есть готовый код программы, но мне нужно построить другую фигуру и выполнить над ней действия. Мою фигуру прикрепил к теме. uses...

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

8
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
16.12.2011, 09:41
Это коряво нарисовано, или действительно длина горизонтальных лучей больше чем вертикальных?
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
16.12.2011, 13:11  [ТС]
Я думаю криво нарисовано, я взял координаты вот такие ((320,000),(427,160),(640,240),(427,320) .(320,480),(213,320),(000,240),(213,160) );
Даже написал кое какой код но чето пока не довел до ума и думаю что это можно как то проще сделать =))
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Program Zadanie_1;
uses Graph, Crt;
const k=7; n=1;
z:array [0..k,0..n] of
 integer= ((320,000),(427,160),(640,240),(427,320),
           (320,480),(213,320),(000,240),(213,160));
var
 gd,gm         :integer;
 t            :integer;
 x1,y1,x2,y2   :integer;
 xc,yc  :real;
begin
gd:=detect;
initgraph(gd,gm,'');
 xc:=GetMaxX/640/2;
 yc:=GetMaxY/480/2;
 t:=0;
 while t<=k do begin
 x1:=round(-z[0+t,0]*xc+GetMaxX/2);
 y1:=round(-z[0+t,1]*yc+GetMaxY/2);
 x2:=round(-z[(1+t) mod 8,0]*xc+GetMaxX/2);
 y2:=round(-z[(1+t) mod 8,1]*yc+GetMaxY/2);
 line(x1,y1,x2,y2);
 
 inc(t);
 end;
 readln;
 t:=0;
 while t<=k do begin
 x1:=round((-z[0+t,0]*xc+GetMaxX/2-z[0+t,1]*yc+GetMaxY/2)/sqrt(2));
 y1:=round((-z[0+t,0]*xc+GetMaxX/2+z[0+t,1]*yc+GetMaxY/2)/sqrt(2));
 x2:=round((-z[(1+t) mod 8,0]*xc+GetMaxX/2-z[(1+t) mod 8,1]*yc+GetMaxY/2)/sqrt(2));
 y2:=round((-z[(1+t) mod 8,0]*xc+GetMaxX/2+z[(1+t) mod 8,1]*yc+GetMaxY/2)/sqrt(2));
 setcolor(2);
 line(x1,y1,x2,y2);
 inc(t);
 end;
 readln;
 t:=0;
 while t<=k do begin
 x1:=round((-z[0+t,0]*xc+GetMaxX/2-z[0+t,1]*yc+GetMaxY/2)/sqrt(2));
 y1:=round((-z[0+t,0]*xc+GetMaxX/2+z[0+t,1]*yc+GetMaxY/2)/sqrt(2));
 x2:=round((-z[(1+t) mod 8,0]*xc+GetMaxX/2-z[(1+t) mod 8,1]*yc+GetMaxY/2)/sqrt(2));
 y2:=round((-z[(1+t) mod 8,0]*xc+GetMaxX/2+z[(1+t) mod 8,1]*yc+GetMaxY/2)/sqrt(2));
 setcolor(14);
 line(-x1,y1,-x2,y2);
 inc(t);
end;
readln;
closegraph;
end.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
16.12.2011, 13:59
Опять же если лучи одинаковые, то отражение по ос Х ничем не будет отличаться, просто в другом месте будет..

Добавлено через 21 минуту
Можно так.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
uses graph;
procedure Figura(x1,y1,d,m,u,c:integer);
{параметры координаты центра, радиус, отношение, цвет}
var a,i,d1:integer;
    p:array[1..9] of pointtype;
begin
d1:=d div m;
a:=u;
for i:=1 to 8 do
 begin
  if i mod 2=0 then
   begin
    p[i].x:=x1+round(d*cos(a*pi/180));
    p[i].y:=y1-round(d*sin(a*pi/180));
   end
  else
   begin
    p[i].x:=x1+round(d1*cos(a*pi/180));
    p[i].y:=y1-round(d1*sin(a*pi/180));
   end;
  a:=a+45;
end;
p[9].x:=p[1].x;
p[9].y:=p[1].y;
SetColor(c);
drawpoly(9,p);
end;
var gd,gm,xc,yc:integer;
begin
gd:=0;
initgraph(gd,gm,'');
xc:=getmaxX div 2;
yc:=getmaxY div 2;
line(0,yc,getmaxX,yc);
outtextXY(xc-50,getmaxY-20,'Press Enter');
Figura(xc,yc-100,80,3,-45,15);
readln;
Figura(xc,yc-100,80,3,-45,0);
Figura(xc,yc-100,80,3,0,15);
readln;
Figura(xc,yc-100,80,3,0,0);
Figura(xc,yc+100,80,3,0,15);
readln
end.
1
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
19.12.2011, 07:45  [ТС]
Неверно работает, надо повернуть фигуру относительно начала координат, а тут она поворачивается относительно собственной оси! Вот 3 дня напрягался вспоминал школьную геометрию и осваивал паскаль, но все же вышло! =))
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Program Zadanie_2;
uses graph;
function arccos(r:real):real;
begin
if r=0 then arccos:=pi/2
else arccos:=arctan(sqrt(1-sqr(r))/r)+pi*byte(r<0)
end;
procedure Figura(x11,y11,x111,y111,d,m,u,c:integer);
{x11,y11 - Є®®а¤Ё**вл жҐ*ва* *®ўле ®бҐ©, x111,y111-Є®®а¤Ё**вл жҐ*ва* дЁЈгал
®в*®бЁвҐ«м*®Ј® *®ў®Ј® жҐ*ва* ®бҐ©, d - а*¤Ёгб дЁЈгал, m - ¤Ґ«ЁвҐ«м а*¤Ёгб*
дЁЈгал зҐаҐ§ Є*¦¤лҐ 90 Ја*¤гб®ў,u - гЈ®« Ї®ў®а®в* ®в*®бЁвҐ«м*® *®ў®© ®бЁ,
c - 梥в дЁЈгал}
var
i,d1,a,x1,y1:integer;
l,f:real;
    p:array[1..9] of pointtype;
begin
d1:=d div m;
a:=u;
x1:=x11+x111;
y1:=y11-y111;
//write(y11,' ',y1);
l:=(x111)/sqrt(sqr(x111)+sqr(y111));
f:=arccos(l);
x1:=round(x11+sqrt(sqr(x111)+sqr(y111))*cos(u*pi/180+f));
if (y111>=0) then
y1:=round(y11-sqrt(sqr(x111)+sqr(y111))*sin(u*pi/180+f))
else
y1:=round(y11+sqrt(sqr(x111)+sqr(y111))*sin(u*pi/180+f));
for i:=1 to 8 do
 begin
  if i mod 2=0 then
   begin
     p[i].x:=x1+round(d1*cos(a*pi/180));
     p[i].y:=y1-round(d1*sin(a*pi/180));
      end
  else
   begin
    p[i].x:=x1+round(d*cos(a*pi/180));
    p[i].y:=y1-round(d*sin(a*pi/180));
   end;
  a:=a+45;
end;
p[9].x:=p[1].x;
p[9].y:=p[1].y;
SetColor(c);
drawpoly(9,p);
end;
var gd,gm,xc,yc:integer;
begin
gd:=0;
initgraph(gd,gm,'');
xc:=getmaxX div 2;
yc:=getmaxY div 2;
line(0,yc,getmaxX,yc);
line(xc,0,xc,getmaxY);
outtextXY(xc+100,50,'Press Enter');
Figura(xc,yc,100,100,80,3,0,15);
readln;
Figura(xc,yc,100,100,80,3,45,10);
readln;
Figura(xc,yc,100,-100,80,3,45,5);
readln
end.
Добавлено через 23 часа 32 минуты
Вот, мб кому пригодится.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Program Zadanie_2; {Имя программы}
uses graph; {Команда подключения модулей}
function arccos(r:real):real; {Так как в языке pascal отсутствует оператор arccos, создадим функцию нахождения arccos через arctan. Данная функция потребуется для определения начального угла поворота относительно новой системы координат}
begin
 if r=0 {Если переменная r равна нулю, то переходим к выполнению оператора после then, иначе выполняем оператор после else}
  then
   arccos:=pi/2 {Присваиваем функции arсcos значение pi/2, где pi – число пи. Расчет ведем в радианах}
  else
   arccos:=arctan(sqrt(1-sqr(r))/r)+pi*byte(r<0) {Находим значение функции arcos через arctan}
end;
procedure Figura(x11,y11,x111,y111,d,m,u,c:integer);
{Процедура построения фигуры с параметрами: x11,y11 – координаты осей для новой системы координат, x111,y111- координаты центра построения фигуры относительно новой системы координат
, d – радиус фигуры, m – отношение радиуса d к радиусу d1, u – угол сдвига фигуры относительно начала новой системы координат, c – цвет фигуры, для наглядности преобразований}
var {Секция описания переменных}
 i,d1,a,x1,y1:integer; {Переменные целого типа, где i – порядковый номер точки, d1- радиус каждой второй точки, х1,y1 – координаты центра фигуры относительно начальной системы координат}
 l,f:real;{Переменные вещественного типа, где l – расстояние от начала новой системы координат до центра фигуры, f – угол между осью x` и отрезком l, т.е. начальный угол на котором расположен центр фигуры относительно начала новой системы координат}
 p:array[1..9] of pointtype; {Массив из 9 элементов имеющих тип точка}
begin
 d1:=d div m;{Переменной d1 присвоить значение d деленного  на m без остатка, т.е. находим радиус для каждой второй точки через радиус фигуры поделенного на заданное значение m}
 a:=u;{Присваиваем вспомогательной переменной a значение u (угол сдвига фигуры относительно начала новой системы координат)}
// Находим координаты центра фигуры относительно начальной системы координат, переменным x1,y1 присваиваем найденные значения
 x1:=x11+x111; 
y1:=y11-y111;
// Находим расстояние от начала новой системы координат до центра фигуры
 l:=(x111)/sqrt(sqr(x111)+sqr(y111));
// Находим угол между осью х` и отрезком l
 f:=arccos(l);
//Находим центр построения фигуры относительно начальной системы координат, с учетом угла сдвига фигуры относительно начала новой системы координат
 x1:=round(x11+sqrt(sqr(x111)+sqr(y111))*cos(u*pi/180+f));
//Следующая операция необходима для правильного нахождения центра фигуры относительно новой системы координат при отрицательных значениях y111
 if (y111>=0) {Если переменная y111>=0 то переходим к выполнению оператора после then, иначе выполняем оператор после else}
  then
//Находим значение координаты центра фигуры по оси y` при положительной переменной y111
   y1:=round(y11-sqrt(sqr(x111)+sqr(y111))*sin(u*pi/180+f))
  else
//Находим значение координаты центра фигуры по оси y` при отрицательной переменной y111
   y1:=round(y11+sqrt(sqr(x111)+sqr(y111))*sin(u*pi/180+f));
 for i:=1 to 8 do {Для всех i от 1 до 8 выполняем оператор после do}
//Находим координаты точек для построения фигуры с учетом того, что точка, имеющая четный порядковый номер должна находится на расстоянии d1 от цетра фигуры
  begin
   if i mod 2=0 then {Если при делении количества точек  остаток равен нулю, то выполняем оператор после then, иначе выполняем оператор после else}
    begin
     p[i].x:=x1+round(d1*cos(a*pi/180));
     p[i].y:=y1-round(d1*sin(a*pi/180));
    end
   else
    begin
     p[i].x:=x1+round(d*cos(a*pi/180));
     p[i].y:=y1-round(d*sin(a*pi/180));
    end;
   a:=a+45; {Т.к. точки построения фигуры находятся под углом 45 градусов к друг другу,  в конце каждого цикла увеличиваем угол на 45 градусов}
  end;
//Присваиваем координаты последней точки девятому элементу массива, это необходимо для замыкания фигуры.
 p[9].x:=p[1].x;
 p[9].y:=p[1].y;
 SetColor(c); {задаем цвет линий фигуры}
 drawpoly(9,p); {Строим фигуру, т.е. последовательно соединяем все наши точки отрезками}
end;
var
 gd,gm,xc,yc:integer;
begin
 gd:=0; {Тип драйвера адаптера определяется автоматически, значение gm после команды gd:=detect или gd:=0 определяется автоматически}
 initgraph(gd,gm,''); {Инициализация графики. В кавычках указывается путь к программе драйверу с расширением bgi, т.к. мы используем FreePascal у нас нет необходимости указывать путь к дополнительным драйверам, т.к. он в них не нуждается}
 //Определяем разрешающую способность для текущего графического режима функциями, возвращающими максимальные значения координат экрана
xc:=getmaxX div 2; 
 yc:=getmaxY div 2;
//Рисуем по центру экрана экран линии, т.е. оси соответствующие новым системам координат
 line(0,yc,getmaxX,yc);
 line(xc,0,xc,getmaxY);
//Выводим на экран надпись 'Press Enter', для информативности
 outtextXY(xc+100,50,'Press Enter');
// С помощью процедуры Figura строим требуемую фигуру.
 Figura(xc,yc,100,100,80,3,0,15); {Начальное положение фигуры}
 readln;
 Figura(xc,yc,100,100,80,3,45,10); {Поворачиваем фигуру относительно центра новой системы координат на 45 градусов}
 readln;
 Figura(xc,yc,100,-100,80,3,45,5);{Отражение относительно оси х`}
 readln
end.
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
21.12.2011, 11:50  [ТС]
Помогите исправить!
Во втором задании преобразования реализованы неверно. Ваша программная реализация не эффективна, если бы так проводились все преобразования, то графические редакторы работали над поворотом или отражением часами, т.к. размерность массивов N*M и рассчитать расстояние, произвольный угол довольно сложно. Наша задача понять, как можно унифицировать всевозможные преобразования.
Необходимо задать матрицы (а не массивы) преобразований (поворота и отражения) и процедуру умножения матриц. При нажатии на клавишу «R» переходим в процедуру умножения матриц, где матрицу вершин фигуры умножаем на матрицу отражения, результирующую матрицу передаем в процедуру отрисовки. При нажатии на клавишу «M» те же действия, но умножаем на матрицу отражения.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
21.12.2011, 11:57
Ну так Вам же влом нормально написать условие задачи, сил еле хватает на загрузку картинки...
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
21.12.2011, 13:23  [ТС]
Ну вот все что в задании сказано я все и написал! И картинку с задания скопировал! Так что это вся инфа....больше ничего нет.
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
24.12.2011, 11:00  [ТС]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Program zadanie_2;
uses crt,graph;
type
 matrix92=array[1..9,1..2] of integer;
 matrix33=array[1..3,1..3] of real;
 matrix93=array[1..9,1..3] of real;
procedure mult(a:matrix93;b:matrix33;var c:matrix93);
var
 i,j:integer;
begin
 for j:=1 to 9 do
  for i:=1 to 3 do
   c[j,i]:=a[j,1]*b[1,i]+a[j,2]*b[2,i]+a[j,3]*b[3,i];
end;
procedure pr(xc,yc:integer;a:matrix93;var b:matrix92);
var
 i,j:integer;
begin
 for i:=1 to 9 do
  for j:=1 to 2 do
   if j mod 2=1
    then
     b[i,j]:=round(xc+a[i,j]/a[i,3])
    else
     b[i,j]:=round(yc+a[i,j]/a[i,3]);
end;
const
 k:matrix93=((320,0,1),(427,160,1),(640,240,1),(427,320,1),(320,480,1),(213,320,1),(0,240,1),(213,160,1),(320,0,1));
 v:matrix33=((cos(45*pi/180) ,sin(45*pi/180),0),
         (-sin(45*pi/180),cos(45*pi/180),0),
             (       0       ,      0       ,1));
 o:matrix33=((1, 0,0),
             (0,-1,0),
             (0, 0,1));
 r:matrix33=((0.5, 0 ,0),
             ( 0 ,0.5,0),
             ( 0 , 0, 1));
var
 c:matrix93;
 l:matrix92;
 gd,gm,xc,yc:integer;
 kl:char;
label 1;
begin
 gd:=0;
 initgraph(gd,gm,'');
 xc:=getmaxx div 2;
 yc:=getmaxy div 2;
 line(xc,0,xc,getmaxx);
 line(0,yc,getmaxx,yc);
 outtextXY(xc+100,50,'Press R or M');
 mult(k,r,c);
 pr(xc,yc,c,l);
 setcolor(2);
 drawpoly(9,l);
1:
 kl:=readkey;
 cleardevice;
 if kl='r'
  then
   begin
    setcolor(15);
    line(xc,0,xc,getmaxx);
    line(0,yc,getmaxx,yc);
    outtextXY(xc+100,50,'Press R or M');
    mult(c,v,c);
    pr(xc,yc,c,l);
    setcolor(2);
    drawpoly(9,l);
     goto 1;
   end;
 if kl='m'
  then
   begin
    setcolor(15);
    line(xc,0,xc,getmaxx);
    line(0,yc,getmaxx,yc);
    outtextXY(xc+100,50,'Press R or M');
    mult(c,o,c);
    pr(xc,yc,c,l);
    setcolor(2);
    drawpoly(9,l);
     goto 1;
   end;
 readln;
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.12.2011, 11:00
Помогаю со студенческими работами здесь

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

Построить двумерное изображение фигуры
Здравствуйте. Необходимо построить двумерное изображение заданной фигуры. Над фигурой выполнить все аффинные преобразования: перенос,...

Написать программу, строящую на экране изображение
Написать программу, строящую на экране изображение. Спасите пожалуйста,осталось сдать только это,буду очень благодарен ((((

Рекурсии. Написать программу, строящую на экране изображение
Рекурсии. Написать программу, строящую на экране изображение (&quot;треугольник Серпинского&quot;). Изображение строится по следующему...

Реализовать программу, строящую фрактал с заданными границами расчета x0≤x≤xn. y0≤y≤yn
gd := detect; 1.pas(17) : Неизвестное имя 'detect' Подскажите что с этим можно сделать? как решить эту компиляцию, перерыл инет, нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru