salmi |
Отправлено: 11.01.2005, 01:17 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 4
|
Подскажите пожалуйста как в билдере на канве залить окружность так, чтобы она казалась 3D шариком (если можно, самый простой способ)
Заранее спасибо |
|
AVC |
Отправлено: 11.01.2005, 08:53 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Ничего, если я повторюсь?
Радиальный градидиент яркости / цвета. |
|
ykk |
Отправлено: 11.01.2005, 22:29 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 17
|
Я извиняюсь, просто не силен в этом.
Если можно, объясните плиз поподрбнее. Не откожусь от простенького примера |
|
AVC |
Отправлено: 12.01.2005, 10:16 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Примера нет.
Нужно вспомнить функции преобразования координат декартовы — радиальные.
цвет(яркость) = sqrt (kx*(x-xc)**2 + ky*(y-yc)**2)
где то так
Еще вариант (очень медленный) — распределение sin/cos от случайного числа дает симпатичный визуальный эффект, сильно напоминающий шарик. |
|
ykk |
Отправлено: 12.01.2005, 21:38 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 17
|
Спасибо, есть над чем поработать |
|
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)
|
|
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
|
На будующее. Нажимаете на неопределившимся символе F1 и смотрите в левой верхней части экрана Help'а строку вида Header ...
Если не помогает, тогда более сложные способы поиска (типа спросить на форуме ) |
|