Форум: "Система";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];
ВнизКруг Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c