Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.104.214] |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток!
Столкнулся с такой проблемой: есть программа в Delphi, которая рисует ночной городской пейзаж вот она: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {Событие на нажатие кнопки нарисовать } procedure TForm1.Button1Click(Sender: TObject); begin with form1.Canvas do begin // земля brush.color:=RGB(8,16,48); rectangle(0,350,1000,710); //небо brush.color:=RGB(4,3,35); rectangle(0,0,1000,350); // дома слева brush.color:=RGB(30,30,22); rectangle(0,125,150,550); brush.Color:=clGray; rectangle(200,200,350,500); brush.color:=RGB(200,195,138); brush.color:=RGB(25,19,16); rectangle(150,250,250,500); brush.color:=RGB(88,81,56); rectangle(200,425,375,536); // дома справа brush.color:=RGB(25,19,16); rectangle(725,100,875,400); brush.color:=RGB(94,91,65); rectangle(600,300,675,450); brush.color:=RGB(57,31,15); rectangle(650,350,750,550); brush.color:=RGB(64,75,99); rectangle(850,50,1000,575); brush.color:=RGB(53,54,54); rectangle(725,450,825,560); // Луна brush.Color:=clyellow; Ellipse(250,25,350,125); brush.Color:=RGB(4,3,35); Ellipse(245,20,345,120); // Звездочки brush.color:=RGB(254,255,211); Ellipse(475,90,478,93); Ellipse(500,100,503,103); Ellipse(525,125,528,128); Ellipse(550,163,553,166); Ellipse(625,163,628,166); Ellipse(634,125,637,128); //дорога brush.color:=RGB(85,84,86); rectangle(0,650,1000,700); moveTo(375,650); LineTo(525,350); LineTo(550,350); LineTo(440,650); LineTo(375,650); brush.Color:=RGB(85,84,86); floodFill(425,600,clblack,fsBorder); end; end; end. Но для сдачи курсовой мне нужно переделать ее в Turbo Pascal! Когда я начал переделывать программу, возникло много ошибок, которых я не смог исправить. Прошу помочь мне в этом деле, буду очень-очень признателен! Заранее большое спасибо!!! Вот, собственно, что у меня получилось: program gorod; uses graph, crt; var gd, gr, err:integer; begin gd:=detect; gr:=VGAHi; InitGraph(gd,gr,' '); err:=GraphResult; if err=grOk then begin {Zemlya} brush.color:=RGB(8,16,48); rectangle(0,350,1000,710); { Nebo} brush.color:=RGB(4,3,35); rectangle(0,0,1000,350); { Bydunku zliva} brush.color:=RGB(30,30,22); rectangle(0,125,150,550); brush.Color:=clGray; rectangle(200,200,350,500); brush.color:=RGB(200,195,138); brush.color:=RGB(25,19,16); rectangle(150,250,250,500); brush.color:=RGB(88,81,56); rectangle(200,425,375,536); { Bydunku sprava } brush.color:=RGB(25,19,16); rectangle(725,100,875,400); brush.color:=RGB(94,91,65); rectangle(600,300,675,450); brush.color:=RGB(57,31,15); rectangle(650,350,750,550); brush.color:=RGB(64,75,99); rectangle(850,50,1000,575); brush.color:=RGB(53,54,54); rectangle(725,450,825,560); { Misyac } brush.Color:=clyellow; Ellipse(250,25,350,125); brush.Color:=RGB(4,3,35); Ellipse(245,20,345,120); {Zirku} brush.color:=RGB(254,255,211); Ellipse(475,90,478,93); Ellipse(500,100,503,103); Ellipse(525,125,528,128); Ellipse(550,163,553,166); Ellipse(625,163,628,166); Ellipse(634,125,637,128); {Doroga} brush.color:=RGB(85,84,86); rectangle(0,650,1000,700); moveTo(375,650); LineTo(525,350); LineTo(550,350); LineTo(440,650); LineTo(375,650); brush.Color:=RGB(85,84,86); floodFill(425,600,clblack,fsBorder); readkey; closegraph; end; end. |
Сообщ.
#2
,
|
|
|
Нужно почитать справку и статьи по функциям BGI. Например, никакого brush.color там нет, а цвет кисти задаётся с помиощью SetFillStyle
|
Сообщ.
#3
,
|
|
|
Вот, переделал основные моменты
но не получается подобрать правильные координаты согласно рисунку в делфи(цвет, в принципе, не важен). Помогите пожалуйста, или поясните как правильно писать верные координати объектов. program gorod; uses graph, crt; var gd, gr, err:integer; begin gd:=detect; gr:=vgahi; initgraph(gd,gr,' '); err:=graphresult; if err=grOk then begin {Zemlya} setfillstyle(solidfill, yellow); bar(0,350,1000,710); {Nebo} setfillstyle(solidfill, blue); bar(0,0,1000,350); {Bydunku zliva} setfillstyle(solidfill, red); bar(0,125,150,550); setfillstyle(solidfill, red); bar(200,200,350,500); setfillstyle(solidfill, green); setfillstyle(solidfill, black); bar(150,250,250,500); setfillstyle(solidfill, yellow); bar(200,425,375,536); {Bydunku sprava} setfillstyle(solidfill, brown); bar(725,100,875,400); setfillstyle(solidfill, red); bar(600,300,675,450); setfillstyle(solidfill, green); bar(650,350,750,550); setfillstyle(solidfill, yellow); bar(850,50,1000,575); setfillstyle(solidfill, white); bar(725,450,825,560); {Misyac} setfillstyle(solidfill, yellow); circle(300,75,100); setfillstyle(solidfill, blue); circle(295,70,95); {Zirku} setfillstyle(solidfill, yellow); circle(475,90,478); circle(500,100,503); circle(525,125,528); circle(550,163,553); circle(625,163,628); circle(634,125,637); {Doroga} setfillstyle(solidfill, black); bar(0,650,1000,700); moveTo(375,650); LineTo(525,350); LineTo(550,350); LineTo(440,650); LineTo(375,650); setfillstyle(solidfill, brown); floodFill(425,600,black); readkey; closegraph; end; end. Прикреплённый файл____________________.JPG (58,81 Кбайт, скачиваний: 638) Прикреплённый файл____________________.JPG (58,81 Кбайт, скачиваний: 543) |
Сообщ.
#4
,
|
|
|
режим vgahi даёт разрешение 640х480, а в дельфийском коде используется гораздо большее разрешение. Поделить все координаты пополам не поможет?
|
Сообщ.
#5
,
|
|
|
поделил приблизительно, все равно не могу попасть в точку( то меньше, то больше ) =(
|
Сообщ.
#6
,
|
|
|
В какую точку? Разве тут важны точные координаты?
|
Сообщ.
#7
,
|
|
|
я имею в виду, что я не могу увеличить\уменшить координаты так, чтобы картинка получилась красивой и во весь экран
|
Сообщ.
#8
,
|
|
|
Ну, можно сделать так.
В Delphi ты всё равно используешь абсолютное позиционирование. Что мешает сделать подобие векторной графики? 1. Разделяешь весь рисунок на объекты с параметрами - начальная точка (центр окружности или левый верхний угол прямоугольника) и размеры (радиус или длина+ширина). 2. Пересчитываешь координаты, линейные размеры. 3. Рисуешь. Размеры экрана в TurboPascal - GetMaxX, GetMaxY - действительны после перехода в графический режим. Как пересчитывать. Масштабные коэффициенты: Mx:=GetMaxX / DelphiMaxX; - где DelphiMaxX максимальное значение X в делфийской картинке. My:=GetMaxY / DelphiMaxY; - где DelphiMaxY максимальное значение Y в делфийской картинке. Дома справа: вместо bar(725,100,875,400); (=rectangle(725,100,875,400);) пишешь setfillstyle(solidfill, brown); x0:=round(725*Mx); y0:=round(100*My); dx:=round( (875-725)*Mx ); dy:=round( (400-100)*My ); bar(x0,y0,x0+dx,y0+dy); ............ Я набирал сразу в браузере, мог ошибиться. Но идея всё равно такая. Кстати, однотипные объекты можно объединить в массивы и выводить в цикле произвольное число домов (и те, что слева и те, что справа). |