· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› линии

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Мар 27, 2004 12:06:07

Toxic
Не сталкивался, но вот самое простое, что приходит в голову:
circle(int x,int y, int r)
{
  for(int i=-r;i<=r;i++)
  {
    int s=sqrt(r*r-i*i);
    for(int j=-s;j<=s;j++)
      setpixel(x+j,y+i);
  }
}

или даже так:
circle(int x,int y, int r)
{
  int r2=r*r,s;
  for(int i=-r;i<=r;i++)
    for(int j=0,s=i*i;s<=r2;s+=j,j++,s+=j)
    {
       setpixel(x-j,y+i);
       setpixel(x+j,y+i);
    }
}


Дата: Мар 27, 2004 18:15:36

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


Дата: Мар 27, 2004 18:39:14

у меня есть довольно универсальный алгоритм колличесво итераций равно колличеству закрашиваемых пикселей, но у него есть несколько недостатков. первый из них он не справляестя с самопересечением линии и он строит 1 пиксель за ~ 10^7 тактов. радует то, что, до сих пор я не нашел кривую которую он не мог бы построить


Дата: Мар 28, 2004 09:13:49

_vdk
Для полиномиальных кривых с положительными степенями параметра количество лишних пикселей будет превышать минимально необходимое не более чем в константное число раз.

Пример:
x(t)=t^3 y(t)=t^3
Пусть кривую мы строим на отрезке от 0 до k.
C постоянным шагом будет нарисованно:
dt=1/max(|x'(t)|,|y'(t)|)=1/(3*k^2)
k/dt=3*k^3 точек
А общая длина кривой sqrt(2)*k^3. А если учитывать то что она идет по диагонали то чтоб ее нарисовать нужно k^3 точек.
То есть с фиксированным шагом будет нарисованно всего в 3 раза больше точек.

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.046