Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кривые второго порядка 
:(
    Опции темы
<Spawn>
Дата 30.10.2003, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



На первом курсе инста проходим эти самые кривые и вот решил убить сразу 3-х зайцев, изучив их хорошенько, запрогив на Дельфи, а потом и в СИ. Но вот при прорисовке Эллипса остаются пробелы, если не делать цикл от -b до b. Вот код:
Код
procedure TForm1.FormPaint(Sender: TObject);
var
pt:TPoint;
begin

 b:=Round(sqrt(Sqr(a)-Sqr(c)));
 SetViewportOrgEx(Canvas.Handle, ClientWidth div 2, ClientHeight div 2, @pt);

 //Система координат
 Canvas.MoveTo(0, -ClientHeight div 2);
 Canvas.LineTo(0, ClientHeight);
 Canvas.MoveTo(-ClientWidth div 2, 0);
 Canvas.LineTo(ClientWidth, 0);
 Canvas.TextOut((ClientWidth div 2)-20, -20, 'x');
 Canvas.TextOut(10, -((ClientHeight div 2)-10), 'y');

 //Фокусы
 Canvas.Ellipse(Rect( Point(-c-4, -4), Point(-c+4, 4)));
 Canvas.TextOut( -c, -20, 'F1');
 Canvas.Ellipse(Rect( Point(c-4, -4), Point(c+4, 4)));
 Canvas.TextOut( c, -20, 'F2');

 //Эллипс
 for x:=-a to a do
 begin
   y:=Round(sqrt( sqr(b) * (1 - (sqr(x) / sqr(a)) )));
   Canvas.Pixels[x, y]:=clRed;
   Canvas.Pixels[x, -y]:=clRed;
 end;
 
 //Если не сделать этот цикл, то Эллипс на концах содержит пропуски между нарисованными точками. Можно ли как нить без этого цикла от них избавиться?
 for y:=-b to b do
 begin
   x:=Round(sqrt( sqr(a) * (1 - (sqr(y)) / sqr(b)) ));
   if Canvas.Pixels[x, y]<>clRed then
     Canvas.Pixels[x, y]:=clRed;
   if Canvas.Pixels[-x, y]<>clRed then
     Canvas.Pixels[-x, y]:=clRed;
 end;
end;


где c - расстояние между фокусами.
a - сумма расстояний от фокусов до любой точки эллипса.

ПС: кстати пробовал рисовать на панели (TPanel), но там все страшно глючит. Не пойму из за чего это.

Это сообщение отредактировал(а) <Spawn> - 30.10.2003, 14:09


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
gray_k
Дата 30.10.2003, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Это происходит из-за того, что на краях интервала [-a,a] у тебе двум соседним точкам по оси Ох соответствую точки на оси Oy, различающиеся более, чем на 1. Дискретность себя показывает. Я бы посоветовал рисовать в два цикла, но на меньших интервалах, чтобы циклы не пересекались. вот так будет работать:
Код
for x:=-a to 0 do
begin
  y:=Round(sqrt( sqr(b) * (1 - (sqr(x) / sqr(a)) )));
  y1:=Round(sqrt( sqr(b) * (1 - (sqr(x+1) / sqr(a)) )));
  for y_curr:=y to y1 do begin
       Canvas.Pixels[x, y_curr]:=clRed;
       Canvas.Pixels[x, -y_curr]:=clRed;
  end;
end;

for x:=a downto 0 do
begin
  y:=Round(sqrt( sqr(b) * (1 - (sqr(x) / sqr(a)) )));
  y1:=Round(sqrt( sqr(b) * (1 - (sqr(x-1) / sqr(a)) )));
  for y_curr:=y to y1 do begin
       Canvas.Pixels[x, y_curr]:=clRed;
       Canvas.Pixels[x, -y_curr]:=clRed;
  end;
end;



--------------------
С уважением.
Gray.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1057 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.