Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Круг


RimD ©   (2003-01-30 21:45:00) 

Кто знает, как по точкам вывести на канвас круг, т.е. по какой формуле...


AnyKey   (2003-02-07 10:35:00) [1]

У "настоящего" Брезенхема конешна покруче, всего два сложения, и одно умножение внутри цикла. Но мой тоже быстренький.:)))) Идея почти та же. Сдвигаемся на пиксель по одной координате и выясняем на сколько пикселей надо сдвинуться по другой. И никаких синусов и косинусов!


AnyKey   (2003-02-07 10:24:00) [2]

То Timonnn:
Не четверть, а одну восьмую (что, по-видимому, тоже не каждому известно:)). см. алгоритм приведенный выше.


Timonnn   (2003-02-03 23:41:00) [3]

Уравнение окружности известно любому школьнику x*x+y*y=r*r , но не каждому известно, что для ускорения работы программы следует все параметры, которые не меняются от координат точки рассчитать один раз (в начале), также следует рассчитывать только одну четверть окружности, а остальные просто отразить.
P.S. А почему этот вопрос размещён в этом разделе форума?


drin   (2003-02-03 13:40:00) [4]

http://www.codenet.ru/progr/video/alg/alg4.php


AnyKey   (2003-01-31 10:50:00) [5]

Можно строку с while заменить на такую
while ((Radius-DY)*(Radius-DY))+1>(Radius*Radius)-(X*X) do inc(DY);покрасивее будет


AnyKey   (2003-01-31 10:41:00) [6]

Если мне не изменяет память алгоритм Брезенхема выглядит примерно так. Во всяком случае это работает - дырок в круге нет, лишних точек не выводится.

procedure TForm1.Button1Click(Sender: TObject);

//X0,Y0-координаты центра
var
x,X0:integer;
Y0,DY:integer;
i:extended;
j:integer;
Radius: integer;
begin

X0:=100;
Y0:=100;
Radius:=50;
//
X:=0;
DY:=0;
For X:=0 to Round(Radius/SQRT(2)) do
begin
while ((Radius-DY)*(Radius-DY))>(Radius*Radius)-(X*X) do inc(DY);
PaintBox1.Canvas.Pixels[X0+X,Y0+Radius-DY] := clRed;
PaintBox1.Canvas.Pixels[X0-X,Y0+Radius-DY] := clRed;
PaintBox1.Canvas.Pixels[X0+X,Y0-Radius+DY] := clRed;
PaintBox1.Canvas.Pixels[X0-X,Y0-Radius+DY] := clRed;
PaintBox1.Canvas.Pixels[Y0+Radius-DY,X0+X] := clRed;
PaintBox1.Canvas.Pixels[Y0+Radius-DY,X0-X] := clRed;
PaintBox1.Canvas.Pixels[Y0-Radius+DY,X0+X] := clRed;
PaintBox1.Canvas.Pixels[Y0-Radius+DY,X0-X] := clRed;
end;



end;


Bober23   (2003-01-31 09:25:00) [7]

procedure DrawCircle(aCanvas:TCanvas;X0,Y0,Radius:integer);
//X0,Y0-координаты центра
var
x,y:integer;
i:extended;
begin
i := 0;
//i-текущий угол - от 0 до 2*pi
while (i < 6.28) do
begin
x := Round(X0+Radius*cos(i));
y := Round(Y0+Radius*sin(i));
//clBlack или любой другой цвет
aCanvas.Pixels[x,y] := clBlack;
i := i + 0.01;
end;
end;


а вообще-то у Canvas есть метод - Ellipse, который может круг нарисовать


Chubais   (2003-01-31 09:04:00) [8]


> MBo © (31.01.03 07:09)

точна!


Anatoly Podgoretsky   (2003-01-31 07:45:00) [9]

Ищи алгоритмы Брезенхема


MBo   (2003-01-31 07:09:00) [10]

Затейников все больше ;)


Artem Grischenko   (2003-01-31 06:58:00) [11]

Я бы сказал, что тебе тоже не помешает поучить геометрию ;-)
x*x + y*y = r*r

=>

(R/x*x))+(R/(y*y))= 1


konstantinov   (2003-01-31 01:02:00) [12]

Геометрию учить надо!
(R/(X*X))+(R/(Y*Y))=0; - в декартовых координатах;
:)


Наверх

Титульная страница Поиск, карта сайта Написать письмо