Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 5 / 0
Регистрация: 27.12.2009
Сообщений: 69

Графика в TP: Построчная закраска фигуры.

19.11.2010, 00:58. Показов 1259. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
При написании программы испытал некоторые трудности, о них напишу далее.
Собственно суть программы такова:
Сначала я рисую квадрат: это три процедуры - рисование линии, поворот и поворот линии на 90 градусов 4-ре раза.
Далее необходимо закрасить часть квадрата, я выбрал метод построчной закраски.
Алгоритм пересечения отрезков взял здесь: http://algoritm.ucoz.ru/publ/1-1-0-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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
Program KompGraph_Laba3;
Uses Crt, graph;
 
var
  driver,mode:integer;
  i:integer;
  {1-i kvadrat}
  a,b:integer;                    {koordinati verhnego levogo ygla}
  ac,bc:integer;                 {koordinati centra kvadrata}
 
 
{proceduri dlya 1-go kvadrata}
 procedure DrawLine1(a1,b1,a2,b2,Color:integer);  {risovanie linii}
 var
  i,a,b,da,db,sa,sb,e,tmp,flag:integer;
 begin
  a:=a1;                                          {inicializaciya peremennih}
  b:=b1;
  da:=abs(a2-a1);
  db:=abs(b2-b1);
  if a2-a1>0 then sa:=1 else sa:=-1;
  if b2-b1>0 then sb:=1 else sb:=-1;
  if db>da then                                   {obmen znachenii da i db}
            begin
             tmp:=da;
             da:=db;
             db:=tmp;
             flag:=1;
            end
           else
            flag:=0;
  e:=2*db-da;                            {inicializaciya oshibki}
for i:=1 to da do
   begin
    PutPixel(a,b,Color);
   if e>=0  then                             {izmenenie dopolnitelnoi}
     begin                                   {koordinati}
      if flag=1 then a:=a+sa
                else b:=b+sb;
      e:=e-2*da;                             {korrekciya oshibki}
     end;
 if flag=1 then b:=b+sb                      {izmenenie osnovnoi koordinati}
              else a:=a+sa;
    e:=e+2*db;                               {nakoplenie oshibki}
   end;
 end;
 
 
procedure Rotation1(angle:real;color:integer);  {povorot}
 var
    a1,b1,ar,br:integer;
 begin
  a1:=a-ac;                     {pomestit v nachalo koordinat}
  b1:=b-bc;
  ar:=round(a1*cos(angle)-b1*sin(angle));       {povernyt}
  br:=round(a1*sin(angle)+b1*cos(angle));
  ar:=ar+ac;                       {vernyt v nachalinoe polojenie}
  br:=br+bc;
  DrawLine1(a,b,round(ar),round(br),color);
  a:=ar;
  b:=br;
 end;
 
 procedure DrawRectangle1(angle:real;Color:integer); {risovanie kvadrata}
 begin
 for i:=1 to 4 do         {povorot tochki 4 raza na 90 gradysov vokryg centra}
  Rotation1(angle,Color);
 end;
 
 
procedure Intersection (x1,y1,x2,y2,x3,y3,x4,y4:integer; var m,n:integer);
var
znam1,znam2,chis1,chis2:integer;
ua,ub:real;
begin
chis1:=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3);
znam1:=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1);
if (chis1<>0) and (znam1<>0) then
ua:=chis1/znam1
else
ua:=10000;
chis2:=(x2-x1)*(y1-y3)-(y2-y1)*(x1-x3);
znam2:=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1);
if (chis2<>0) and (znam2<>0) then
ub:=chis2/znam2
else
ub:=10000;
if (ub<1000) and (ua<1000) then
begin
m:=round(x1+ua*(x2-x1));
n:=round(y1+ua*(y2-y1));
end
else
begin
m:=700;
n:=700;
end;
end;
 
procedure zakraska(yn,yk,color:integer);
var
yp,xp,m1,n1,m2,n2:integer;
begin
yp:=yn+1;
While(yp<yk) do begin
intersection(100,yp,435,yp,a,b,a,b+90,m1,n1);
intersection(100,yp,435,yp,a,b,a+90,b+90,m2,n2);
xp:=m1;
while(xp<=m2) do
begin
putpixel(xp,yp,color);
xp:=xp+1;
end;
yp:=yp+1;
end;
end;
 
begin
 
 driver:=Detect;                                 {inicializaciya}
 initgraph(driver,mode,'C:\TP\BGI');             {graficheskoro rejima}
 cleardevice;
 OutTextXY(5,5,'Mihail. Gruppa S-52. Variant # 34. LabRab # 3.');
 OutTextXY(5,20,'Dlya postroeniya drygoi figyri najmite lubyu klavishy.');
 
 ac:=350;
 bc:=250;
 a:=ac-45;                       {opredelenie koordinat}
 b:=bc-45;                       {verhnego levoro ygla}
 
 DrawRectangle1(pi/2,2);                         {risovanie kvadrata 1}
 readkey;
 zakraska(b,b+90,red);
 readkey;
 
Closegraph;
end.
Собственно работает не совсем корректно.
intersection(100,yp,435,yp,a,b,a,b+90,m1 ,n1);
intersection(100,yp,435,yp,a,b,a+90,b+90 ,m2,n2);
Вот эти строчки, за вместо 100 и 435, по умолчанию должно стоять 0 и 640, якобы это невидимая линия... С этим я толком не разобрался, что это за координаты и зачем они нужны.. но если их оставить по умолчанию, то закрашивается все полоска по всему экрану, если начать менять, то как в моем случае, все таки внутри фигуры закрасилось, но верхняя и нижняя границы были соблюдены, а вот левая сторона и правая закрашиваются, что говорит о том что границы он не видит...
Далее я проставил координаты так, чтобы из левого верхнего угла шла диагональ... далее вроде понятно.

Подскажи пожалуйста в чем ошибка (((

Добавлено через 7 часов 9 минут
Поднимаем

Добавлено через 55 минут
Прямо лес ответов...
Ну да ладно, нашел сей недочет, теперь программа работает отлично.
Тему можно Close!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.11.2010, 00:58
Ответы с готовыми решениями:

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

Закраска фигуры
Подскажите пожалуйста!ъ У меня например одна фигура построенная по точкам пересекает другую, так же построенную по точкам, как мне...

закраска фигуры
помогите! на Image находится 7 треугольников. Нужно чтобы при нажатии мыши в любой части 1-го из треугольников (заданной 3-мя...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2010, 00:58
Помогаю со студенческими работами здесь

Закраска фигуры цветом
Люди помогите.... вот рисунок... правда в паскале АБС program flag1; uses graphabc; begin line (150,180,150,450); line...

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

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

Поворот фигуры. Графика
Предоставить пользователю возможность задать количество квадратов “n”. Причем каждый последующий квадрат должен быть вписан в...

Проецирование фигуры из 3D графика в 2D
Здравствуйте! Подскажите пожалуйста, как возможно (с помощью функций, математических операций или еще чего-нибудь) спроецировать любой 3D...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru