Слава, ты, Слава.. Всё-таки не снёс я глядеть на твои мучения,
заставил ты меня оторваться от проекта, взять ручку и карандаш и подумать 3 минуты. Ну тут же всё банально... Я же тебе всё объяснил в ICQ тот раз. Перечитал бы лучше что я тебе писал.
Код:
#define RADIUS 256
#define GRIDSTEP 8
#define CURVATURE 0.75
void mesh()
{
int x, y;
float distance, z;
for (y = -RADIUS; y < RADIUS - 1; y += GRIDSTEP)
{
for (x = -RADIUS; x < RADIUS - 1; x += GRIDSTEP)
{
distance = sqrtf(x*x + y*y);
if (distance < RADIUS)
{
z = 1.0 - CURVATURE + CURVATURE * distance/RADIUS;
plot(x/z + RADIUS, y/z + RADIUS);
}
else
plot(x + RADIUS, y + RADIUS);
}
}
}
Добавлено через 15 минут
Работает это так
Код:
#define RADIUS 256 // радиус гипотетической сферы
#define GRIDSTEP 8 // шаг сетки
#define CURVATURE 0.75 // кривизна поверхности 0..1
// функиця рассчета искривления поверхности
void mesh()
{
int x, y; // пара целочисл. переменных, координаты
float distance, z; // пара переменных с плав. точкой
// цикл по Y
// цикл нач.значние условие выр.выпол. после кажд итерации
for (y = -RADIUS; y < RADIUS - 1; y += GRIDSTEP)
{
// вложенный цикл по X
// цикл нач.значние условие выр. выпол. после кажд итерации
for (x = -RADIUS; x < RADIUS - 1; x += GRIDSTEP)
{
// расстояние от центра до текущй точки
// вычисляется по теореме пифагора:
// гипотенуза=корень(катет1^2 + катет2^2)
// это расстояние никогда не будет больше RADIUS
distance = sqrtf(x*x + y*y);
// смотрим, лежит ли текущая точка внутри круга, круг задан
// радиусом
if (distance < RADIUS)
{
// да, точка внутри круга
// почитаем ее "дистанцию от экрана", при этом заметим, что
// distance изменяется от 0 до RADIUS, таки образом
// выражение distance/RADIUS принимает значения 0...1
z = 1.0 - CURVATURE + CURVATURE * distance/RADIUS;
plot(x/z + RADIUS, y/z + RADIUS); // ставим точку круга(линзы)
}
else
plot(x + RADIUS, y + RADIUS); // эта точка вне круга
}
}
}