2、梁友栋—Barsky裁剪算法描述
1、Bezier曲线的定义:
,
2、三次Bezier曲线的参数表示:
南昌大学实验报告
1、Bezier曲面的定义与生成
2、B样条曲面的定义、生成算法
南昌大学实验报告
二、实验目的
三、实验内容
四、实验要求
六、实验步骤
七、实验报告要求
#include "stdafx.h"
#include "resource.h"
#include "math.h"
#define MAX_LOADSTRING 100
#define KA 0.5 ////物体表面对泛光的反射系数
#define IA 0.02 ////入射的泛光光强
#define KD 0.5 ////漫反射系数
#define Il 0.8 ////入射的光强
#define IR 150 ////入射的红光光强
#define IG 150 ////入射的绿光光强
#define IB 150 ////入射的蓝光光强
#define KS 0.82 ////镜面反射系数
double xc=0,yc=-1500,zc=-3000;////////////设定视点方向
double lx=0,ly=300,lz=-200;////////////设定光源方向
///////////////////////////////////////////
double Cw(double w,double A[][3],int k,int j){
double tem;
tem=(1-w)*(1-w)*(1-w)*A[k][j]+3*w*(1-w)*(1-w)*A[k
return tem;
}
double Suw(double u,double w,double A[][3],int k,i
double tem;
tem=(1-u)*(1-u)*(1-u)*Cw(w,A,k,j)+3*u*(1-u)*(1-u)
return tem;
}
double daou(double u,double w,double A[][3],int k,
double tem;
tem=(6*u-3*u*u-3)*Cw(w,A,k,j)+(9*u*u-12*u+3)*Cw(w
return tem;
}
double daowc(double u,double A[][3],int k,int j){
double tem;
tem=(1-u)*(1-u)*(1-u)*A[k][j]+3*u*(1-u)*(1-u)*A[k
return tem;
}
double daow(double w,double u,double A[][3],int k,
double tem;
tem=(6*w-3*w*w-3)*daowc(u,A,k,j)+(9*w*w-12*w+3)*d
return tem;
}
/////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
{
int k=0,m=1000;
double P[18][2]={{1.4000,2.2500},{1.3375,2.38125}
{0.2,2.55},{0.4,2.4},{1.3,2.4},{1.3,2.25},{0.0,3.
////////{0.0,3.0},{0.8,3.0},{0.0,2.7},{0.2,2.55},{
double A[56][3]={{1.7,1.27,0.0},{1.7,1.27,0.66},{
{2.6,1.275,0.0},{2.6,1.275,0.66},{3.1,0.675,0.66}
{2.3,1.95,0.0},{2.3,1.95,0.25},{2.4,1.875,0.25},{
{2.7,2.25,0.0},{2.7,2.25,0.25},{3.3,2.2,0.25},{3.
{2.8,2.325,0.0},{2.8,2.325,0.25},{3.525,2.34375,0
{2.9,2.325,0.0},{2.9,2.325,0.15},{3.4,2.3625,0.15
{2.8,2.25,0.0},{2.8,2.25,0.15},{3.2,2.25,0.15},{3
{1.6,1.875,0.0},{1.6,1.875,0.30},{1.5,2.1,0.30},{
{2.3,1.875,0.0},{2.3,1.875,0.30},{2.5,2.1,0.30},{
{2.7,1.875,0.0},{2.7,1.875,0.30},{3.0,2.1,0.30},{
{2.7,1.65,0.0},{2.7,1.65,0.30},{3.0,1.65,0.30},{3
{2.7,1.425,0.0},{2.7,1.425,0.30},{3.0,1.20,0.30},
{2.5,0.975,0.0},{2.5,0.975,0.30},{2.65,0.7875,0.3
{2.0,0.75,0.0},{2.0,0.75,0.30},{1.90,0.45,0.30},{
//粉色RGB(255,191,192)紫色RGB(200,88,100)
double X,Y,Z,t,q,R,a,u,w,j,i;
double XT,YT,ZT,XQ,YQ,ZQ,NX,NY,NZ;
double RX,RY,RZ,XC,YC,ZC,LX,LY,LZ,l,arfa,thta,bat
double I;////三色的光强
//HPEN hpen=CreatePen(PS_SOLID,1,RGB(255,191,192)
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTR
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWn
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam,
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
//SelectObject(hdc,hpen);
{
while(k<=14){
for(j=0.0;j<=m;j++){
t=j/m;
R=(1-t)*(1-t)*(1-t)*P[k][0]+3*t*(1-t)*(1-t)*
for(a=0.0;a<=360;a++){
q=2*3.1415926*a/36
X=R*cos(q);
Z=R*sin(q);
Y=(1-t)*(1-t)*(1-t)*P[k][1]+3*t*(1-t)*(1-t
/////////////////////////消隐开始//////////////
XT=(6*t-3*t*t-3)*P[k][0]+(9*t*t-12*t+3)*P[
ZT=XT;
XT=XT*cos(q);
YT=(6*t-3*t*t-3)*P[k][1]+(9*t*t-12*t+3)*P[
ZT=ZT*sin(q);
XQ=R*(-sin(q));
YQ=0;
ZQ=R*cos(q);
NX=YT*ZQ-ZT*YQ;///
NY=ZT*XQ-XT*ZQ;
NZ=XT*YQ-YT*XQ;
l=sqrt(NX*NX+NY*NY+NZ*NZ);
NX=NX/l;
NY=NY/l;
NZ=NZ/l;
XC=xc-X;////////////////视线方向
YC=yc-Y;
ZC=zc-Z;
l=sqrt(XC*XC+YC*YC+ZC*ZC);
XC=XC/l;
YC=YC/l;
ZC=ZC/l;
LX=lx-X;////////////////光线方向
LY=ly-Y;
LZ=lz-Z;
l=sqrt(LX*LX+LY*LY+LZ*LZ);
LX=LX/l;
LY=LY/l;
LZ=LZ/l;
arfa=NX*XC+NY*YC+NZ*ZC;//////////////////法向
thta=LX*NX+LY*NY+LZ*NZ;//////////////////法向
NX=NX*LX*thta;
NY=NY*LY*thta;
NZ=NZ*LZ*thta;
RX=2*NX-LX;////////////////反射方向
RY=2*NY-LY;
RZ=2*NZ-LZ;
l=sqrt(RX*RX+RY*RY+RZ*RZ);
RX=RX/l;
RY=RY/l;
RZ=RZ/l;
bata=RX*XC+RY*YC+RZ*ZC;///////////////视线与反射
if(arfa>=0){
X=(xc*Z-X*zc)/(Z-zc);
Y=(yc*Z-Y*zc)/(Z-zc);
I=IR*KA+KD*Il*
SetPixel(hdc,400+int(80*X),400+int(80*(-Y
//SetPixel(hdc,400+int(80*X),400+int(80*(
}
}
}
if(k==6||k==10) k=k+4;
elsek+=3;
}
/////////////画立体壶嘴和把手/////////////////////////////
k=0;
while(k<=40){
for(i=0.0;i<=500;i++){
u=i/500;
for(j=0.0;j<=500;j++){
w=j/500;
X=Suw(u,w,A,k,0);
Y=Suw(u,w,A,k,1);
Z=Suw(u,w,A,k,2);
//////////////////////////////////////////////////
XT=daou(u,w,A,k,0);
YT=daou(u,w,A,k,1);
ZT=daou(u,w,A,k,2);
XQ=daow(w,u,A,k,0);
YQ=daow(w,u,A,k,1);
ZQ=daow(w,u,A,k,2);
NX=YT*ZQ-ZT*YQ;//////////法向量
NY=ZT*XQ-XT*ZQ;
NZ=XT*YQ-YT*XQ;
l=sqrt(NX*NX+NY*NY+NZ*NZ);
NX=NX/l;
NY=NY/l;
NZ=NZ/l;
XC=xc-X;////////////////视线方向
YC=yc-Y;
ZC=zc-Z;
l=sqrt(XC*XC+YC*YC+ZC*ZC);
XC=XC/l;
YC=YC/l;
ZC=ZC/l;
LX=lx-X;////////////////光线方向
LY=ly-Y;
LZ=lz-Z;
l=sqrt(LX*LX+LY*LY+LZ*LZ);
LX=LX/l;
LY=LY/l;
LZ=LZ/l;
arfa=NX*XC+NY*YC+NZ*ZC;//////////////////法向
thta=LX*NX+LY*NY+LZ*NZ;//////////////////法向
NX=NX*LX*thta;
NY=NY*LY*thta;
NZ=NZ*LZ*thta;
RX=2*NX-LX;
RY=2*NY-LY;
RZ=2*NZ-LZ;
l=sqrt(RX*RX+RY*RY+RZ*RZ);
RX=RX/l;
RY=RY/l;
RZ=RZ/l;
bata=RX*XC+RY*YC+RZ*ZC;///////////////视线与反射
////////////////////////////////////消隐/////
//if(arfa>=0){
X=(xc*Z-X*zc)/(Z-zc);
Y=(yc*Z-Y*zc)/(Z-zc);
if(k==28||k==40) X=-X;
I=IR*KA+KD*Il*
SetPixel(hdc,400+int(80*X),400+int(80*(-Y
//SetPixel(hdc,400+int(80*X),400+int(80*(
//}
}
}
if(k==12) k+=16;
else k+=12;
}
}
//DrawText(hdc, szHello, strlen(szHello), &rt,
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lPa
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WP
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) ==
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
2、实验运行后的截图:
八、实验心得