C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
3D шарик
salmi
Отправлено: 11.01.2005, 01:17


Ученик-кочегар

Группа: Участник
Сообщений: 4



Подскажите пожалуйста как в билдере на канве залить окружность так, чтобы она казалась 3D шариком (если можно, самый простой способ)

Заранее спасибо
AVC
Отправлено: 11.01.2005, 08:53


Ветеран

Группа: Модератор
Сообщений: 1583



Ничего, если я повторюсь?
Радиальный градидиент яркости / цвета.
ykk
Отправлено: 11.01.2005, 22:29


Ученик-кочегар

Группа: Участник
Сообщений: 17



Я извиняюсь, просто не силен в этом.
Если можно, объясните плиз поподрбнее. Не откожусь от простенького примера smile.gif
AVC
Отправлено: 12.01.2005, 10:16


Ветеран

Группа: Модератор
Сообщений: 1583



Примера нет.
Нужно вспомнить функции преобразования координат декартовы — радиальные.
цвет(яркость) = sqrt (kx*(x-xc)**2 + ky*(y-yc)**2)
где то так smile.gif

Еще вариант (очень медленный) — распределение sin/cos от случайного числа дает симпатичный визуальный эффект, сильно напоминающий шарик.
ykk
Отправлено: 12.01.2005, 21:38


Ученик-кочегар

Группа: Участник
Сообщений: 17



Спасибо, есть над чем поработать smile.gif
AVC
Отправлено: 19.01.2005, 10:22


Ветеран

Группа: Модератор
Сообщений: 1583



Вот было немного свободного времени — набросал код. Может еще актуально?
Код не претендует ни на какую оптимальность или универсальность. Он просто рисует 3d шарик.
CODE

void __fastcall TForm1::Bt_SphereClick(TObject *Sender)
{
Image1->Picture = NULL;
TCanvas *cnv = Image1->Canvas;
int x0 = 0;
int y0 = 0;
int xl = Image1->Width;
int yl = Image1->Height;

int xm = x0 + xl — 1;
int ym = y0 + yl — 1;
int xc = x0 + xl / 2;
int yc = y0 + yl / 2;

try {
cnv->Lock();

cnv->Pen  ->Mode  = pmCopy;
cnv->Brush->Style = bsSolid;

cnv->Pen  ->Style = psSolid; //Clear;
cnv->Pen  ->Color = clBlack;
cnv->Brush->Color = clGreen;
//cnv->Rectangle(x0, y0, xm, ym);

cnv->Pen  ->Style = psSolid;
cnv->Brush->Color = clRed;


int R = min(xl/2, yl/2) — 4; // радиус окружности
int r;                       // радиус текущей точки
int c;                       // цвет   текущей точки


// точка максимальной освещенности ТМО для варианта 3 (самый симпатичный)
// цвет точки пропорционален доле растояния (x,y) от ТМО к NRmax
int    x1c   = x0 + xl / 4;
int    y1c   = y0 + yl / 4;
double NRmax = R + sqrt(pow(x1c-xc, 2) + pow(y1c-yc, 2));
double nr;

for (int x=x0; x < xm; x++)
{  for (int y=y0; y < ym; y++)
    {  r = sqrt(pow(x-xc, 2) + pow(y-yc, 2)) + 0.5;
       if (r > R)  continue;

// 1. Градиент яркости от центра к переферии - линейный
//        c = 255 — r*255/R + 0.5;

// 2. Градиент яркости от центра к переферии - синусоидальный (более реалистичен)
//        c = cos((r*M_PI_2)/R) * 150.0 + 55.5;

// 3. Синусоидальный градиент яркости от точки макс. освещенности к краю окружности
         nr = sqrt(pow(x-x1c, 2) + pow(y-y1c, 2));
         if (nr > NRmax)  c = 0;
         else  c = cos((nr*M_PI_2)/NRmax) * 255.0 + 0.5;


// для простоты работаю с одним лучем. BbGgRr
         c = (c &0xFF) << 16;

         cnv->Pixels[x][y] = TColor(c);

    }  // y < ym
}      // x < xm


}  // try cnv->Lock;

__finally {cnv->Unlock(); }
}


Пример работы (вариант 3)
user posted image
zbestr
Отправлено: 20.01.2005, 21:54


Не зарегистрирован







А как от этого избавиться?:
[C++ Error] Unit1.cpp(53): E2268 Call to undefined function 'min'
[C++ Error] Unit1.cpp(62): E2268 Call to undefined function 'sqrt'
[C++ Error] Unit1.cpp(62): E2268 Call to undefined function 'pow'
[C++ Error] Unit1.cpp(79): E2268 Call to undefined function 'cos'
[C++ Error] Unit1.cpp(79): E2451 Undefined symbol 'M_PI_2'

НЕ помогает:
#include
#include
#include
#include
#include
AVC
Отправлено: 21.01.2005, 09:16


Ветеран

Группа: Модератор
Сообщений: 1583



CODE

#include <math.h>

На будующее. Нажимаете на неопределившимся символе F1 и смотрите в левой верхней части экрана Help'а строку вида Header ...
Если не помогает, тогда более сложные способы поиска (типа спросить на форуме smile.gif )

Вернуться в Вопросы программирования в C++Builder