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

📄 testtrans.cc

📁 一个用MATLAB语言编写的摄像机标定工具箱,内容丰富
💻 CC
字号:
//
// testtrans.cc
//
// $Id: testtrans.cc,v 1.1.1.1 2001/02/28 00:28:39 cstolte Exp $
//

#include <sgl.h>
#include <assert.h>
#include <iostream>
#include <unistd.h>
#include "testsgl.h"

static void test_Matrix2();
static void test_Transform2();
static void test_Matrix3();
static void test_Transform3();
static void test_Projection3();

int iteration = 0;

int main(int argc, char **argv) {
    int seed = getpid();
    int times = 100000;
    bool forever = false;
    ArgParser ap;
    ap('n', "num-times", &times, Optional);
    ap('s', "seed", &seed, Optional);
    ap('f', "forever", &forever, Optional);
    ap.process("testtrans", argc, argv);

    if (forever == true)
	times = -1;
    cerr << "Starting test of transformations. Seed = " << seed 
	<< ", iterations = " <<	times << endl;
    srand48(seed);

    for (iteration = 0; iteration != times; ++iteration) {
	if (!(iteration % 10000)) cerr << '.';

	test_Matrix2();
	test_Transform2();
	test_Matrix3();
	test_Transform3();
	test_Projection3();
    }
    cerr << endl << " passed all tests!" << endl;
}

static void test_Matrix2() {
    Matrix2 m1, m2;
    m1.identity(); m2.identity();
    Point2 p(doub_random(), doub_random());
    Vector2 v(doub_random(), doub_random());
    Normal2 n(doub_random(), doub_random());

    checkUV(m1.apply(p), p);
    checkUV(m1.apply(v), v);
    checkUV(m1.apply(n), n);

    double d1 = doub_random(), d2 = doub_random();
    m1.scale(d1, d2);
    checkUV(m1.apply(p), Point2(p.u * d1, p.v * d2));
    checkUV(m1.apply(v), Vector2(v.u * d1, v.v * d2));
    Matrix2 m11 = m1;
    m11.invert().transpose();
    checkUV(m1.apply(n), m11.apply(Vector2(n.u, n.v)));
    m1 = m2;

    double d = doub_random();
    m1.rotate(d);
    m1.rotate(-d);
    checkUV(m1.apply(p), p);
    checkUV(m1.apply(v), v);
    checkUV(m1.apply(n), n);
	
    m1.rotate(d).scale(d2, d1);
    m2 = m1;
    m2.invert();
    checkUV(m2.apply(m1.apply(p)), p);
    checkUV(m2.apply(m1.apply(v)), v);
    checkUV(m2.apply(m1.apply(n)), n);
	
    Matrix2 m3 = m2 * m1;
    checkUV(m3.apply(p), m1.apply(m2.apply(p)));
    checkUV(m3.apply(v), m1.apply(m2.apply(v)));
    checkUV(m3.apply(n), m1.apply(m2.apply(n)));
    m2 *= m1;
    assert(m3 == m2);

    m1 = m2;
    if (d1 != 1 || d2 != 1)
	assert(m1.scale(d2, d1) != m2);

    checkUV(Matrix2::unit.apply(p), p);
    checkUV(Matrix2::unit.apply(v), v);
    checkUV(Matrix2::unit.apply(n), n);
}

static void test_Transform2() {
    Transform2 m1;
    Matrix2 m11;
    m1.identity();
    m11.identity();
    Point2 p(doub_random(), doub_random());
    Vector2 v(doub_random(), doub_random());
    Normal2 n(doub_random(), doub_random());

    checkUV(m1.apply(p), p);
    checkUV(m1.apply(v), v);
    checkUV(m1.apply(n), n);

    double d1 = doub_random(), d2 = doub_random(), d3a = doub_random();
    m1.scale(d1, d2);  m11.scale(d1, d2);
    checkUV(m1.apply(p), Point2(p.u * d1, p.v * d2));
    checkUV(m1.apply(v), Vector2(v.u * d1, v.v * d2));
    m1.rotate(d3a);
    m11.rotate(d3a);
    checkUV(m11.apply(p), m1.apply(p));
    checkUV(m11.apply(v), m1.apply(v));
    m1 = Transform2(m11);
    checkUV(m11.apply(p), m1.apply(p));
    checkUV(m11.apply(v), m1.apply(v));
//CO	Transform2 m11 = m1;
//CO	m11.invert().transpose();
//CO	checkUV(m1.apply(n), m11.apply(Vector2(n.u, n.v)));
    m1.identity();
    
    double d3 = doub_random(), d4 = doub_random();
    m1.translate(d3, d4);
    checkUV(m1.apply(p), Point2(p.u + d3, p.v + d4));
    checkUV(m1.apply(v), Point2(v.u , v.v));
    m1.scale(d1, d2);
    checkUV(m1.apply(p), Point2((p.u + d3) * d1, (p.v + d4) * d2));
    checkUV(m1.apply(v), Point2(v.u * d1, v.v * d2));
//CO	m11 = m1;
//CO	m11.invert.transpose();
//CO	checkUV(m1.apply(n), m11.apply(Vector2(n.u, n.v)));
    m1.identity();
    
    double d = doub_random();
    m1.rotate(d);
    m1.rotate(-d);
    checkUV(m1.apply(p), p);
    checkUV(m1.apply(v), v);
    checkUV(m1.apply(n), n);
    
    m1.rotate(d).translate(doub_random(), doub_random());
    m1.scale(d2, d1).translate(doub_random(), doub_random());
    Transform2 m2 = m1;
    m2.invert();
    checkUV(m2.apply(m1.apply(p)), p);
    checkUV(m2.apply(m1.apply(v)), v);
    checkUV(m2.apply(m1.apply(n)), n);
    
    Transform2 m3 = m2 * m1;
    checkUV(m3.apply(p), m1.apply(m2.apply(p)));
    checkUV(m3.apply(v), m1.apply(m2.apply(v)));
    checkUV(m3.apply(n), m1.apply(m2.apply(n)));
    m2 *= m1;
    assert(m3 == m2);

    m1 = m2;
    if (d1 != 1 && d2 != 1)
	assert(m1.scale(d2, d1) != m2);
    
    checkUV(Transform2::unit.apply(p), p);
    checkUV(Transform2::unit.apply(v), v);
    checkUV(Transform2::unit.apply(n), n);
}

static void test_Matrix3() {
    Matrix3 m1, m2;
    m1.identity(); m2.identity();
    Point3 p(doub_random(), doub_random(), doub_random());
    Vector3 v(doub_random(), doub_random(), doub_random());
    Normal3 n(doub_random(), doub_random(), doub_random());

    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);

    double d1 = doub_random(), d2 = doub_random(), d3 = doub_random();
    m1.scale(d1, d2, d3);
    checkXYZ(m1.apply(p), Point3(p.x * d1, p.y * d2, p.z * d3));
    checkXYZ(m1.apply(v), Vector3(v.x * d1, v.y * d2,v.z * d3));
    Matrix3 m11 = m1;
    m11.invert().transpose();
    checkXYZ(m1.apply(n), m11.apply(Vector3(n.x, n.y, n.z)));
    m1 = m2;

    double d = doub_random();
    m1.rotatex(d);
    m1.rotatex(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);
    d = doub_random();
    m1.rotatey(d);
    m1.rotatey(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);
    d = doub_random();
    m1.rotatez(d);
    m1.rotatez(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);
    double dd = doub_random();
    m1.rotatex(d).rotatez(dd);
    m1.rotatez(-dd).rotatex(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);

    if (m1.determinant() != 0)
	assert(equal(m1.determinant(), m1.determinant(m1.adjoint())));

    m1.rotate(dd, Vector3(doub_random(), doub_random(), doub_random()));
    m1.scale(d2, d1, d3);
    m2 = m1;
    m2.invert();
    checkXYZ(m2.apply(m1.apply(p)), p);
    checkXYZ(m2.apply(m1.apply(v)), v);
    checkXYZ(m2.apply(m1.apply(n)), n);
	
    Matrix3 m3 = m2 * m1;
    checkXYZ(m3.apply(p), m1.apply(m2.apply(p)));
    checkXYZ(m3.apply(v), m1.apply(m2.apply(v)));
    checkXYZ(m3.apply(n), m1.apply(m2.apply(n)));
    m2 *= m1;
    assert(m3 == m2);
    m1 = m2;
    if (d1 != 1 && d2 != 1 && d3 != 1)
	assert(m1.scale(d2, d1, d3) != m2);

    checkXYZ(Matrix3::unit.apply(p), p);
    checkXYZ(Matrix3::unit.apply(v), v);
    checkXYZ(Matrix3::unit.apply(n), n);

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatex(d1);
    m2.rotate(d1, Vector3(1, 0, 0));
    checkXYZ(m1.apply(p), m2.apply(p));
    checkXYZ(m1.apply(v), m2.apply(v));
    checkXYZ(m1.apply(n), m2.apply(n));

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatey(d1);
    m2.rotate(d1, Vector3(0, 1, 0));
    checkXYZ(m1.apply(p), m2.apply(p));
    checkXYZ(m1.apply(v), m2.apply(v));
    checkXYZ(m1.apply(n), m2.apply(n));

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatez(d1);
    m2.rotate(d1, Vector3(0, 0, 1));
    checkXYZ(m1.apply(p), m2.apply(p));
    checkXYZ(m1.apply(v), m2.apply(v));
    checkXYZ(m1.apply(n), m2.apply(n));

    p = Point3(1,0,0);
    m1.identity();
    m1.rotatey(M_PI / 2);
    checkXYZ(m1.apply(p), Point3(0,0,-1));
    m1.identity();
    m1.rotatez(M_PI / 2);
    checkXYZ(m1.apply(p), Point3(0,1,0));
    p = Point3(0,1,0);
    m1.identity().rotatex(M_PI / 2);
    checkXYZ(m1.apply(p), Point3(0,0,1));
}

static void test_Transform3() {
    Transform3 m1, m2;
    m1.identity(); m2.identity();
    Point3 p(doub_random(), doub_random(), doub_random());
    Vector3 v(doub_random(), doub_random(), doub_random());
    Normal3 n(doub_random(), doub_random(), doub_random());

    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);

    double d1 = doub_random(), d2 = doub_random(), d3 = doub_random();
    m1.scale(d1, d2, d3);
    checkXYZ(m1.apply(p), Point3(p.x * d1, p.y * d2, p.z * d3));
    checkXYZ(m1.apply(v), Vector3(v.x * d1, v.y * d2,v.z * d3));
//    Transform3 m11 = m1;
//    m11.invert().transpose();
//    checkXYZ(m1.apply(n), m11.apply(Vector3(n.x, n.y, n.z)));
    m1 = m2;

    double d = doub_random();
    m1.rotatex(d);
    m1.rotatex(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);
    d = doub_random();
    m1.rotatey(d);
    m1.rotatey(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);
    d = doub_random();
    m1.rotatez(d);
    m1.rotatez(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);
    double dd = doub_random();
    m1.rotatex(d).rotatez(dd);
    m1.rotatez(-dd).rotatex(-d);
    checkXYZ(m1.apply(p), p);
    checkXYZ(m1.apply(v), v);
    checkXYZ(m1.apply(n), n);

    m1.identity();
    Transform3 m3(m1);
    assert(m1 == m3);

    m1.rotate(dd, Vector3(doub_random(), doub_random(), doub_random()));
    m1.scale(d2, d1, d3);
    m1.translate(doub_random(), doub_random(), doub_random());
    m2 = m1;
    m2.invert();
    checkXYZ(m2.apply(m1.apply(p)), p);
    checkXYZ(m2.apply(m1.apply(v)), v);
    checkXYZ(m2.apply(m1.apply(n)), n);

    m1 = m3;
    d1 = doub_random(), d2 = doub_random(), d3 = doub_random();
    m2 = m1;
    m1.translate(d1, d2, d3);
    checkXYZ(m1.apply(p), m2.apply(p) + Vector3(d1, d2, d3));
    checkXYZ(m1.apply(v), m2.apply(v));
    checkXYZ(m1.apply(n), m2.apply(n));

    m3 = m2 * m1;
    checkXYZ(m3.apply(p), m1.apply(m2.apply(p)));
    checkXYZ(m3.apply(v), m1.apply(m2.apply(v)));
    checkXYZ(m3.apply(n), m1.apply(m2.apply(n)));
    m2 *= m1;
    assert(m3 == m2);
    m1 = m2;
    if (d1 != 1 && d2 != 1 && d3 != 1)
	assert(m1.scale(d2, d1, d3) != m2);

    checkXYZ(Transform3::unit.apply(p), p);
    checkXYZ(Transform3::unit.apply(v), v);
    checkXYZ(Transform3::unit.apply(n), n);

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatex(d1);
    m2.rotate(d1, Vector3(1, 0, 0));
    checkXYZ(m1.apply(p), m2.apply(p));
    checkXYZ(m1.apply(v), m2.apply(v));
    checkXYZ(m1.apply(n), m2.apply(n));

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatey(d1);
    m2.rotate(d1, Vector3(0, 1, 0));
    checkXYZ(m1.apply(p), m2.apply(p));
    checkXYZ(m1.apply(v), m2.apply(v));
    checkXYZ(m1.apply(n), m2.apply(n));

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatez(d1);
    m2.rotate(d1, Vector3(0, 0, 1));
    checkXYZ(m1.apply(p), m2.apply(p));
    checkXYZ(m1.apply(v), m2.apply(v));
    checkXYZ(m1.apply(n), m2.apply(n));

    p = Point3(1,0,0);
    m1.identity();
    m1.rotatey(M_PI / 2);
    checkXYZ(m1.apply(p), Point3(0,0,-1));
    m1.identity();
    m1.rotatez(M_PI / 2);
    checkXYZ(m1.apply(p), Point3(0,1,0));
    p = Point3(0,1,0);
    m1.identity().rotatex(M_PI / 2);
    checkXYZ(m1.apply(p), Point3(0,0,1));
}

static void test_Projection3() {
    Projection3 m1, m2;
    m1.identity(); m2.identity();
    Point3 p(doub_random(), doub_random(), doub_random());
    Vector3 v(doub_random(), doub_random(), doub_random());
    Normal3 n(doub_random(), doub_random(), doub_random());

    checkXYZ(m1.project(p), p);
    checkXYZ(m1.project(v), v);
    checkXYZ(m1.project(n), n);

    double d1 = doub_random(), d2 = doub_random(), d3 = doub_random();
    m1.scale(d1, d2, d3);
    checkXYZ(m1.project(p), Point3(p.x * d1, p.y * d2, p.z * d3));
    checkXYZ(m1.project(v), Vector3(v.x * d1, v.y * d2,v.z * d3));
//    Projection3 m11 = m1;
//    m11.invert().transpose();
//    checkXYZ(m1.project(n), m11.project(Vector3(n.x, n.y, n.z)));
    m1 = m2;

    double d = doub_random();
    m1.rotatex(d);
    m1.rotatex(-d);
    checkXYZ(m1.project(p), p);
    checkXYZ(m1.project(v), v);
    checkXYZ(m1.project(n), n);
    d = doub_random();
    m1.rotatey(d);
    m1.rotatey(-d);
    checkXYZ(m1.project(p), p);
    checkXYZ(m1.project(v), v);
    checkXYZ(m1.project(n), n);
    d = doub_random();
    m1.rotatez(d);
    m1.rotatez(-d);
    checkXYZ(m1.project(p), p);
    checkXYZ(m1.project(v), v);
    checkXYZ(m1.project(n), n);
    double dd = doub_random();
    m1.rotatex(d).rotatez(dd);
    m1.rotatez(-dd).rotatex(-d);
    checkXYZ(m1.project(p), p);
    checkXYZ(m1.project(v), v);
    checkXYZ(m1.project(n), n);

    m1.identity();
    Projection3 m3(m1);
    assert(m1 == m3);

    m1.rotate(dd, Vector3(doub_random(), doub_random(), doub_random()));
    m1.scale(d2, d1, d3);
    m1.translate(doub_random(), doub_random(), doub_random());
    m2 = m1;
    m2.invert();
    checkXYZ(m2.project(m1.project(p)), p);
    checkXYZ(m2.project(m1.project(v)), v);
    checkXYZ(m2.project(m1.project(n)), n);

    m1 = m3;
    d1 = doub_random(), d2 = doub_random(), d3 = doub_random();
    m2 = m1;
    m1.translate(d1, d2, d3);
    checkXYZ(m1.project(p), m2.project(p) + Vector3(d1, d2, d3));
    checkXYZ(m1.project(v), m2.project(v));
    checkXYZ(m1.project(n), m2.project(n));

    m3 = m2 * m1;
    checkXYZ(m3.project(p), m1.project(m2.project(p)));
    checkXYZ(m3.project(v), m1.project(m2.project(v)));
    checkXYZ(m3.project(n), m1.project(m2.project(n)));
    m2 *= m1;
    assert(m3 == m2);
    m1 = m2;
    if (d1 != 1 && d2 != 1 && d3 != 1)
	assert(m1.scale(d2, d1, d3) != m2);

    m1.identity();
    checkXYZ(m1.project(p), p);
    checkXYZ(m1.project(v), v);
    checkXYZ(m1.project(n), n);

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatex(d1);
    m2.rotate(d1, Vector3(1, 0, 0));
    checkXYZ(m1.project(p), m2.project(p));
    checkXYZ(m1.project(v), m2.project(v));
    checkXYZ(m1.project(n), m2.project(n));

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatey(d1);
    m2.rotate(d1, Vector3(0, 1, 0));
    checkXYZ(m1.project(p), m2.project(p));
    checkXYZ(m1.project(v), m2.project(v));
    checkXYZ(m1.project(n), m2.project(n));

    m1.identity(); m2.identity();
    d1 = doub_random();
    m1.rotatez(d1);
    m2.rotate(d1, Vector3(0, 0, 1));
    checkXYZ(m1.project(p), m2.project(p));
    checkXYZ(m1.project(v), m2.project(v));
    checkXYZ(m1.project(n), m2.project(n));

    p = Point3(1,0,0);
    m1.identity();
    m1.rotatey(M_PI / 2);
    checkXYZ(m1.project(p), Point3(0,0,-1));
    m1.identity();
    m1.rotatez(M_PI / 2);
    checkXYZ(m1.project(p), Point3(0,1,0));
    p = Point3(0,1,0);
    m1.identity().rotatex(M_PI / 2);
    checkXYZ(m1.project(p), Point3(0,0,1));
}

⌨️ 快捷键说明

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