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