📄 svisibility.cpp
字号:
/////////////////////////////////////////////////////////////////////////////////
//
// SVisibility.cpp: implementation of the CSVisibility class.
//
////////////////////////////////////////////////////////////////////////////////
// 版权所有(2002)
// Copyright(2002)
// 编写者: 向世明
// Author: Xiang Shiming
#include "stdafx.h"
#include "SVisibility.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSVisibility::CSVisibility()
{}
CSVisibility::~CSVisibility()
{}
//////////////////////////////////////////////////////////////////////////////////////////////
//
// 小面可见性测试
//
//////////////////////////////////////////////////////////////////////////////////////////////
//可见性测试
//顶点(v1, v2, v3)为左手坐标系下的点
BOOL CSVisibility::IsVisible(const VERTEX3D& v1, const VERTEX3D& v2, const VERTEX3D& v3)
{
//采用平面公式法进行判别:
float x = v1.x * (v2.y * v3.z - v3.y * v2.z);
float y = v2.x * (v3.y * v1.z - v1.y * v3.z);
float z = v3.x * (v1.y * v2.z - v2.y * v1.z);
if((x + y + z) < 0.00001f) return FALSE;
else return TRUE;
}
BOOL CSVisibility::IsVisible(const HOMOCOORD& v1, const HOMOCOORD& v2, const HOMOCOORD& v3)
{
//如果一个三角形中包含无穷远点, 则该三角形是一个畸形三角形, 因而我们规定它不可见
if((ABS(v1.w) < 0.00001f) || (ABS(v2.w) < 0.00001f)
|| (ABS(v3.w) < 0.00001f)) return FALSE;
float x1 = v1.x / v1.w, y1 = v1.y / v1.w, z1 = v1.z / v1.w;
float x2 = v2.x / v2.w, y2 = v2.y / v2.w, z2 = v2.z / v2.w;
float x3 = v3.x / v3.w, y3 = v3.y / v3.w, z3 = v3.z / v3.w;
float x = x1 * (y2 * z3 - y3 * z2);
float y = x2 * (y3 * z1 - y1 * z3);
float z = x3 * (y1 * z2 - y2 * z1);
if((x + y + z) < 0.00001f) return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -