Ну, допустим, залить-то не проблема (для этого достаточно после отрисовки круга вызвать SetFillStyle и FloodFill с координатами центра окружности и зеленым цветом в качестве границы). Но ведь у тебя программа вылетает при попытке выполнить вот эту строку:
Цитата
SetAspectRatio(GetMaxX-a*x0 div2,GetMaxY-b*y0);
Исправь сначала эту ошибку, потом будешь делать заливку...
Цифровой_Aнгел
28.03.2010 16:02
эм....всмысле вылетает? у меня всё нормально
volvo
28.03.2010 16:08
Значит, контроль границ отключен... Не надо этого делать. В настройках компилятора (Options -> Compiler) отметь все, что находится в группе Runtime Errors, нажми Ok, перекомпилируй и запусти программу.
Не отключай никогда контроль. Лучше чуть больше времени уделить отладке, чем думать, что у тебя все в порядке, а потом попробовать запустить программу на другом компьютере, где другие настройки, и она начнет вылетать.
Добавлено через 4 мин. А вот тебе и доказательство того, что не надо закрывать глаза на ошибку, а надо ее исправлять. Берем компилятор FPC, отключаем контроль границ и контроль переполнения Integer-а, компилируем и запускаем программу. Думаешь, я вижу окружности? Ни разу. Вот, что я вижу (хотя, если закомментировать SetAspectRatio - то все в порядке, появляются окружности):
Цифровой_Aнгел
28.03.2010 16:24
ну у кого окружности, а у кого и эллипсы :D а контроль я не отключала. подскажи, пожалуйста, что с этим делать?
заливка есть, а вот что с коэффициентом сжатия делать? =((
volvo
28.03.2010 16:57
Цитата
а контроль я не отключала.
А он по умолчанию отключен (без него программы меньше по размеру и более быстрые получаются). Так вот включи контроль, и никогда, пока программа не станет полностью работоспособной, не отключай Максимум, что можно делать - это выключать проверки для того, чтобы скомпилировать релиз-версию (в смысле, окончательную и уже полностью отлаженную).
Цитата
что с этим делать?
Обходиться без SetAcpectRatio:
Program Circle3;
Uses Graph;
const
R = 185;
R2 = 190div2 - 9;
var
x0,y0: integer;
driver, regim, error: integer;
a, b: Word;
Begin
Detectgraph(driver,regim);
Initgraph(driver,regim,'');
Error:=GraphResult;
if Error <> grOK thenbegin
writeln(GraphErrorMsg(Error));
Halt(Error)
end;
GetAspectRatio(a,b);
SetLineStyle(SolidLn, 0, ThickWidth);
SetColor(LightGreen);
x0 := GetMaxX div2;
y0 := GetMaxY div2;
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 (заполненный эллипс) - получаешь окружность ...
Цифровой_Aнгел
28.03.2010 17:24
Цитата
Странно, правда? Рисуешь Circle (окружность) - получаешь эллипс.
не странно
и получились...эллипсы ^_^
volvo
28.03.2010 17:38
Ну, если тебе надо обеспечить окружности, а не эллипсы только под Турбо-Паскалем, то:
x0 := GetMaxX div2;
y0 := GetMaxY div2;
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нгел
28.03.2010 17:58
Всё равно эллипсы
volvo
28.03.2010 18:03
Цитата
Всё равно эллипсы
А вот теперь - НЕ ВЕРЮ! (С)... Проверено на 4-х машинах, везде окружности. У тебя - эллипсы? Так не бывает. Рассказывай, какой монитор, и какой, собственно, компилятор. Запускай в режиме отладки и показывай, чему равно A и B после GetAspectRatio... Что возвращает GetMaxX, GetMaxY? Какая картинка получается? Давай больше информации. Это в конце концов что, мне надо?
Вот чего рисует Турбо Паскаль 7.0:
Nike0
28.03.2010 18:11
Цитата(Цифровой_Aнгел @ 28.03.2010 13:58)
Всё равно эллипсы
хм, если честно, ради интереса затестил, вроде как эллипсы)
volvo
28.03.2010 18:12
Цитата
хм, если честно, ради интереса затестил, вроде как эллипсы)
Посмотри выше, я прилепил скриншот... Это что, эллипсы? И вот так - ВЕЗДЕ, на всех доступных мне машинах.
Стоп... У тебя - НЕ Турбо Паскаль, а какой-то 32-битный. Я предупреждал, что с ним что будут проблемы... Показывай, что выдает Турбо.
Unconnected
28.03.2010 18:35
Вот это:
uses graph;
const
r=185;
r2=190div2 - 9;
var
x0,y0,driver,regim,error:integer;
a,b:word;
begin
detectgraph(driver,regim);
initgraph(driver,regim,'');
x0 := GetMaxX div2;
y0 := GetMaxY div2;
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
28.03.2010 18:51
Еще раз: Чему равны значения A и B после вызова GetAspectRatio, кто-нибудь мне может сказать?
У меня всегда выдает (10000:10000), то есть, "сжимать" картинку, используя полученные таким образом коэффициенты - бесполезно, соотношение будет таким же, как и без "сжатия", поэтому я попробовал заменить GetAspectRatio на конкретные значения GetMaxX и GetMaxY.
Кстати, создается впечатление, что SetAspectRatio вообще ни к чему не приводит, пытался делать
GetAspectRatio(a,b);
SetAspectRatio(a, 2*b);
- картинка осталась прежней...
Unconnected
28.03.2010 19:02
В последнем коде нету GetAspectRatio. Но вот после GetMaxX и GetMaxY переменные A и B равны 639 и 479 соответственно. Или надо было вставить GetAspectRatio?)
volvo
28.03.2010 19:06
Unconnected Попробуй добавить GetAspectRatio... Все, что интересует - это значения A и B
Unconnected
28.03.2010 19:15
По 10000 тоже.
Цифровой_Aнгел
28.03.2010 19:39
не знаю чем повлияло создание ехе-шника, но после этого эллипсы превратились в круги
Program Circle3;
Uses Graph;
const
R = 177;
R2 = 180div2 - 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 thenbegin
writeln(GraphErrorMsg(Error));
Halt(Error)
end;
SetLineStyle(0, 0, 3);
SetColor(LightGreen);
x0 := GetMaxX div2;
y0 := GetMaxY div2;
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, большое спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.