Помощь - Поиск - Пользователи - Календарь
Полная версия: Построение эллипса
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DmP
В общем есть прога на паскале, строящая эллипс по точкам :

Program circle;
uses crt, graph;
var graphdriver,graphmode: integer;
yy,x0,y0,x,a,b: integer;
y,xx: real;
Begin
graphdriver:=detect; clrscr;
write('Введите координаты центра эллипса : '); readln(x0,y0);
write('Введите a,b : '); readln(a,b);
initgraph(graphmode,graphdriver,'f:\bp\BGI'); cleardevice;
for x:=0 to a do
begin
y:=round(sqrt(1-sqr(x)/sqr(a))*b);
putpixel(x+x0,y+y0,7); putpixel(x+x0,-y+y0,7);
putpixel(-x+x0,y+y0,7); putpixel(-x+x0,-y+y0,7);
end;
for yy:=0 to b do
begin
xx:=round(sqrt(1-sqr(yy)/sqr(b))*a);
putpixel(xx+x0,yy+y0,7); putpixel(xx+x0,-yy+y0,7);
putpixel(-xx+x0,yy+y0,7); putpixel(-xx+x0,-yy+y0,7);
end;
readkey;
closegraph;
End.



Вопрос : можно ли её как-нибудь переделать не используя посторонних функций округления в формуле, наподобие round и trunc. Если можно, то каким образом ?
andriano
А зачем?
DmP
Цитата(andriano @ 15.12.2007 21:27) *

А зачем?


Долго объяснять, просто надо...
andriano
Тогда хотя бы сформулируй точно, что именно надо.
Согласись, трудно решать задачу, не зная, что именно нужно сделать.
compiler
Цитата(DmP @ 15.12.2007 20:49) *
Долго объяснять, просто надо...
ну... можна написать свои...
в первую очередь иебе могут понадобится div и mod
DmP
Цитата(andriano @ 15.12.2007 22:14) *

Тогда хотя бы сформулируй точно, что именно надо.
Согласись, трудно решать задачу, не зная, что именно нужно сделать.

В этих строчках :

y:=round(sqrt(1-sqr(x)/sqr(a))*b);
...
xx:=round(sqrt(1-sqr(yy)/sqr(b))*a);


надо обойтись без round. Ну и вообще в самом алгоритме построения не должно быть функций round, trunc.
Не знаю уж как точнее объяснить...

Цитата(compiler @ 15.12.2007 22:16) *

ну... можна написать свои...
в первую очередь иебе могут понадобится div и mod

можно пример ? smile.gif

andriano
Ну, не хочешь говорить, тогда не обижайся:
function MyTrunc(a : real):integer;
var
i,j : integer;
begin
i := -32767;
while ((i-1) < a) and (i < 32767) do inc(i);
MyTrunc := i;
end;

Понимаешь, когда я пишу программу и понимаю, что именно нужно, я стараюсь написть ее более или менее оптимально, когда не понимаю, об оптимальности думать не приходится.
Решил заодно избавиться и от мультипликативных операций.
На всякий случай.
DmP
Цитата(andriano @ 15.12.2007 22:35) *

Ну, не хочешь говорить, тогда не обижайся:
function MyTrunc(a : real):integer;
var
i,j : integer;
begin
i := -32767;
while ((i-1) < a) and (i < 32767) do inc(i);
MyTrunc := i;
end;

Понимаешь, когда я пишу программу и понимаю, что именно нужно, я стараюсь написть ее более или менее оптимально, когда не понимаю, об оптимальности думать не приходится.
Решил заодно избавиться и от мультипликативных операций.
На всякий случай.

Проблема в том, что этот вопрос был придуман не мной и, честно говоря, я сам не пойму чего от меня хотят.
Но все равно спасибо, попробую использовать этот код...
andriano
Только не обижайся, если изображение будет строиться минут 5.
А если серьезно, то, думаю, лучше все операции, включая извлечение квадратного корня, расписать в целых числах.
Непример, так:
function isqrt(x:longint):longint; {arithmetic version}
var a,b:longint;
begin
b:=x; {initial value}
repeat
a:=b;
b:=(a+x div a) div 2;
until a<=b;
isqrt:=a;
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.