Форум: "WinAPI";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
ВнизИз области GDI Найти похожие ветки
← →
SPeller (2002-03-27 10:06) [0]Может кто делал подобные задачи. Надо через API из кводрата сделать окружность - плавный переход из одного в другое. Подкиньте идею или линку где посмотреть чего можно. Плиз!
← →
Виктор Щербаков (2002-03-27 10:08) [1]Может RoundRect поможет?
← →
SPeller (2002-03-27 10:14) [2]Нет, RoundRect рисует прямоугольник с закруглёнными концами, а мне надо, чтобы стороны квадрата постепенно выгибались до образования окружности (диагональ квадрата равна диаметру будущей окружности). Прошу прощения, что сразу не написал об этом.
← →
Виктор Щербаков (2002-03-27 10:22) [3]Тогда придется повозиться c Arc.
← →
SPeller (2002-03-27 10:34) [4]Я знаю что Arc, просто мне нужна схема, как и куда этот Arc подгонять. 8 параметров дело не из лёгких (для меня) - каждый обрабатывать...... Желательно бы примерчик, допустим, квадрат 50х50 переходит в окружность....
← →
SVM (2002-03-27 10:40) [5]А параметры в RoundRect (Width, Height) нельзя постепенно менять,
так, чтобы квадрат закруглялся, а на последнем этапе заменить окружностью?
← →
Виктор Щербаков (2002-03-27 10:41) [6]SVM (27.03.02 10:40)
Дык ему не нужно чтобы углы закруглялись. Нужно чтобы гнулись стороны, а углы оставались на своем месте.
← →
SVM (2002-03-27 10:50) [7]А,понял...
← →
MBo (2002-03-27 12:02) [8]x0,y0,xx:integer;
a,b,maxa:integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
x0:=200;
y0:=200;
xx:=100;
maxa:=trunc(1.414*xx);
canvas.pen.Mode:=pmNotXor;
canvas.Rectangle(x0-xx,y0-xx,x0+xx,y0+xx);
a:=xx;
timer1.enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if a=xx then
canvas.Rectangle(x0-xx,y0-xx,x0+xx,y0+xx)
else if a<maxa then begin
canvas.arc(x0-a,y0-b,x0+a,y0+b,x0-xx,y0-xx,x0-xx,y0+xx);
canvas.arc(x0-a,y0-b,x0+a,y0+b,x0+xx,y0+xx,x0+xx,y0-xx);
canvas.arc(x0-b,y0-a,x0+b,y0+a,x0-xx,y0+xx,x0+xx,y0+xx);
canvas.arc(x0-b,y0-a,x0+b,y0+a,x0+xx,y0-xx,x0-xx,y0-xx);
end;
inc(a);
if a>maxa then begin
timer1.enabled:=false;
exit;
end;
b:=trunc(sqrt(sqr(xx*a) div (sqr(a)-sqr(xx))));
canvas.arc(x0-a,y0-b,x0+a,y0+b,x0-xx,y0-xx,x0-xx,y0+xx);
canvas.arc(x0-a,y0-b,x0+a,y0+b,x0+xx,y0+xx,x0+xx,y0-xx);
canvas.arc(x0-b,y0-a,x0+b,y0+a,x0-xx,y0+xx,x0+xx,y0+xx);
canvas.arc(x0-b,y0-a,x0+b,y0+a,x0+xx,y0-xx,x0-xx,y0-xx);
end;
← →
Nikolay M. (2002-03-27 12:11) [9]А при чем тут вообще АPI? Как на API нарисовать окружность или как сложить 2 числа?
Идею могу предложить такую: проводишь луч из центра квадрата, находишь 2 точки пересечения луча с квадратом и точкой на будущей окружности - получится отрезок, заключенный между окружностью и квадратом. Делаешь так для всех точек квадрата - получится много отрезков разной длины. Делишь каждый отрезок на 10 равных частей. Если потом точку, принадлежащую квадрату, будешь двигать по лучу в начало каждого отрезка получится то, что задумал.
Звучит, наверное, страшнее, чем есть на самом деле.
← →
SPeller (2002-03-27 12:20) [10]>Nikolay M. © (27.03.02 12:11)
>А при чем тут вообще АPI?
Потому-что не от меня это зависит. Да и чем API хуже ?
← →
SPeller (2002-03-27 12:22) [11]>MBo © (27.03.02 12:02)
Спасибо за пример. Проверю. Думаю, что на API перевести будет несложно.
← →
SPeller (2002-03-27 16:10) [12]MBo ©
Огромный сэнкс!!! Работает!
← →
MBo (2002-03-27 16:38) [13]SPeller
ты уж упрости, чтобы y0-xx по 10 раз не считать и т.д.
(это координаты углов квадрата,их 1 раз посчитать надо)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c