Помощь - Поиск - Пользователи - Календарь
Полная версия: заливка области
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Цифровой_Aнгел
Залить каждый из внутренних кругов любыми стилем и цветом.помогите пожалуста=(( unsure.gif



Program Circle3;
Uses CRT, Graph;

const
R=185;

var
x0,y0,n,i,k,Color:integer;
driver,regim,error: integer;
a,b:word;
Info:FillSettingsType;
Begin
clrscr;
Detectgraph(driver,regim);
Initgraph(driver,regim,'G:\TP7\BGI');
Error:=GraphResult;
if Error <> grOK then
begin
writeln(GraphErrorMsg(Error));
Halt(Error)
end;

GetAspectRatio(a,b);
x0:=GetMaxX div 2;
y0:=GetMaxY div 2;
SetAspectRatio(GetMaxX-a*x0 div 2,GetMaxY-b*y0);
SetLineStyle(0,0,3);
SetColor(LightGreen);
Circle(x0,y0,R);


Circle(420,225,190 div 2-9);

Circle(260,142,190 div 2-9);

Circle(280,353,190 div 2-9);


readln;
CloseGraph;
end.
volvo
Ну, допустим, залить-то не проблема (для этого достаточно после отрисовки круга вызвать SetFillStyle и FloodFill с координатами центра окружности и зеленым цветом в качестве границы). Но ведь у тебя программа вылетает при попытке выполнить вот эту строку:
Цитата
SetAspectRatio(GetMaxX-a*x0 div 2,GetMaxY-b*y0);
Исправь сначала эту ошибку, потом будешь делать заливку...
Цифровой_Aнгел
эм....всмысле вылетает? у меня всё нормально blink.gif
volvo
Значит, контроль границ отключен... Не надо этого делать. В настройках компилятора (Options -> Compiler) отметь все, что находится в группе Runtime Errors, нажми Ok, перекомпилируй и запусти программу.

Не отключай никогда контроль. Лучше чуть больше времени уделить отладке, чем думать, что у тебя все в порядке, а потом попробовать запустить программу на другом компьютере, где другие настройки, и она начнет вылетать.

Добавлено через 4 мин.
А вот тебе и доказательство того, что не надо закрывать глаза на ошибку, а надо ее исправлять. Берем компилятор FPC, отключаем контроль границ и контроль переполнения Integer-а, компилируем и запускаем программу. Думаешь, я вижу окружности? Ни разу. Вот, что я вижу (хотя, если закомментировать SetAspectRatio - то все в порядке, появляются окружности):
Цифровой_Aнгел
ну у кого окружности, а у кого и эллипсы :D
а контроль я не отключала.
подскажи, пожалуйста, что с этим делать? mega_chok.gif


заливка есть, а вот что с коэффициентом сжатия делать? =((
volvo
Цитата
а контроль я не отключала.
А он по умолчанию отключен (без него программы меньше по размеру и более быстрые получаются). Так вот включи контроль, и никогда, пока программа не станет полностью работоспособной, не отключай smile.gif Максимум, что можно делать - это выключать проверки для того, чтобы скомпилировать релиз-версию (в смысле, окончательную и уже полностью отлаженную).

Цитата
что с этим делать?
Обходиться без SetAcpectRatio:
Program Circle3;
Uses Graph;

const
R = 185;
R2 = 190 div 2 - 9;

var
x0,y0: integer;
driver, regim, error: integer;
a, b: Word;
Begin
Detectgraph(driver,regim);
Initgraph(driver,regim,'');
Error:=GraphResult;
if Error <> grOK then
begin
writeln(GraphErrorMsg(Error));
Halt(Error)
end;

GetAspectRatio(a,b);
SetLineStyle(SolidLn, 0, ThickWidth);
SetColor(LightGreen);

x0 := GetMaxX div 2;
y0 := GetMaxY div 2;

SetfillStyle(LineFill, Red);
FillEllipse(x0, y0, R, Trunc((a / b) * R));

SetfillStyle(HatchFill, Yellow);
FillEllipse(420, 225, R2, Trunc((a / b) * R2));
FillEllipse(260, 142, R2, Trunc((a / b) * R2));
FillEllipse(280, 353, R2, Trunc((a / b) * R2));

readln;
CloseGraph;
end.
Никаких ошибок, никаких эллипсов... Странно, правда? Рисуешь Circle (окружность) - получаешь эллипс. Рисуешь FillEllipse (заполненный эллипс) - получаешь окружность smile.gif...
Цифровой_Aнгел
Цитата
Странно, правда? Рисуешь Circle (окружность) - получаешь эллипс.

не странно wink.gif

и получились...эллипсы ^_^
volvo
Ну, если тебе надо обеспечить окружности, а не эллипсы только под Турбо-Паскалем, то:
  x0 := GetMaxX div 2;
y0 := GetMaxY div 2;
a := getmaxx; { Вместо GetAspectRatio }
b := getmaxy;

SetfillStyle(LineFill, Red);
FillEllipse(x0, y0, R, Trunc((a / b) * R));

SetfillStyle(HatchFill, Yellow);
FillEllipse(420, 225, R2, Trunc((a / b) * R2));
FillEllipse(260, 142, R2, Trunc((a / b) * R2));
FillEllipse(280, 353, R2, Trunc((a / b) * R2));

Это отработало. Но тогда у тебя будут проблемы с другими компиляторами...
Цифровой_Aнгел
Всё равно эллипсы wacko.gif
volvo
Цитата
Всё равно эллипсы
А вот теперь - НЕ ВЕРЮ! (С)... Проверено на 4-х машинах, везде окружности. У тебя - эллипсы? Так не бывает. Рассказывай, какой монитор, и какой, собственно, компилятор. Запускай в режиме отладки и показывай, чему равно A и B после GetAspectRatio... Что возвращает GetMaxX, GetMaxY? Какая картинка получается? Давай больше информации. Это в конце концов что, мне надо?

Вот чего рисует Турбо Паскаль 7.0:

Nike0
Цитата(Цифровой_Aнгел @ 28.03.2010 13:58) *

Всё равно эллипсы wacko.gif

хм, если честно, ради интереса затестил, вроде как эллипсы)
volvo
Цитата
хм, если честно, ради интереса затестил, вроде как эллипсы)
Посмотри выше, я прилепил скриншот... Это что, эллипсы? И вот так - ВЕЗДЕ, на всех доступных мне машинах.

Стоп... У тебя - НЕ Турбо Паскаль, а какой-то 32-битный. Я предупреждал, что с ним что будут проблемы... Показывай, что выдает Турбо.
Unconnected
Вот это:

uses graph;

const
r=185;
r2=190 div 2 - 9;

var
x0,y0,driver,regim,error:integer;
a,b:word;

begin
detectgraph(driver,regim);
initgraph(driver,regim,'');
x0 := GetMaxX div 2;
y0 := GetMaxY div 2;
a := getmaxx; { Вместо GetAspectRatio }
b := getmaxy;

SetfillStyle(LineFill, Red);
FillEllipse(x0, y0, R, Trunc((a / b) * R));

SetfillStyle(HatchFill, Yellow);
FillEllipse(420, 225, R2, Trunc((a / b) * R2));
FillEllipse(260, 142, R2, Trunc((a / b) * R2));
FillEllipse(280, 353, R2, Trunc((a / b) * R2));
readln;
end.


у меня на TP7 выглядит так (монитор ЭЛТ 17 дюймов):
volvo
Еще раз: Чему равны значения A и B после вызова GetAspectRatio, кто-нибудь мне может сказать?

У меня всегда выдает (10000:10000), то есть, "сжимать" картинку, используя полученные таким образом коэффициенты - бесполезно, соотношение будет таким же, как и без "сжатия", поэтому я попробовал заменить GetAspectRatio на конкретные значения GetMaxX и GetMaxY.

Кстати, создается впечатление, что SetAspectRatio вообще ни к чему не приводит, пытался делать
  GetAspectRatio(a,b);
SetAspectRatio(a, 2*b);
- картинка осталась прежней...
Unconnected
В последнем коде нету GetAspectRatio. Но вот после GetMaxX и GetMaxY переменные A и B равны 639 и 479 соответственно. Или надо было вставить GetAspectRatio?)
volvo
Unconnected
Попробуй добавить GetAspectRatio... Все, что интересует - это значения A и B
Unconnected
По 10000 тоже.
Цифровой_Aнгел
не знаю чем повлияло создание ехе-шника, но после этого эллипсы превратились в круги biggrin.gif

Program Circle3;
Uses Graph;

const
R = 177;
R2 = 180 div 2 - 9;

var
x0,y0: integer;
driver, regim, error: integer;
a, b: Word;
Begin
Detectgraph(driver,regim);
Initgraph(driver,regim,'g:\tp7\bgi');
Error:=GraphResult;
if Error <> grOK then
begin
writeln(GraphErrorMsg(Error));
Halt(Error)
end;


SetLineStyle(0, 0, 3);
SetColor(LightGreen);

x0 := GetMaxX div 2;
y0 := GetMaxY div 2;
a := getmaxx;
b := getmaxy;
SetFillStyle(EmptyFill,Black);
FillEllipse(x0, y0, R, Trunc((a / b) * R));

SetFillStyle(HatchFill,LightBlue);
FillEllipse(412, 220, R2, Trunc((a / b) * R2));

SetFillStyle(XHatchFill,Magenta);
FillEllipse(257, 145, R2, Trunc((a / b) * R2));

SetFillStyle(LtSlashFill,Blue);
FillEllipse(286, 360, R2, Trunc((a / b) * R2));


readln;
CloseGraph;
End.





volvo, большое спасибо !rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.