Форум «Всё о Паскале» _ Задачи _ Построение эллипса
Автор: DmP 16.12.2007 0:35
В общем есть прога на паскале, строящая эллипс по точкам :
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 16.12.2007 1:27
А зачем?
Автор: DmP 16.12.2007 1:49
Цитата(andriano @ 15.12.2007 21:27)
А зачем?
Долго объяснять, просто надо...
Автор: andriano 16.12.2007 2:14
Тогда хотя бы сформулируй точно, что именно надо. Согласись, трудно решать задачу, не зная, что именно нужно сделать.
Автор: compiler 16.12.2007 2:16
Цитата(DmP @ 15.12.2007 20:49)
Долго объяснять, просто надо...
ну... можна написать свои... в первую очередь иебе могут понадобится div и mod
Автор: DmP 16.12.2007 2:25
Цитата(andriano @ 15.12.2007 22:14)
Тогда хотя бы сформулируй точно, что именно надо. Согласись, трудно решать задачу, не зная, что именно нужно сделать.
надо обойтись без round. Ну и вообще в самом алгоритме построения не должно быть функций round, trunc. Не знаю уж как точнее объяснить...
Цитата(compiler @ 15.12.2007 22:16)
ну... можна написать свои... в первую очередь иебе могут понадобится div и mod
можно пример ?
Автор: andriano 16.12.2007 2: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;
Понимаешь, когда я пишу программу и понимаю, что именно нужно, я стараюсь написть ее более или менее оптимально, когда не понимаю, об оптимальности думать не приходится. Решил заодно избавиться и от мультипликативных операций. На всякий случай.
Автор: DmP 16.12.2007 2:43
Цитата(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 16.12.2007 2:47
Только не обижайся, если изображение будет строиться минут 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;