Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.04.2008, 18:13
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
Вопрос Эллипс

Вот нашел формулу
Цитата:
Сообщение от wikipedia.org

при 0 < b ≤ a. В этом случае величины a и b — соответственно, большая и малая полуоси эллипса.
Вот так я преобразовал:
Код:
function Ellipse(X, A, B: Integer): Integer;
var
RealA, RealB: Integer;
begin
if A < B then
begin
RealA:=B;
RealB:=A;
end
else
begin
RealA:=A;
RealB:=B;
end;
Result:=Round(Sqrt(RealB*RealB - (X*X*RealB*RealB)/(RealA*RealA)));
end;
Но почему то когда хотел сделать так
Код:
var
i: Integer;
begin
for i:=Image1.Width div 2 to Image1.Width do
Image1.Canvas.Pixels[i, Image1.Height div 2 + Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack;
end;
Вылазит ошибка Invalid Floating Point Operation
Что не так? Может я неправильно преобразовал первое выражение?
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #2  
Старый 10.04.2008, 10:06
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Просто в один прекрасный момент выражение под корнем становиться меньше 0.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #3  
Старый 10.04.2008, 12:56
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Спасибо. Ошибка была там.
Но теперь
Заменил
Код:
Result:=Round(Sqrt(Abs(RealB*RealB - (X*X*RealB*RealB)/(RealA*RealA))));
...
for i:=0 to Image1.Width do
Image1.Canvas.Pixels[i, Ellipse(i, Image1.Width, Image1.Height)]:=clBlack;
И в результате получилось
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #4  
Старый 11.04.2008, 19:17
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Цитата:
Сообщение от The Shadow
Спасибо. Ошибка была там.
Но теперь
Заменил
Код:
Result:=Round(Sqrt(Abs(RealB*RealB - (X*X*RealB*RealB)/(RealA*RealA))));
...
for i:=0 to Image1.Width do
Image1.Canvas.Pixels[i, Ellipse(i, Image1.Width, Image1.Height)]:=clBlack;

Тут нельзя использовать никаких abs. А то получается что если a*a < x*x они как бы меняются местами. Главное условие x должен быть меньше a по модулю. Рисовать надо по циклу, где x принимает значения допустим от -100 до 100.
И использовать два уравнения. Первое положительная полудуга. Второе отрицательная полудуга.
y=b/a*sqrt(a*a-x*x);
y=-b/a*sqrt(a*a-x*x);
И получаем замечательный эллипс.
Ответить с цитированием
  #5  
Старый 12.04.2008, 12:20
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Большое спасибо! Вот так сделал и все OK
Код:
function Ellipse(X, A, B: Integer): Integer;
begin
if A*A < X*X then
Result:=Round(b/a*sqrt(-(a*a-x*x))) else
Result:=Round(b/a*sqrt(a*a-x*x));
end;
var
i: Integer;
begin
for i:={Image1.Width}0 div 2 to Image1.Width div 2 do
begin
Image1.Canvas.Pixels[Image1.Width div 2 + i, Image1.Height div 2 + Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack;
Image1.Canvas.Pixels[Image1.Width div 2 - i, Image1.Height div 2 + Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack;
Image1.Canvas.Pixels[Image1.Width div 2 + i, Image1.Height div 2 - Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack;
Image1.Canvas.Pixels[Image1.Width div 2 - i, Image1.Height div 2 - Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack;
end;
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #6  
Старый 12.04.2008, 13:32
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Сообщения: 227
Версия Delphi: Delphi 7
Репутация: 30
По умолчанию

Да классный эллипс. Осталось только сделать, чтобы параметры вводились с клавиатуры.
Ответить с цитированием
  #7  
Старый 12.04.2008, 13:36
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Мне с клавиатуры не надо =)
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter