Помощь - Поиск - Пользователи - Календарь
Полная версия: Построение эллипса
Форум «Всё о Паскале» > 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;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.