Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.005 c
14-88627
DRUG
2002-04-19 17:59
2002.05.27
Regedit


4-88673
SPeller
2002-03-27 06:49
2002.05.27
Разрешение


7-88649
skiph
2002-03-02 11:27
2002.05.27
Файл


1-88410
Lit_Bogdan
2002-05-17 00:06
2002.05.27
График типа DBChart


6-88582
BOrda
2002-03-17 15:36
2002.05.27
сокет, адрес и порт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский