Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ как нарисовать круг......

Автор: leone.incognito 19.08.2007 18:47

Собственно сам ворпос:Как нарисовать !!точками!! круг или дугу(с помощью функции PutPixel?) в Паскале? unsure.gif


Добавлено через 1 мин.
хотя-бы принцып!

Автор: volvo 19.08.2007 19:00

Собственно, переходим в полярную систему координат... Как нарисовать окружность в полярной системе? Правильно, Phi изменяем от 0 до 360 с нужным тебе шагом, R остается неизменным. Все что тебе осталось - это вот тут:
http://forum.pascal.net.ru/index.php?s=&showtopic=15345&view=findpost&p=89214
взять процедуру перевода координат из полярной СК в декартову, и отрисовать точки

Автор: leone.incognito 19.08.2007 19:18

хе-хе.А сколько лет мне далжно быть чтоб лазить в этом форуме?(А так : спосибо)

Автор: compiler 27.08.2007 0:44

у меня сейчас немного похожая задача возникает, поетому я тут обдумывал много способов...

если тебя пугает полярная система координат или тригонометрия, то круг можна нарисовать так
Прикрепленное изображение, где А и С произвольные точки, а О центр с заданными координатами.
1)найти координаты точки А
нам нужна любая начальная точка... для этого выражаем одну координату через другое(уравнение длины отрезка), а вторую координату оставляем такой как есть
2)Шаг
нам необходимо выбрать шаг(длинна АС)
если шаг задается в длине дуги(а не отрезка), то находим длину отрезка(через пи).
3)треугольник АСО
выражаем длинны АС и СО
4)система уравнений
2 уравнения, 2 неизвестных. решаем...
рисуем точку в получиных координатах
ЗЫ так как использовались уравнения 2-го порядка будут моменты когда надо будет делать выбор... но в круге это не важно
ЗЗЫ если пространство трехмерное то необходима еще одна точка(например точка напротив А) для третьего уравнения.
ЗЗЗЫ( smile.gif ) будут вопросы пиши...

Автор: leone.incognito 31.08.2007 3:12

а моно-ли не использовать шаг... а определить его с помощью угла?(насчёт предыд.сообщения :я перешёл в девятый) .Дело в том что основная моя задача создать массив точек в ТРЁХ измерениях ,использовать какую-нибудь из них как ось и прокрутить всё это вокруг неё. Я уже писал нечто подобное в алгоритмах но там мне указали на квантерионы(так они наз.?) и всё.Я почитал статьи-обалдел .... wacko.gif и понял что сначала-бы хорошо разобраться в 2D . Тут мне в голову пришла мысль что наверно круг рисуют через градус и я решил написать об этом здесь .... norespect.gif (это неправильно-сам понял) .в общем вот в чём дело: что такое угол в координатной системе? знаем что есть ось О (x,y) ,точка А (x,y) и угол (любой )....расстояние между ними(точкой О и А ) сохраняется....h-h-h-h-h-e-e-e-e-e-e-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-l-p!!! как я понимаю тут есть точка (например) С в которую переходит А, какое-то их отношение будет равно углу .... эххххх

Добавлено через 4 мин.
а так спасибо

Автор: klem4 31.08.2007 13:38

uses graph;

function get_x(const x: single; const r: integer): single;
begin
get_x := r * sin(x / 180 * pi);
end;

function get_y(const y: single; const r: integer): single;
begin
get_y := r * cos(y / 180 * pi);
end;

procedure draw_circle(const radius, cx, cy, color: integer);
var
angle: single;
begin
angle := 0;
while (angle < 360) do begin
putpixel(round(cx + get_x(angle, radius)), round(cy - get_y(angle, radius)), color);
angle := angle + 1;
end;
end;

var
gd, gm: integer;

begin

gd := detect;
initgraph(gd, gm, '');

draw_circle(50, getmaxx div 2, getmaxy div 2, red);
draw_circle(30, getmaxx div 2 + 100, getmaxy div 2 - 100, white);

readln;
closegraph();
end.

Автор: Archon 1.09.2007 13:28

Странно, что никто не вспомнил алгоритм Брезенхама для рисования окружности. Вот подробное описание вместе с реализацией на Паскале: http://virlib.eunnet.net/mif/text/n0498/4.html

Автор: Чужак 2.09.2007 19:13

Вот смотри-эллипс не только отрисовывается по точкам,
но и вращается. Как реализовывать систему координат, объяснял на форуме volvo.


program El;
uses crt,graph;
var gd, gm, X0, Y0: Integer;
X,Y,cX,cY,a,b,i,angl: Real;
begin
gd := detect;
initgraph(gd, gm, '');
X0:=320; Y0:=240; i:=0;
a:=50; b:=150; angl:=0;
repeat
while i<360 do
begin
i:=i+0.5;
cX:=a*cos(i);
cY:=b*sin(i);
X:=X0+cX*cos(angl)-cY*sin(angl);
Y:=Y0+cX*sin(angl)+cY*cos(angl);
PutPixel(Round(X), Round(Y), 15);
end;
Delay(200); i:=0;
ClearDevice; angl:=angl+0.01;
until keypressed;
closegraph;
end.

Убираешь отсюда цикл
while i<360 do 
,
убираешь
 ClearDevice; 
и
 angl:=angl+0.01;

-это все для вращения.
И вот-отрисовка эллипса по точкам.
А часный случай эллипса-это круг.