zhuozhuo

 

[导入]上图形学的实验要用到矩阵的运算,不是很完善,但是足够用于图形变换了


//Matrix.h
//矩阵类(用来做图形学的作业)
//by 卓卓09 3 2
//可进行矩阵的加 和 乘 操作

#pragma once

#include 
<iostream>
using namespace std;
class Matrix
{
private:
    
int m_lnum;//矩阵行数
    int m_cnum;//矩阵列数
    float* m_p;
public:
    Matrix();
    Matrix(
const int& line,const int& column)//line*column矩阵
    {
        m_lnum
=line;
        m_cnum
=column;
        m_p
=new float[m_lnum*m_cnum];
    }
    Matrix(
const int& num)//num*num矩阵
    {
        m_cnum
=m_lnum=num;
        m_p
=new float[num*num];
    }
    
~Matrix()
    {
        delete[] m_p;
    }

    void Set(float sor[])//数组初始化矩阵
    {
        
int j=0;
        
for(;j<m_lnum*m_cnum;j++)
        {
            m_p[j]
=sor[j];
        }
    }
    
void Print()//打印矩阵
    {
        
int j=0;
        
for(;j<m_lnum*m_cnum;j++)
        {
            
if(j!=0&&j%m_cnum==0)
                cout
<<endl;
            cout
<<m_p[j]<<" ";
        }
        cout
<<endl;
    }
    
/*
        num为第num 行/列
        如:第一行/列 num为1
    
*/ 
    
void SetElement(int x,int y,float element)
    {
        
if(x<=0||x>m_lnum||y<=0||y>m_cnum)//判断x,y是否在范围内
            return;
        m_p[(x
-1)*m_cnum+(y-1)]=element;
    }
    
float GetElement(int x,int y)
    {

        return m_p[(x-1)*m_cnum+(y-1)];
    }
    
bool SetLine(const int& num,float line[])//设置第num行的值 
    {
        
if(num<=0||num>m_cnum)
            
return false;
        
int i=(num-1)*m_cnum;
        
int j=0;//
        for(;j<m_lnum;j++,i++)
        {
            m_p[i]
=line[j];//拷贝
        }
        
return true;
    }
    
int GetTotalNum() const//返回矩阵所有元素数目
    {
        
int tmp=m_lnum*m_cnum;
        
return tmp;
    }
    
int GetLineNum() const//返回矩阵行数
    {
        
return m_lnum;
    }
    
int GetColumnNum() const//返回矩阵列数
    {
        
return m_cnum;
    }
    
bool Add(Matrix& source,Matrix& result)//矩阵相加
    {
        
if(source.GetColumnNum()!=m_cnum||source.GetLineNum()!=m_cnum)
            
return false;
        
int i=1,j=1;
        
for(;i<=m_lnum;i++)
        {
            j
=1;
            
for(;j<=m_cnum;j++)
            {
                result.SetElement(i,j,
this->GetElement(i,j)+source.GetElement(i,j));
            }
        }
        
return true;
    }
    
bool Plus(Matrix& source,Matrix& result)//矩阵相乘
    {
        
if(source.GetLineNum()!=m_cnum)//行不等于列的话返回false
            return false;
        
int i=1,j=1,z=1;
        
float sum=0;
        
for(;i<=m_lnum;i++)//第i行
        {
            j
=1;
            
for(;j<=source.GetColumnNum();j++)//第j列
            {
                z
=1;
                sum
=0;
                
for(;z<=m_cnum;z++)//计算
                {
                    sum
+=this->GetElement(i,z)*source.GetElement(z,j);
                }
                result.SetElement(i,j,sum);
            }
        }
    }
    
bool Minus(const Matrix& source,Matrix& result)//to be continue
    {
        
return true;
    }
};


//test.cpp

#include 
"Matrix.h"

void Cal()

{

    Matrix a(
4,2);

    Matrix b(
2,1);

    Matrix r(
4,1);//存结果

    
float sor[8]={1,2,3,4,5,6,7,8};

    
float sor2[2]={1,2};

    a.Set(sor);

    b.Set(sor2);

    a.Plus(b,r);
//进行乘运算

    r.Print();

}

int main()

{

    
    Cal();

    system(
"pause");

    
return 0;

}

 



--------------------------
新闻:Linux基金会CEO:Linux是发展最快的平台
导航:博客园首页  知识库  新闻  招聘  社区  小组  博问  网摘  找找看
文章来源:http://www.cnblogs.com/minimdb/archive/2009/03/26/1422338.html

posted on 2009-03-26 14:45 卓卓 阅读(97) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

常用链接

留言簿(1)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜