📄 vecmath2.cc
字号:
//
// vecmath2.cc
//
// $Id: vecmath2.cc,v 1.1.1.1 2001/02/28 00:28:40 cstolte Exp $
//
#include <sgl/vecmath2.h>
#include <assert.h>
#include <math.h>
const Point2 Point2::origin(0,0);
/////////
// Point2
//
bool
Point2::between(const Point2 &p1, const Point2 &p2) const {
Point2 low = min(p1, p2);
Point2 high = max(p1, p2);
return (u >= low.u && u <= high.u &&
v >= low.v && v <= high.v);
}
double
distance(const Point2 &p1, const Point2 &p2) {
return sqrt(distance_squared(p1, p2));
}
double
distance_squared(const Point2 &p1, const Point2 &p2) {
double du = p1.u - p2.u;
double dv = p1.v - p2.v;
return (du * du + dv * dv);
}
Point2
midpoint(const Point2 &p1, const Point2 &p2)
{
return Point2(lerp(0.5, p1.u, p2.u),
lerp(0.5, p1.v, p2.v));
}
//////////
// Vector2
//
double
Vector2::length_squared() const {
return (u * u + v * v);
}
Vector2
Vector2::normalize() const {
double len = length();
assert(!zero(len));
Vector2 ret(*this);
return ret /= len;
}
Normal2
Vector2::transpose() const {
return Normal2(u, v);
}
double
cross(const Vector2 &v1, const Vector2 &v2) {
return v1.u * v2.v - v1.v * v2.u;
}
double
dot(const Vector2 &v1, const Vector2 &v2) {
return (v1.u * v2.u + v1.v * v2.v);
}
double
cos(const Vector2 &v1, const Vector2 &v2) {
return dot(v1.normalize(), v2.normalize());
}
Vector2
reflection(const Normal2 &n, const Vector2 &wi) {
return -wi + 2. * dot(wi, n) * n.transpose();
}
int
refraction(const Normal2 &n, const Vector2 &wi, Vector2 *wt,
double ni, double nt) {
double eta = ni/nt;
Vector2 i = -wi;
double cosi = -dot(i,n);
double cost = 1.0 - eta * eta * (1.0 - cosi * cosi);
if (cost < 0.0)
return 0;
*wt = eta * i + (eta*cosi - sqrt(cost))*n.transpose();
return 1;
}
//////////////////////////////////////////////////////////////////////////////
// Normal2
//
double
Normal2::length_squared() const {
return (u * u + v * v);
}
Normal2
Normal2::normalize() const {
double len = length();
assert(!zero(len));
Normal2 ret(*this);
return ret /= len;
}
Vector2
Normal2::transpose() const {
return Vector2(u, v);
}
double
dot(const Normal2 &n1, const Normal2 &n2) {
return (n1.u * n2.u + n1.v * n2.v);
}
double
dot(const Vector2 &v1, const Normal2 &n2) {
return (v1.u * n2.u + v1.v * n2.v);
}
double
dot(const Normal2 &n1, const Vector2 &v2) {
return (n1.u * v2.u + n1.v * v2.v);
}
double
cos(const Normal2 &n1, const Normal2 &n2) {
return dot(n1.normalize(), n2.normalize());
}
double
cos(const Vector2 &v1, const Normal2 &n2) {
return dot(v1.normalize(), n2.normalize());
}
double
cos(const Normal2 &n1, const Vector2 &v2) {
return dot(n1.normalize(), v2.normalize());
}
///////
// Ray2
//
std::ostream &
operator<<(std::ostream &os, const Ray2 &r) {
os << r.o << "->" << r.d << std::endl;
return os;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -