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

Вниз

Круг   Найти похожие ветки 

 
RimD   (2003-01-30 21:45) [0]

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


 
konstantinov ©   (2003-01-31 01:02) [1]

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


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

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

=>

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


 
MBo ©   (2003-01-31 07:09) [3]

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


 
Anatoly Podgoretsky ©   (2003-01-31 07:45) [4]

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


 
Chubais ©   (2003-01-31 09:04) [5]


> MBo © (31.01.03 07:09)

точна!


 
Bober23 ©   (2003-01-31 09:25) [6]

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, который может круг нарисовать


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

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

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;


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

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


 
drin ©   (2003-02-03 13:40) [9]

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


 
Timonnn ©   (2003-02-03 23:41) [10]

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


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

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


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

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.024 c
8-100345
boolean
2002-12-25 11:58
2003.03.31
Мастера, подскажите


3-100174
stone
2003-03-13 10:58
2003.03.31
TADOCommand.States


3-100157
Gorik
2003-03-12 19:16
2003.03.31
Строгие графы


14-100385
Andrey
2003-03-11 11:12
2003.03.31
Можно ли считать программу своей


14-100384
Volly
2003-03-13 11:18
2003.03.31
Изменение интерфейса