IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Построение эллипса
DmP
сообщение 15.12.2007 20:35
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


В общем есть прога на паскале, строящая эллипс по точкам :

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. Если можно, то каким образом ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 15.12.2007 21:27
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


А зачем?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DmP
сообщение 15.12.2007 21:49
Сообщение #3





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Цитата(andriano @ 15.12.2007 21:27) *

А зачем?


Долго объяснять, просто надо...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 15.12.2007 22:14
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Тогда хотя бы сформулируй точно, что именно надо.
Согласись, трудно решать задачу, не зная, что именно нужно сделать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
compiler
сообщение 15.12.2007 22:16
Сообщение #5


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(DmP @ 15.12.2007 20:49) *
Долго объяснять, просто надо...
ну... можна написать свои...
в первую очередь иебе могут понадобится div и mod


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DmP
сообщение 15.12.2007 22:25
Сообщение #6





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Цитата(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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 15.12.2007 22:35
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Ну, не хочешь говорить, тогда не обижайся:
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;

Понимаешь, когда я пишу программу и понимаю, что именно нужно, я стараюсь написть ее более или менее оптимально, когда не понимаю, об оптимальности думать не приходится.
Решил заодно избавиться и от мультипликативных операций.
На всякий случай.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DmP
сообщение 15.12.2007 22:43
Сообщение #8





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Цитата(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;

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

Проблема в том, что этот вопрос был придуман не мной и, честно говоря, я сам не пойму чего от меня хотят.
Но все равно спасибо, попробую использовать этот код...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 15.12.2007 22:47
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Только не обижайся, если изображение будет строиться минут 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;


Сообщение отредактировано: andriano - 15.12.2007 22:52
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 17.06.2024 17:52
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"