Залить каждый из внутренних кругов любыми стилем и цветом.помогите пожалуста=((
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.
Ну, допустим, залить-то не проблема (для этого достаточно после отрисовки круга вызвать SetFillStyle и FloodFill с координатами центра окружности и зеленым цветом в качестве границы). Но ведь у тебя программа вылетает при попытке выполнить вот эту строку:
SetAspectRatio(GetMaxX-a*x0 div 2,GetMaxY-b*y0);
эм....всмысле вылетает? у меня всё нормально
Значит, контроль границ отключен... Не надо этого делать. В настройках компилятора (Options -> Compiler) отметь все, что находится в группе Runtime Errors, нажми Ok, перекомпилируй и запусти программу.
Не отключай никогда контроль. Лучше чуть больше времени уделить отладке, чем думать, что у тебя все в порядке, а потом попробовать запустить программу на другом компьютере, где другие настройки, и она начнет вылетать.
Добавлено через 4 мин.
А вот тебе и доказательство того, что не надо закрывать глаза на ошибку, а надо ее исправлять. Берем компилятор FPC, отключаем контроль границ и контроль переполнения Integer-а, компилируем и запускаем программу. Думаешь, я вижу окружности? Ни разу. Вот, что я вижу (хотя, если закомментировать SetAspectRatio - то все в порядке, появляются окружности):
Эскизы прикрепленных изображений
ну у кого окружности, а у кого и эллипсы :D
а контроль я не отключала.
подскажи, пожалуйста, что с этим делать?
заливка есть, а вот что с коэффициентом сжатия делать? =((
Program Circle3;Никаких ошибок, никаких эллипсов... Странно, правда? Рисуешь Circle (окружность) - получаешь эллипс. Рисуешь FillEllipse (заполненный эллипс) - получаешь окружность ...
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.
Ну, если тебе надо обеспечить окружности, а не эллипсы только под Турбо-Паскалем, то:
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));
Всё равно эллипсы
Вот это:
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.
Еще раз: Чему равны значения A и B после вызова GetAspectRatio, кто-нибудь мне может сказать?
У меня всегда выдает (10000:10000), то есть, "сжимать" картинку, используя полученные таким образом коэффициенты - бесполезно, соотношение будет таким же, как и без "сжатия", поэтому я попробовал заменить GetAspectRatio на конкретные значения GetMaxX и GetMaxY.
Кстати, создается впечатление, что SetAspectRatio вообще ни к чему не приводит, пытался делать
GetAspectRatio(a,b);
- картинка осталась прежней...
SetAspectRatio(a, 2*b);
В последнем коде нету GetAspectRatio. Но вот после GetMaxX и GetMaxY переменные A и B равны 639 и 479 соответственно. Или надо было вставить GetAspectRatio?)
Unconnected
Попробуй добавить GetAspectRatio... Все, что интересует - это значения A и B
По 10000 тоже.
не знаю чем повлияло создание ехе-шника, но после этого эллипсы превратились в круги
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.