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

📄 vecmath2.cc

📁 一个用MATLAB语言编写的摄像机标定工具箱,内容丰富
💻 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 + -