Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование окружности, Строго в одну сторону 
V
    Опции темы
AlexST
Дата 13.8.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня возник вопрос: Есть ли алгоритм рисования окружности строго по\против часовой стрелки. Т. е. чтобы прорисовка шла последовательно, не по частям.
Или самому писать?

А то чего-то не найду никак...
PM MAIL ICQ   Вверх
ivashkanet
Дата 13.8.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(AlexST @  13.8.2006,  17:30 Найти цитируемый пост)
Есть ли алгоритм рисования окружности строго по\против часовой стрелки.

Не понял. Какой именно алгоритм тебе нужен?

Для твоего случая (по/против часовой стрелки) лучше всего использовать такую формулу:
x = x0 + r*cos(alpha)
y = y0 + r*sin(alpha)
(x0,y0) -- центр окружности, r -- ее радиус. alpha -- угол, от 0 до 2*pi.

Если хочешь нарисовать окружность по часовой стрелке начиная с pi/2, например, то агоритм будет 
такой:
1) ставишь точку для alpha = pi/2
2) уменьшаешь alpha на нужный шаг. Ставишь точку.
3) повторяешь п2 до тех пор пока alpha > -3pi/2 (один оборот назад от точки pi/2)

Что-то в этом роде  smile 
PM MAIL WWW ICQ   Вверх
esperant0
Дата 13.8.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(ivashkanet @ 13.8.2006,  19:03)
Цитата(AlexST @  13.8.2006,  17:30 Найти цитируемый пост)
Есть ли алгоритм рисования окружности строго по\против часовой стрелки.

Не понял. Какой именно алгоритм тебе нужен?

Для твоего случая (по/против часовой стрелки) лучше всего использовать такую формулу:
x = x0 + r*cos(alpha)
y = y0 + r*sin(alpha)
(x0,y0) -- центр окружности, r -- ее радиус. alpha -- угол, от 0 до 2*pi.

Если хочешь нарисовать окружность по часовой стрелке начиная с pi/2, например, то агоритм будет 
такой:
1) ставишь точку для alpha = pi/2
2) уменьшаешь alpha на нужный шаг. Ставишь точку.
3) повторяешь п2 до тех пор пока alpha > -3pi/2 (один оборот назад от точки pi/2)

Что-то в этом роде  smile

нет это не лучше всего да и вообще посредственный алгоритм.


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Fin
Дата 13.8.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



esperant0, Если чуть вспомнить тригонометрию, то этот алгоритм можно свести к простому прибавлению и умножению. Надо только воспользоваться разложению формул sin(a+b); cos(a+b). Где b равна 1 градусу или 1 минуте в зависимости от желаний.


--------------------
Пролетал мимо.
PM MAIL   Вверх
ivashkanet
Дата 13.8.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(esperant0 @  13.8.2006,  20:15 Найти цитируемый пост)
нет это не лучше всего да и вообще посредственный алгоритм.

esperant0, чем тебе он не понравился smile 

В любом случае для рисования фигуры нужны ее точки. Мой способ очень прост, элементарно кодируется. Лишних затрат процессора не требует. Универсален (можно нарисовать любую чать окружности).

А твой, пока, вообще ничего не умеет  smile 

P.S. Если ты такой спец, то предложи свой. Просто обос..ть любой может. Ты обоснуй smile 
PM MAIL WWW ICQ   Вверх
esperant0
Дата 13.8.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(ivashkanet @ 13.8.2006,  20:42)
Цитата(esperant0 @  13.8.2006,  20:15 Найти цитируемый пост)
нет это не лучше всего да и вообще посредственный алгоритм.

esperant0, чем тебе он не понравился smile 

В любом случае для рисования фигуры нужны ее точки. Мой способ очень прост, элементарно кодируется. Лишних затрат процессора не требует. Универсален (можно нарисовать любую чать окружности).

А твой, пока, вообще ничего не умеет  smile 

P.S. Если ты такой спец, то предложи свой. Просто обос..ть любой может. Ты обоснуй smile

Есть известный алгоритм рисования окружности, который не использует не синусов не косинов. Очень быстр и прост. Эффективней вашего. Алгоритм имеется в любом хорошем учебнике по комп. графике.

Добавлено @ 22:17 
тут есть ответ на ваши вопросы http://www.codenet.ru/progr/video/alg/alg4.php


с уважением


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
ivashkanet
Дата 14.8.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



esperant0, зачет  smile 
Но этот алгоритм не соответствует одному из требований задачи:
Цитата(AlexST @  13.8.2006,  17:30 Найти цитируемый пост)
Есть ли алгоритм рисования окружности строго по\против часовой стрелки. Т. е. чтобы прорисовка шла последовательно, не по частям.


PM MAIL WWW ICQ   Вверх
AlexST
Дата 14.8.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята! Вы меня не поняли.
ivashkanet, мне нужен целочисленный алгоритм, оптимизированный для прорисовки по экрану (нет вычисления лишних точек). Т. е. типа Брезенхема, но ,esperant0, он рисует окружность частями, а я говорю про последовательность точек. Каждая следующая точка продолжает кривую, формируя окружность.
PM MAIL ICQ   Вверх
ivashkanet
Дата 14.8.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



AlexST, так ведь можно сделать 8 проходов метода Брезенхема и будет тебе окружность
P.S. Надо было сразу все условия задачи давать smile 
PM MAIL WWW ICQ   Вверх
AlexST
Дата 15.8.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ivashkanet @  14.8.2006,  21:04 Найти цитируемый пост)
так ведь можно сделать 8 проходов метода Брезенхема

Да. Придётся делать самому.
Спасибо!

Это сообщение отредактировал(а) AlexST - 15.8.2006, 14:24
PM MAIL ICQ   Вверх
ivashkanet
Дата 15.8.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



AlexST, ты переходил по ссылке esperant0?

В кратце идея (она конечно в лоб, но ничего умнее на вскидку не приходит smile ):
Метод Брезенхема по сути рисует только 1/8 часть окружности (верхнюю половину I четверти). А остальное дорисовывает исходя из симметрии окружности.
Получается, что эти части рисуются одновременно (почти). Тебя это не устраивает. Так? Поэтому, вместо одновременного рисования ставим последовательное. Алгоритм будет работать медленнее (7 лишних раз нужно координаты точек окружности вычислять), но зато так как надо. 
Еще один минус: отправной точкой рисования может быть только лубая их начальных точек этих восьмушек.
Код
procedure bres_circle(xc,yc,r:interger):
 var x,y,d:integer:
 procedure sim(x,y, part:integer);
  begin
    case part of
    1: putpixel(x+xc,y+yc,White);
    2: putpixel(x+xc,-y+yc,White);
    3: putpixel(-x+xc,-y+yc,White);
    4: putpixel(-x+xc,y+yc,White);
    5: putpixel(y+xc,x+yc,White);
    6: putpixel(y+xc,-x+yc,White);
    7: putpixel(-y+xc,-x+yc,White);
    8: putpixel(-y+xc,x+yc,White);
  end;
   
  end;
  begin

  for part:= 1 to 8
  begin
  x:=0;
  y:=r;
  d:=3-2*y;

  while(x <= y) do
    begin
     sim(x,y, part)
     if d<0    then d:=d+4*x+6
     else begin
     d:=d+4*(x-y)+10;
     dec(y)
    end;
  inc(x)

  end
  end;
 end;

Что нить такое. Не проверял, но должно работать smile
PM MAIL WWW ICQ   Вверх
AlexST
Дата 15.8.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ivashkanet @  15.8.2006,  14:06 Найти цитируемый пост)
 (верхнюю половину I четверти)
Это как тебе захочется.

Цитата(ivashkanet @  15.8.2006,  14:06 Найти цитируемый пост)
(7 лишних раз нужно координаты точек окружности вычислять)
Зачем вычислять? Можно хранить координаты точек и всё!

Цитата(ivashkanet @  15.8.2006,  14:06 Найти цитируемый пост)
Еще один минус: отправной точкой рисования может быть только лубая их начальных точек этих восьмушек.
Минуса не вижу.  smile 


Это сообщение отредактировал(а) AlexST - 15.8.2006, 14:29
PM MAIL ICQ   Вверх
ivashkanet
Дата 15.8.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(AlexST @  15.8.2006,  14:28 Найти цитируемый пост)
Это как тебе захочется.

Я не понял кому это хочется? Мне или тебе   smile 
То что немного изменив этот алгоритм можно получить рисование любой 1/8 окружности? Так это очевидно smile 
Цитата(AlexST @  15.8.2006,  14:28 Найти цитируемый пост)
Зачем вычислять? Можно хранить координаты точек и всё!

Ты хоть представляешь сколько точек придется хранить?
Тебе какой алгоритм нужен? Быстрый, но конкретно жрущий память или немного медленный, но не требующий ресурсы машины?
Цитата(AlexST @  15.8.2006,  14:28 Найти цитируемый пост)
Минуса не вижу

Уточни: В твоей конкретно задаче это не минус? или не минус вообще?
PM MAIL WWW ICQ   Вверх
AlexST
Дата 15.8.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ivashkanet @  15.8.2006,  14:49 Найти цитируемый пост)
Ты хоть представляешь сколько точек придется хранить?
 Немного. А что, ты думаешь что в любом случае лучше вычислять?

Цитата(ivashkanet @  15.8.2006,  14:49 Найти цитируемый пост)
конкретно жрущий память
Это навряд ли.

Уточняю: ИМХО не минус вообще. А в моей задаче тем более.

PM MAIL ICQ   Вверх
ivashkanet
Дата 15.8.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(AlexST @  15.8.2006,  14:57 Найти цитируемый пост)
Немного. А что, ты думаешь что в любом случае лучше вычислять?

AlexST, понимаешь, окружность это примитив, который должен рисоваться быстро.
Не будет же у тебя все прилложение состоять из одной окружности. Нет.

Давай посчитаем сколько примерно понадобится точек для окружности радиусом 100 пикселей:
Так как мы на каждом шаге идем либо вниз либо вправо, то для рисования четверти круга нам понадобится около 150 точек (чтобы попасть из точки (0, 100) в (100, 0) нужно в любом случае "прошагать" 100 пикселей вправо и 100 вниз, но так как мы иногда идем одновременно и вниз и вправо, то  будем считать, что вниз мы прошагали всего 50 пикселей). 
Поэтому для нашей 1/8 придеться хранить координаты 75 точек = 75*2 точки* 2 байта (в один не влезем никак) = 300 байт на одну окружность.

А если нам их нужно тысячи нарисовать (это ведь примитив, он обычно тучами рисуется smile )

Короче вопросы есть smile
Ясно что нужно выбирать в каждой конкретной ситуации свое решение.

Например если ты хочешь чтобы точка просто бегала по окружности фиксированого радиуса, то ясно что лучше всего сохранять точки. 
А если радиус окружности меняется, то, ИМХО, лучше пересчитывать smile

Добавлено @ 15:42 
В общем бири алгоритм и пользуйся smile
Если потом тебя не устроит его скорость, то приходи сюда. Всесте подумаем  smile 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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