本文整理汇总了C++中math::Matrix类的典型用法代码示例。如果您正苦于以下问题:C++ Matrix类的具体用法?C++ Matrix怎么用?C++ Matrix使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Matrix类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: sampleSize
void
AAKR::normalize(Math::Matrix& mean, Math::Matrix& std)
{
// Resize mean and standard deviation variables.
mean.resizeAndFill(1, sampleSize(), 0);
std.resizeAndFill(1, sampleSize(), 0);
// Compute mean.
for (unsigned i = 0; i < sampleSize(); i++)
mean(i) = sum(m_data.get(0, m_num_values - 1, i, i)) / m_num_values;
// Compute standard deviation.
for (unsigned j = 0; j < sampleSize(); j++)
{
double sum = 0;
// Sum of the power of two difference
// between the value and the mean.
for (unsigned i = 0; i < m_num_values; i++)
sum += std::pow(m_data(i, j) - mean(j), 2);
// Standard deviation.
std(j) = std::sqrt(sum / m_num_values);
// Normalize each member of the data set.
for (unsigned i = 0; i < m_num_values; i++)
{
if (std(j))
m_norm(i, j) = (m_data(i, j) - mean(j)) / std(j);
else
m_norm(i, j) = 0;
}
}
}
开发者ID:posilva,项目名称:dune,代码行数:34,代码来源:AAKR.cpp
示例2:
TEST(MatrixTest, DetTest)
{
const Math::Matrix mat1(
{
{ -0.95880162984708284f, 0.24004047608997131f, -0.78172309932665407f, -0.11604124457222834f },
{ -0.36230592086261376f, -0.75778166876017261f, 0.33041059404631740f, -1.06001391941094836f },
{ 0.00260215210936187f, 1.27485610196385113f, -0.26149859846418033f, -0.59669701186364876f },
{ 0.36899429848485432f, 3.01720896813933104f, 2.10311476609438719f, -1.68627076626448269f }
}
);
const float expectedDet1 = 4.07415413729671f;
float ret1 = mat1.Det();
EXPECT_TRUE(Math::IsEqual(ret1, expectedDet1, TEST_TOLERANCE));
const Math::Matrix mat2(
{
{ -1.0860073221346871f, 0.9150354098189495f, -0.2723201933559999f, 0.2922832160271507f },
{ -1.0248331304801788f, -2.5081237461125205f, -1.0277123574586633f, -0.2254690663329798f },
{ -1.4227635282899367f, -0.0403846809122684f, 0.9216148477171653f, 1.2517067488015878f },
{ -0.1160254467152022f, 0.8270675274393656f, 1.0327218739781614f, -0.3674886870220400f }
}
);
const float expectedDet2 = -6.35122307880942f;
float ret2 = mat2.Det();
EXPECT_TRUE(Math::IsEqual(ret2, expectedDet2, TEST_TOLERANCE));
}
开发者ID:Tellus,项目名称:colobot,代码行数:30,代码来源:matrix_test.cpp
示例3: shells
DWI2QBI (const Math::Matrix<value_type>& FRT_SHT, Math::Matrix<value_type>& normalise_SHT, const DWI::Shells& shells) :
FRT_SHT (FRT_SHT),
normalise_SHT (normalise_SHT),
shells (shells),
dwi (FRT_SHT.columns()),
qbi (FRT_SHT.rows()),
amps (normalise ? normalise_SHT.rows() : 0) { }
开发者ID:JohnWangDataAnalyst,项目名称:mrtrix3,代码行数:7,代码来源:dwi2qbi.cpp
示例4: run
void run ()
{
DWI::Tractography::Properties properties;
DWI::Tractography::Writer<> writer (argument.back(), properties);
for (size_t n = 0; n < argument.size()-1; n++) {
Math::Matrix<float> M;
try {
M.load (argument[n]);
if (M.columns() != 3)
throw Exception ("file \"" + argument[n] + "\" does not contain 3 columns - ignored");
DWI::Tractography::Streamline<float> tck (M.rows());
for (size_t i = 0; i < M.rows(); i++) {
tck[i].set (M (i,0), M (i,1), M (i,2));
}
writer (tck);
writer.total_count++;
}
catch (Exception) { }
}
}
开发者ID:JohnWangDataAnalyst,项目名称:mrtrix3,代码行数:25,代码来源:tckimport.cpp
示例5:
void CalibrationWnd::calcAdcI2Curr()
{
// Make linear assumption, e.i.
//I = a*adc + b*1;
Math::Matrix<2> XtX;
Math::Vector<2> XtY;
int sz = adcI.size();
for ( int i=0; i<2; i++ )
{
QVector<int> * a;
if ( i==0 )
a = &adcI;
else
a = 0;
for ( int j=0; j<2; j++ )
{
QVector<int> * b;
if ( j==0 )
b = &adcI;
else
b = 0;
qreal v = 0.0;
for ( int k=0; k<sz; k++ )
{
qreal va = ( a ) ? a->at( k ) : 1.0;
qreal vb = ( b ) ? b->at( k ) : 1.0;
v += va * vb;
}
XtX[i][j] = v;
}
qreal v = 0.0;
for ( int k=0; k<sz; k++ )
{
qreal va = ( a ) ? a->at( k ) : 1.0;
qreal vy = curr.at( k );
v += va * vy;
}
XtY[i] = v;
}
// A = (XtX)^-1 * XtY;
Math::Matrix<2> invXtX;
invXtX = XtX.inv();
Math::Vector<2> A;
for ( int i=0; i<2; i++ )
{
qreal v = 0.0;
for ( int j=0; j<2; j++ )
{
v += invXtX[i][j] * XtY[j];
}
A[i] = v;
}
aAdcI = A[0];
bAdcI = A[1];
}
开发者ID:z80,项目名称:voltamper,代码行数:56,代码来源:calibration_wnd.cpp
示例6: writeAsciiMatrix
void writeAsciiMatrix(const std::string& fname, const Math::Matrix<T,P,S>& M,
const std::string& meta, const bool trans = false) {
Math::Range start(0,0);
Math::Range end(M.rows(), M.cols());
std::ofstream ofs(fname.c_str());
if (!ofs.is_open())
throw(std::runtime_error("Cannot open " + fname + " for writing."));
MatrixWriteImpl<T,P,S,internal::BasicMatrixFormatter<T> >::write(ofs, M, meta, start, end, trans);
}
开发者ID:GrossfieldLab,项目名称:loos,代码行数:10,代码来源:MatrixWrite.hpp
示例7: mat
void
TestMatrix::runSubTest18(double& res, double& expected, std::string& subTestName)
{
expected = 1;
subTestName = "simple_symmetric_invert";
#ifdef COSMO_LAPACK
Math::SymmetricMatrix<double> mat(2, 2);
mat(0, 0) = 2;
mat(1, 1) = 3;
mat(1, 0) = 1;
mat.writeIntoTextFile("test_files/matrix_test_18_original.txt");
Math::SymmetricMatrix<double> invMat = mat;
invMat.invert();
invMat.writeIntoTextFile("test_files/matrix_test_18_inverse.txt");
Math::Matrix<double> prod = mat;
prod *= invMat;
prod.writeIntoTextFile("test_files/matrix_test_18_product.txt");
res = 1;
for(int i = 0; i < prod.rows(); ++i)
{
for(int j = 0; j < prod.rows(); ++j)
{
if(i == j)
{
if(!Math::areEqual(prod(i, j), 1.0, 1e-5))
{
output_screen("FAIL! Diagonal element " << i << " must be 1 but it is " << prod(i, j) << std::endl);
res = 0;
}
}
else
{
if(!Math::areEqual(prod(i, j), 0.0, 1e-5))
{
output_screen("FAIL! Non-diagonal element " << i << " " << j << " must be 0 but it is " << prod(i, j) << std::endl);
res = 0;
}
}
}
}
#else
output_screen_clean("This test (below) is skipped because Cosmo++ has not been linked to lapack" << std::endl);
res = 1;
#endif
}
开发者ID:aslanyan,项目名称:cosmopp,代码行数:51,代码来源:test_matrix.cpp
示例8: run
void run()
{
InputBufferType dwi_buffer (argument[0], Image::Stride::contiguous_along_axis (3));
Math::Matrix<cost_value_type> grad = DWI::get_valid_DW_scheme<cost_value_type> (dwi_buffer);
size_t dwi_axis = 3;
while (dwi_buffer.dim (dwi_axis) < 2) ++dwi_axis;
INFO ("assuming DW images are stored along axis " + str (dwi_axis));
Math::Matrix<cost_value_type> bmatrix;
DWI::grad2bmatrix (bmatrix, grad);
Math::Matrix<cost_value_type> binv (bmatrix.columns(), bmatrix.rows());
Math::pinv (binv, bmatrix);
int method = 1;
Options opt = get_options ("method");
if (opt.size()) method = opt[0][0];
opt = get_options ("regularisation");
cost_value_type regularisation = 5000.0;
if (opt.size()) regularisation = opt[0][0];
opt = get_options ("mask");
Ptr<MaskBufferType> mask_buffer;
Ptr<MaskBufferType::voxel_type> mask_vox;
if (opt.size()){
mask_buffer = new MaskBufferType (opt[0][0]);
Image::check_dimensions (*mask_buffer, dwi_buffer, 0, 3);
mask_vox = new MaskBufferType::voxel_type (*mask_buffer);
}
Image::Header dt_header (dwi_buffer);
dt_header.set_ndim (4);
dt_header.dim (3) = 6;
dt_header.datatype() = DataType::Float32;
dt_header.DW_scheme() = grad;
OutputBufferType dt_buffer (argument[1], dt_header);
InputBufferType::voxel_type dwi_vox (dwi_buffer);
OutputBufferType::voxel_type dt_vox (dt_buffer);
Image::ThreadedLoop loop ("estimating tensor components...", dwi_vox, 1, 0, 3);
Processor processor (dwi_vox, dt_vox, mask_vox, bmatrix, binv, method, regularisation, loop.inner_axes()[0], dwi_axis);
loop.run_outer (processor);
}
开发者ID:szho42,项目名称:mrtrix3,代码行数:49,代码来源:dwi2tensor.cpp
示例9: runtime_error
void
AAKR::computeDistance(Math::Matrix query)
{
if (query.rows() != 1)
throw std::runtime_error("unable to compute distance: reference is not row vector.");
if ((unsigned)query.columns() != sampleSize())
throw std::runtime_error("unable to compute distance: sample size does not match.");
m_distances.fill(0.0);
// Fill distances vector.
for (unsigned i = 0; i < m_num_values; i++)
{
Math::Matrix q = query - m_norm.row(i);
m_distances(i) = std::sqrt(sum(q * transpose(q)));
};
}
开发者ID:posilva,项目名称:dune,代码行数:18,代码来源:AAKR.cpp
示例10: Render
void Render(Gfx::CGLDevice *device, Gfx::CModelFile *modelFile)
{
device->BeginScene();
Math::Matrix persp;
Math::LoadProjectionMatrix(persp, Math::PI / 4.0f, (800.0f) / (600.0f), 0.1f, 100.0f);
device->SetTransform(Gfx::TRANSFORM_PROJECTION, persp);
Math::Matrix id;
id.LoadIdentity();
device->SetTransform(Gfx::TRANSFORM_WORLD, id);
Math::Matrix viewMat;
Math::LoadTranslationMatrix(viewMat, TRANSLATION);
Math::Matrix rot;
Math::LoadRotationXZYMatrix(rot, ROTATION);
viewMat = Math::MultiplyMatrices(viewMat, rot);
device->SetTransform(Gfx::TRANSFORM_VIEW, viewMat);
const std::vector<Gfx::ModelTriangle> &triangles = modelFile->GetTriangles();
Gfx::VertexTex2 tri[3];
for (int i = 0; i < static_cast<int>( triangles.size() ); ++i)
{
device->SetTexture(0, GetTexture(triangles[i].tex1Name));
device->SetTexture(1, GetTexture(triangles[i].tex2Name));
device->SetTextureEnabled(0, true);
device->SetTextureEnabled(1, true);
device->SetMaterial(triangles[i].material);
tri[0] = triangles[i].p1;
tri[1] = triangles[i].p2;
tri[2] = triangles[i].p3;
device->DrawPrimitive(Gfx::PRIMITIVE_TRIANGLES, tri, 3);
}
device->EndScene();
}
开发者ID:ManuelBlanc,项目名称:colobot,代码行数:41,代码来源:model_test.cpp
示例11: testInversion
void TSmatrix::testInversion()
{
Math::Matrix m = Math::Matrix::zeros(4,4);
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
if (j<=i)
m(i,j) = 1;
m(3,3) = 1;
Math::Matrix minv(4,4);
Math::Matrix::invert(m, minv);
Math::Matrix identity = Math::Matrix::eye(4);
Math::Matrix minv2(4,4);
m.linearSolve(minv2, identity);
minv.sub(minv2);
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
TEST_ASSERT(fabs(minv(i,j)) < 0.0001);
}
开发者ID:yngwievanhendrix,项目名称:robotic_institut,代码行数:21,代码来源:TSmatrix.cpp
示例12: run
void run ()
{
Math::Matrix<value_type> directions = DWI::Directions::load_cartesian<value_type> (argument[0]);
size_t num_permutations = 1e8;
Options opt = get_options ("permutations");
if (opt.size())
num_permutations = opt[0][0];
Shared eddy_shared (directions, num_permutations);
Thread::run (Thread::multi (Processor (eddy_shared)), "eval thread");
auto& signs = eddy_shared.get_best_signs();
for (size_t n = 0; n < directions.rows(); ++n)
if (signs[n] < 0)
directions.row(n) *= -1.0;
bool cartesian = get_options("cartesian").size();
DWI::Directions::save (directions, argument[1], cartesian);
}
开发者ID:JohnWangDataAnalyst,项目名称:mrtrix3,代码行数:21,代码来源:dirflip.cpp
示例13: verify_matrix
void verify_matrix (Math::Matrix<float>& in, const node_t num_nodes)
{
if (in.rows() != in.columns())
throw Exception ("Connectome matrix is not square (" + str(in.rows()) + " x " + str(in.columns()) + ")");
if (in.rows() != num_nodes)
throw Exception ("Connectome matrix contains " + str(in.rows()) + " nodes; expected " + str(num_nodes));
for (node_t row = 0; row != num_nodes; ++row) {
for (node_t column = row+1; column != num_nodes; ++column) {
const float lower_value = in (column, row);
const float upper_value = in (row, column);
if (upper_value && lower_value && (upper_value != lower_value))
throw Exception ("Connectome matrix is not symmetrical");
if (!upper_value && lower_value)
in (row, column) = lower_value;
in (column, row) = 0.0f;
} }
}
开发者ID:JohnWangDataAnalyst,项目名称:mrtrix3,代码行数:23,代码来源:connectome.cpp
示例14: save_bvecs_bvals
void save_bvecs_bvals (const Image::Header& header, const std::string& path)
{
std::string bvecs_path, bvals_path;
if (path.size() >= 5 && path.substr (path.size() - 5, path.size()) == "bvecs") {
bvecs_path = path;
bvals_path = path.substr (0, path.size() - 5) + "bvals";
} else if (path.size() >= 5 && path.substr (path.size() - 5, path.size()) == "bvals") {
bvecs_path = path.substr (0, path.size() - 5) + "bvecs";
bvals_path = path;
} else {
bvecs_path = path + "bvecs";
bvals_path = path + "bvals";
}
const Math::Matrix<float>& grad (header.DW_scheme());
Math::Matrix<float> G (grad.rows(), 3);
// rotate vectors from scanner space to image space
Math::Matrix<float> D (header.transform());
Math::Permutation p (4);
int signum;
Math::LU::decomp (D, p, signum);
Math::Matrix<float> image2scanner (4,4);
Math::LU::inv (image2scanner, D, p);
Math::Matrix<float> rotation = image2scanner.sub (0,3,0,3);
Math::Matrix<float> grad_G = grad.sub (0, grad.rows(), 0, 3);
Math::mult (G, float(0.0), float(1.0), CblasNoTrans, grad_G, CblasTrans, rotation);
// deal with FSL requiring gradient directions to coincide with data strides
// also transpose matrices in preparation for file output
std::vector<size_t> order = Image::Stride::order (header, 0, 3);
Math::Matrix<float> bvecs (3, grad.rows());
Math::Matrix<float> bvals (1, grad.rows());
for (size_t n = 0; n < G.rows(); ++n) {
bvecs(0,n) = header.stride(order[0]) > 0 ? G(n,order[0]) : -G(n,order[0]);
bvecs(1,n) = header.stride(order[1]) > 0 ? G(n,order[1]) : -G(n,order[1]);
bvecs(2,n) = header.stride(order[2]) > 0 ? G(n,order[2]) : -G(n,order[2]);
bvals(0,n) = grad(n,3);
}
bvecs.save (bvecs_path);
bvals.save (bvals_path);
}
开发者ID:,项目名称:,代码行数:45,代码来源:
示例15: run
void run ()
{
try {
Math::Matrix<value_type> directions = DWI::Directions::load_cartesian<value_type> (argument[0]);
report (str(argument[0]), directions);
}
catch (Exception& E) {
Math::Matrix<value_type> directions (str(argument[0]));
DWI::normalise_grad (directions);
if (directions.columns() < 3)
throw Exception ("unexpected matrix size for DW scheme \"" + str(argument[0]) + "\"");
print (str(argument[0]) + " [ " + str(directions.rows()) + " volumes ]\n");
DWI::Shells shells (directions);
for (size_t n = 0; n < shells.count(); ++n) {
Math::Matrix<value_type> subset (shells[n].count(), 3);
for (size_t i = 0; i < subset.rows(); ++i)
subset.row(i) = directions.row(shells[n].get_volumes()[i]).sub(0,3);
report ("\nb = " + str(shells[n].get_mean()), subset);
}
}
}
开发者ID:JohnWangDataAnalyst,项目名称:mrtrix3,代码行数:23,代码来源:dirstat.cpp
示例16: CreateShootBox
//==============================================================================
//捕獲判定ボックスの生成
//==============================================================================
//[input]
// pCam:カメラクラス
//==============================================================================
void CPlayer::CreateShootBox( CCamera *pCam, CSceneManager *pSceneMgr )
{
Math::Matrix matTemp;
Math::Matrix matWorld;
/*初期化*/
matTemp.Identity();
matWorld.Identity();
//matWorld = pCam->GetCamera()->WorldToView();
//GetModelActor( 0 )->Collision_Check(
//matWorld = pCam->GetCamera()->WorldToView();
///*X軸回転*/
matTemp.RotationX( toI( pCam->GetRotate().x ) );
//
matWorld *= matTemp;
//
///*Y軸回転*/
matTemp.RotationY( toI( m_Rot.x - DEG_TO_ANGLE( 180 ) ) );
matWorld *= matTemp;
/*移動*/
matTemp.Translation( m_vPos.x, m_vPos.y, m_vPos.z );
matWorld *= matTemp;
//Math::Vector3D vPt1 = pSceneMgr->GetSceneMgr()->TransformFromScreen( Math::Vector3D( 0, 0, 0 ) );
//Math::Vector3D vPt2 = pSceneMgr->GetSceneMgr()->TransformFromScreen( Math::Vector3D( SCREEN_WIDTH, SCREEN_HEIGHT, 2.0f ) );
/*ボックスの生成*/
//m_ShootChkBox.
// m_ShootChkBox.CreateBox( vPt1, vPt2, matWorld );
}
开发者ID:Taka03,项目名称:Camerun2,代码行数:43,代码来源:player.cpp
示例17: CreateCapBox
//==============================================================================
//捕獲判定ボックスの生成
//==============================================================================
void CPlayer::CreateCapBox()
{
Math::Matrix matTemp;
Math::Matrix matWorld;
/*初期化*/
matTemp.Identity();
matWorld.Identity();
/*回転*/
matTemp.RotationY( toI( m_Rot.x - DEG_TO_ANGLE( 180 ) ) );
matWorld *= matTemp;
/*移動*/
matTemp.Translation( m_vPos.x, m_vPos.y, m_vPos.z );
matWorld *= matTemp;
/*ボックスの生成*/
m_CapChkBox.CreateBox( Math::Vector3D( -2, 0, 0 ), Math::Vector3D( 2, 5, 30 ), matWorld );
}
开发者ID:Taka03,项目名称:Camerun2,代码行数:27,代码来源:player.cpp
示例18: orb_subscribe
//.........这里部分代码省略.........
deltaT = 0.01f;
}
/* load local copies */
orb_copy(ORB_ID(vehicle_attitude), _att_sub, &_att);
/* get current rotation matrix and euler angles from control state quaternions */
math::Quaternion q_att(_att.q[0], _att.q[1], _att.q[2], _att.q[3]);
_R = q_att.to_dcm();
math::Vector<3> euler_angles;
euler_angles = _R.to_euler();
_roll = euler_angles(0);
_pitch = euler_angles(1);
_yaw = euler_angles(2);
if (_vehicle_status.is_vtol && _parameters.vtol_type == vtol_type::TAILSITTER) {
/* vehicle is a tailsitter, we need to modify the estimated attitude for fw mode
*
* Since the VTOL airframe is initialized as a multicopter we need to
* modify the estimated attitude for the fixed wing operation.
* Since the neutral position of the vehicle in fixed wing mode is -90 degrees rotated around
* the pitch axis compared to the neutral position of the vehicle in multicopter mode
* we need to swap the roll and the yaw axis (1st and 3rd column) in the rotation matrix.
* Additionally, in order to get the correct sign of the pitch, we need to multiply
* the new x axis of the rotation matrix with -1
*
* original: modified:
*
* Rxx Ryx Rzx -Rzx Ryx Rxx
* Rxy Ryy Rzy -Rzy Ryy Rxy
* Rxz Ryz Rzz -Rzz Ryz Rxz
* */
math::Matrix<3, 3> R_adapted = _R; //modified rotation matrix
/* move z to x */
R_adapted(0, 0) = _R(0, 2);
R_adapted(1, 0) = _R(1, 2);
R_adapted(2, 0) = _R(2, 2);
/* move x to z */
R_adapted(0, 2) = _R(0, 0);
R_adapted(1, 2) = _R(1, 0);
R_adapted(2, 2) = _R(2, 0);
/* change direction of pitch (convert to right handed system) */
R_adapted(0, 0) = -R_adapted(0, 0);
R_adapted(1, 0) = -R_adapted(1, 0);
R_adapted(2, 0) = -R_adapted(2, 0);
euler_angles = R_adapted.to_euler(); //adapted euler angles for fixed wing operation
/* fill in new attitude data */
_R = R_adapted;
_roll = euler_angles(0);
_pitch = euler_angles(1);
_yaw = euler_angles(2);
/* lastly, roll- and yawspeed have to be swaped */
float helper = _att.rollspeed;
_att.rollspeed = -_att.yawspeed;
_att.yawspeed = helper;
}
_sub_airspeed.update();
vehicle_setpoint_poll();
vehicle_control_mode_poll();
开发者ID:larics,项目名称:Firmware,代码行数:67,代码来源:fw_att_control_main.cpp
示例19: Draw
void CCloud::Draw()
{
if (! m_enabled) return;
if (m_level == 0.0f) return;
if (m_lines.empty()) return;
std::vector<VertexTex2> vertices((m_brickCount+2)*2, VertexTex2());
float iDeep = m_engine->GetDeepView();
float deep = (m_brickCount*m_brickSize)/2.0f;
m_engine->SetDeepView(deep);
m_engine->SetFocus(m_engine->GetFocus());
m_engine->UpdateMatProj(); // increases the depth of view
float fogStart = deep*0.15f;
float fogEnd = deep*0.24f;
CDevice* device = m_engine->GetDevice();
// TODO: do this better?
device->SetFogParams(FOG_LINEAR, m_engine->GetFogColor( m_engine->GetRankView() ),
fogStart, fogEnd, 1.0f);
device->SetTransform(TRANSFORM_VIEW, m_engine->GetMatView());
Material material;
material.diffuse = m_diffuse;
material.ambient = m_ambient;
m_engine->SetMaterial(material);
m_engine->SetTexture(m_fileName, 0);
m_engine->SetTexture(m_fileName, 1);
m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK | ENG_RSTATE_FOG | ENG_RSTATE_WRAP);
Math::Matrix matrix;
matrix.LoadIdentity();
device->SetTransform(TRANSFORM_WORLD, matrix);
float size = m_brickSize/2.0f;
Math::Vector eye = m_engine->GetEyePt();
Math::Vector n = Math::Vector(0.0f, -1.0f, 0.0f);
// Draws all the lines
for (int i = 0; i < static_cast<int>( m_lines.size() ); i++)
{
Math::Vector pos;
pos.y = m_level;
pos.z = m_lines[i].pz;
pos.x = m_lines[i].px1;
int vertexIndex = 0;
Math::Vector p;
Math::Point uv1, uv2;
p.x = pos.x-size;
p.z = pos.z+size;
p.y = pos.y;
AdjustLevel(p, eye, deep, uv1, uv2);
vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2);
p.x = pos.x-size;
p.z = pos.z-size;
p.y = pos.y;
AdjustLevel(p, eye, deep, uv1, uv2);
vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2);
for (int j = 0; j < m_lines[i].len; j++)
{
p.x = pos.x+size;
p.z = pos.z+size;
p.y = pos.y;
AdjustLevel(p, eye, deep, uv1, uv2);
vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2);
p.x = pos.x+size;
p.z = pos.z-size;
p.y = pos.y;
AdjustLevel(p, eye, deep, uv1, uv2);
vertices[vertexIndex++] = VertexTex2(p, n, uv1, uv2);
pos.x += size*2.0f;
}
device->DrawPrimitive(PRIMITIVE_TRIANGLE_STRIP, &vertices[0], vertexIndex);
m_engine->AddStatisticTriangle(vertexIndex - 2);
}
m_engine->SetDeepView(iDeep);
m_engine->SetFocus(m_engine->GetFocus());
m_engine->UpdateMatProj(); // gives depth to initial
}
开发者ID:CHmSID,项目名称:colobot,代码行数:93,代码来源:cloud.cpp
示例20: orb_subscribe
//.........这里部分代码省略.........
}
/* load local copies */
orb_copy(ORB_ID(control_state), _ctrl_state_sub, &_ctrl_state);
/* get current rotation matrix and euler angles from control state quaternions */
math::Quaternion q_att(_ctrl_state.q[0], _ctrl_state.q[1], _ctrl_state.q[2], _ctrl_state.q[3]);
_R = q_att.to_dcm();
math::Vector<3> euler_angles;
euler_angles = _R.to_euler();
_roll = euler_angles(0);
_pitch = euler_angles(1);
_yaw = euler_angles(2);
if (_vehicle_status.is_vtol && _parameters.vtol_type == 0) {
/* vehicle is a tailsitter, we need to modify the estimated attitude for fw mode
*
* Since the VTOL airframe is initialized as a multicopter we need to
* modify the estimated attitude for the fixed wing operation.
* Since the neutral position of the vehicle in fixed wing mode is -90 degrees rotated around
* the pitch axis compared to the neutral position of the vehicle in multicopter mode
* we need to swap the roll and the yaw axis (1st and 3rd column) in the rotation matrix.
* Additionally, in order to get the correct sign of the pitch, we need to multiply
* the new x axis of the rotation matrix with -1
*
* original: modified:
*
* Rxx Ryx Rzx -Rzx Ryx Rxx
* Rxy Ryy Rzy -Rzy Ryy Rxy
* Rxz Ryz Rzz -Rzz Ryz Rxz
* */
math::Matrix<3, 3> R_adapted = _R; //modified rotation matrix
/* move z to x */
R_adapted(0, 0) = _R(0, 2);
R_adapted(1, 0) = _R(1, 2);
R_adapted(2, 0) = _R(2, 2);
/* move x to z */
R_adapted(0, 2) = _R(0, 0);
R_adapted(1, 2) = _R(1, 0);
R_adapted(2, 2) = _R(2, 0);
/* change direction of pitch (convert to right handed system) */
R_adapted(0, 0) = -R_adapted(0, 0);
R_adapted(1, 0) = -R_adapted(1, 0);
R_adapted(2, 0) = -R_adapted(2, 0);
euler_angles = R_adapted.to_euler(); //adapted euler angles for fixed wing operation
/* fill in new attitude data */
_R = R_adapted;
_roll = euler_angles(0);
_pitch = euler_angles(1);
_yaw = euler_angles(2);
/* lastly, roll- and yawspeed have to be swaped */
float helper = _ctrl_state.roll_rate;
_ctrl_state.roll_rate = -_ctrl_state.yaw_rate;
_ctrl_state.yaw_rate = helper;
}
vehicle_setpoint_poll();
vehicle_accel_poll();
开发者ID:Ianwinds,项目名称:Firmware,代码行数:67,代码来源:fw_att_control_main.cpp
注:本文中的math::Matrix类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论