⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include "nurbs.h"#include "drawing.h"extern void MakeWindow( void );	    /* External system routine to create a window */void (*DrawTriangle)();		    /* Pointer to triangle drawing function *//* This generates the NURB surface for a torus, centered about the origin */static NurbSurface *generateTorus(double majorRadius, double minorRadius){    /* These define the shape of a unit torus centered about the origin. */    double xvalues[] = { 0.0, -1.0, -1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0 };    double yvalues[] = { 1.0, 1.0, 0.0, -1.0, -1.0, -1.0, 0.0, 1.0, 1.0 };    double zvalues[] = { 0.0, 1.0, 1.0, 1.0, 0.0, -1.0, -1.0, -1.0, 0.0 };    double offsets[] = { -1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 0.0, -1.0, -1.0 };    /* Piecewise Bezier knot vector for a quadratic curve with four segments */    long knots[] = { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4 };    long i, j;    double r2over2 = sqrt( 2.0 ) / 2.0;    double weight;    NurbSurface * torus = (NurbSurface *) malloc( sizeof(NurbSurface) );    CHECK( torus );    /* Set up the dimension and orders of the surface */    torus->numU = 9;	    /* A circle is formed from nine points */    torus->numV = 9;    torus->orderU = 3;	    /* Quadratic in both directions */    torus->orderV = 3;    /* After the dimension and orders are set, AllocNurb creates the dynamic     * storage for the control points and the knot vectors */    AllocNurb( torus, NULL, NULL );    for (i = 0; i < 9; i++)    {	for (j = 0; j < 9; j++)	{	    weight = ((j & 1) ? r2over2 : 1.0) * ((i & 1) ? r2over2 : 1.0);	    /* Notice how the weights are pre-multiplied with the x, y and z values */	    torus->points[i][j].x = xvalues[j]				    * (majorRadius + offsets[i] * minorRadius) * weight;	    torus->points[i][j].y = yvalues[j]				    * (majorRadius + offsets[i] * minorRadius) * weight;	    torus->points[i][j].z = (zvalues[i] * minorRadius) * weight;	    torus->points[i][j].w = weight;	}    }    /* The knot vectors define piecewise Bezier segments (the same in both U and V). */    for (i = 0; i < torus->numU + torus->orderU; i++)	torus->kvU[i] = torus->kvV[i] = (double) knots[i];    return torus;}/* These drawing routines assume a window of around 400x400 pixels */voidScreenProject( Point4 * worldPt, Point3 * screenPt ){    screenPt->x = worldPt->x / worldPt->w * 100 + 200;    screenPt->y = worldPt->y / worldPt->w * 100 + 200;    screenPt->z = worldPt->z / worldPt->w * 100 + 200;}static voidLineTriangle( SurfSample * v0, SurfSample * v1, SurfSample * v2 ){    MoveTo( (short) (v0->point.x * 100 + 200), (short) (v0->point.y * 100 + 200) );    LineTo( (short) (v1->point.x * 100 + 200), (short) (v1->point.y * 100 + 200) );    LineTo( (short) (v2->point.x * 100 + 200), (short) (v2->point.y * 100 + 200) );    LineTo( (short) (v0->point.x * 100 + 200), (short) (v0->point.y * 100 + 200) );}main(){    NurbSurface * torus;    MakeWindow();	    /* Create a window on the screen */    /* Set up the subdivision tolerance (facets span about two pixels) */    SubdivTolerance = 2.0;    DrawTriangle = LineTriangle;    torus = generateTorus( 1.3, 0.3 );    DrawSubdivision( torus );/*  DrawEvaluation( torus );   */   /* Alternate drawing method */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -