Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.27;
Скачать: CL | DM;

Вниз

Из области 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 вся ветка

Текущий архив: 2002.05.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
4-88680
Stupid
2002-03-27 17:55
2002.05.27
Помогите


1-88443
Дмитрий757567
2002-05-17 13:59
2002.05.27
HALT - НЕ НОРМАЛЬНЫЙ


1-88414
mihrutka
2002-05-16 15:02
2002.05.27
Unit was compiled with a different version


1-88476
DenNNis
2002-05-15 14:43
2002.05.27
Добрый день!


1-88454
still_swamp
2002-05-14 17:20
2002.05.27
Как сделать список форм в SDI