Развернуть объект, чтобы показать его
double RevolveFn(double z, void* pArg) (
if (z « -1.1) (
return sqrt(l — (z + 2)*(z + 2));
} else if (z » 0.8) (
/b> Щ^' Глава 4. Создание фигур
. Тело вращения
return sqrt(2 - (z - 2)*(z - 2));
} else (
return 0.5;
} }
// Создать тело вращения
void CMainFrame::OnEditSolidr()
{
// Создать объект по заданной функции
NewScene () ;
m_pShape = new C3dShape;
m_pShape-»CreateRSolid(-3.0, 2.2, 0.2, TRUE, TRUE, RevolveFn, NULL, 16);
m_pScene-»AddChiid(m_pShape) ;
// Развернуть объект, чтобы показать его со стороны m_pShape-»SetDirection(0, -1, 0) ;
)
Как видите, в данном случае мы имеем дело с двумя функциями. RevolveFn возвращает значения радиуса для заданной продольной координаты, а функция OnEditSolidr вызывается при выполнении команды меню Edit ¦ Solid of Revolution. Для построения объекта внутри функции OnEditSolidr вызываются функции RevolveFn и C3dShape::CreateRSolid. Аргументы CreateRSolid выглядят несколько необычно, поэтому позвольте мне объяснить их назначение.
Создавая функцию CreateRSolid, я не собирался делать ее универсальной. Вместо того чтобы обрабатывать координаты концов объекта, я решил всегда строить фигуру вдоль оси z. Таким образом, написанная вами функция (в данном
Тепа вращения
/h2>
случае RevolveFn) возвращает радиус объекта как функцию координаты по оси г. Аргументами CreateRSolid являются максимальное и минимальное значения координат по оси z, приращение по оси z, две логические величины, определяющие необходимость замыкания концов фигуры, указатель на функцию радиуса, необязательный аргумент, передаваемый в функцию радиуса, и наконец количество граней в круговой поверхности.
В нашем случае необязательный аргумент функции радиуса не используется, однако вы, например, можете передать в нем указатель на какую-нибудь таблицу данных. При таком подходе можно написать обобщенную функцию, которая строила бы более сложные тела вращения с использованием данных таблицы.
После того как объект будет создан, вам наверняка захочется развернуть его и переместить в итоговое положение. Как видно на примере функции OnEditSolidr в приведенном выше фрагменте, я развернул объект так, чтобы он был обращен вдоль оси у, а не вдоль своей первоначальной оси z.
Содержание Назад Вперед