Math.Inc 分型图形库数学函数头文件 数字函数+向量和矩阵函数+仿射变换

C实现的基本矩阵运算头文件(加减乘,求逆,生成单位矩阵等) 最近写的用C实现的基本矩阵运算,支持任何大小的矩阵,矩阵以一维方式存取,添加头文件后即可使用函数 立即下载

转自:http://www.4oa.com/Article/html/6/31/446/2005/15505.html

/*分型图形库数学函数头文件*/

/*Math.Inc*/
#define Ln10 2.30258509299405E+000        /*数学常数定义*/
#define Pi 3.1415927
#define PiOver180 1.74532925199433E-002
#define PiUnder180 5.72957795130823E+001

typedef enum{false,true}Boolean;        /*数据存储格式定义*/
typedef unsigned char Byte;
typedef unsigned int Word;

int Round(float x)                /*取近似值函数*/
{
    return(int)(x+0.5));
}
int Trunc(float x)                /*取整函数*/
{
    return(int)(x));
}
float SqrFP(float x)             /*求平方值函数*/
{
    return(x*x);
}
int Sqr(int x)                  /*求平方根函数*/
{
    return(X*x);                
}
float adians(float Angle)       /*弧度换算函数*/
{
    return(Angle*PiOver180);
}
float Degress(float Angle)      /*角度转换函数*/
{
    return(Angle*PiUnder180);
}
float CosD(float Angle)         /*求余弦函数*/
{
    return(cos(Radians(Angle)));
}
float SinD(float Angle)         /*求正弦函数*/
{
    return(sin(Radians(Angle)));
}
float Power(float Base,int Exponent)        /*求取以e为底的幂函数*/
{
    float BPower;
    int t;
    if(Exponent==0)
        return 1;
    else{
        BPower=1.0;
        for(t=1;t<=Exponent;t++)
            BPower*=Base;
        return(BPower);
    }
}
float Log(float x)            /*求取标准 对数值函数*/
{
    return(log(x)/Ln10);
}
float Exp10(float x)         /*求取反对数值函数*/
{
    return(exp(x*Ln10));
}
float Sign(float x)         /*浮点型符号函数*/
{
    if(x<0)
        return -1;
    else{
        if(x>0)
            return 1;
        else return 0;
    }
}
int IntSign(int x)        /*整型符号函数*/
{
    if(x<0)
        return -1;
    else{
        if(x>0)
            return 1;
        else
            return 0;
    }
}
int IntSqrt(int x)        /*求整方根函数*/
{
    int OddInt,OldArg,FirstSqrt;
    OddInt=1;
    OldArg=x;
    while(x>=0){
        x=OddInt;
        OddInt+=2;
    }
    FirstSqrt=OddInt>>1;
    if(Sqrt(FirstSqrt)-FirstSqrt+1>OldArg)
        return(FirstSqrt-1);
    else
        return(FirstSqrt);
}
int IntPower(int Base,int Exponent)        /*求以e为底的整幂函数*/
{
    if(Exponent==0)
        return 1;
    else
        return(Base*IntPower(Base,Exponent-1));
}

/*与向量和矩阵相关的函数库*/
/*Vector and Matrix Routines*/
typedef float TDA[3];        /*常向量定义*/
typedef int TDIA[3];
typedef float FDA[4];
typedef float Matx4x4[4][4];

void vec(float r,float s,float t,TDA A)        /*浮点数向量赋值函数*/
{
    A[0]=r;
    A[1]=s;
    A[2]=t;
}
void VecInt(int r,int s,int t,TDIA A)        /*整数向量赋值函数*/
{
    A[0]=r;
    A[1]=s;
    A[2]=t;
}
void UnVec(TDA A,float *r,float *s,float *t)        /*浮点数向量取值函数*/
{
    *r=A[0];
    *s=A[1];
    *t=A[2];
}
void UnVecInt(TDIA A,float *r,float *s,float *t)    /*整数向量取值函数*/
{
    *r=A[0];
    *s=A[1];
    *t=A[2];
}
float VecDot(TDA A,TDA B)            /*向量求积函数*/
{
    return(A[0]*B[0]+A[1]*B[1]+A[2]*B[2]);
}
void VecCross(TDA A,TDA B,TDA c)        /*向量叉乘函数*/
{
    C[0]=A[1]*B[2]-A[2]*B[1];
    C[1]=A[2]*B[0]-A[0]*B[2];
    C[2]=A[0]*B[1]-A[1]*B[0];
}
float VecLen(TDA A)                /*向量长度函数*/
{
    return(sqrt(SqrFP(A[0])+SqrFP(A[1])+SqrFP(A[2])));
}
void VecNormalize(TDA A)         /*向量初始化函数*/
{
    float dist,invdist;
    dist=VecLen(A);
    if(!(dist==0.0)){
        invdist=1/dist;
        A[0]*=invdist;
        A[1]*=invdist;
        A[2]=invdist;
    }
    else{
        puts("Zero_length Vectors Cannot be Normalized");
        exit(1);
    }
}
void VexMatxult(FDA A,Matx4x4 Matix,FDA B)        /*向量乘矩阵函数*/
{
    int mRow,mCol;
    for(mCol=0;mCol<4;mCol++){
        B[mCol]=0;
        for(mRow=0;mRow<4;mRow++)
            B[mCol]+=A[mRow]*Matrix[mRow][mCol];
    }
}
void VecSub(TDA A,TDA B,TDA C)            /*浮点数向量相减函数*/
{
    C[0]=A[0]-B[0];
    C[1]=A[1]-B[1];
    C[2]=A[2]-B[2];
}
void VecSubInt(TDIA A,TDIA B,TDA C)        /*整数向量相减函数*/
{
    C[0]=A[0]-B[0];
    C[1]=A[1]-B[1];
    C[2]=A[2]-B[2];
}
void VecAdd(TDA A,TDA B,TDA C)            /*向量求和函数*/
{
    C[0]=A[0]+B[0];
    C[1]=A[1]+B[1];
    C[2]=A[2]+B[2];
}
void VecSubAdd3(TDA A,TDA B,TDA C,TDA D)        /*三向理求和函数*/
{
    D[0]=A[0]+B[0]+C[0];
    D[1]=A[1]+B[1]+C[1];
    D[2]=A[2]+B[2]+C[2];
}
void VecCopy(TDA A,TDA B)            /*向量复制函数*/
{
    int i;
    for(i=0;i<3;i++)
        B[i]=A[i];
}
void VecLinComb(float r,TDA A,float s,TDA B,TDA C)        /*向量转换函数*/
{
    C[0]=r*A[0]+s*B[0];
    C[1]=r*A[1]+r*B[1];
    C[2]=r*A[2]+r*B[2];
}
void VecScalMult(float r,TDA A,TDA B)        /*向量与标量相乘函数*/
{
    B[0]=r*A[0];
    B[1]=r*A[1];
    B[2]=r*A[2];
}
void VecScalMultI(float r,TDIA A,TDA B)        /*向量与标量相乘函数2*/
{
    B[0]=r*A[0];
    B[1]=r*A[1];
    B[2]=r*A[2];
}
void VCCScalMultInt(float r,TDA A,TDIA B)    /*向量与标量相乘并取整函数*/
{
    B[0]=Round(r*A[0]);
    B[1]=Round(r*A[1]);
    B[2]=Round(r*A[2]);
}
void VccAddScalMult(float r,TDA A,TDA B,TDA C)        /*向量转换函数*/
{
    C[0]=r*A[0]+B[0];
    C[1]=r*A[1]+B[1];
    C[2]=r*A[2]+B[2];
}
void VecNull(TDA A)        /*零向量初始化函数*/
{
    A[0]=0.0;
    A[1]=0.0;
    A[2]=0.0;
}
void VecElemMult(float r,TDA A,TDA B,TDA C)        /*向量乘积倍度函数*/
{
    C[0]=r*A[0]*B[0];
    C[1]=r*A[1]*B[1];
    C[2]=r*A[2]*B[2];
}
/*Affine Transformation Routines*/
void ZeroMatrix(Matx4x4 A)            /*四维零方阵初始化*/
{
    int i,j;
    for(i=0;i<4;i++){
        for(j=0;j<4;j++)
        A[i][j]=0.0;
    }
}
void Translate3D(float tx,float ty,float tz,Matx4x4 A)        /*3D变换阵*/
{
    int i;
    ZeroMatrix(A);
    for(i=0;i<4;i++){
        A[i][i]=1.0;
        A[0][3]=-tx;
        A[1][3]=-ty;
        A[2][3]=-tz;
    }
}
void Scale3D(float sx,float sy,float sz,Matx4x4 A)        /*3D标准阵*/
{
    ZeroMatrix(A);
    A[0][0]=sx;
    A[1][1]=sy;
    A[2][2]=sz;
    A[3][3]=1.0;
}
void Rotate3D(int m,float Theta,Matx4x4 A)        /*3D旋转阵*/
{
    int m1,m2;
    float c,s;
    ZeroMatrix(A);
    A[m-1][m-1]=1.0;
    A[3][3]=1.0;
    m1=(m%3)+1;
    m2=(m1%3);
    c=CosD(Theta);
    s=SinD(Theta);
    A[m1][m1]=c;
    A[m1[m2]=s;
    A[m2][m2]=c;
    A[m2][m1]=s;
}
void Multiply3DMatrixies(Matx4x4 A,Matx4x4 B,Matx4x4 C)    /*矩阵相乘变换阵*/
{
    int i,j,k;
    float ab;
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
            ab=0;
            for(k=0;k<4;k++)
                ab+=A[i][k]*B[k][j];
            C[i][j]=ab;
        }
    }
}
void MatCopy(Matx4x4 a,Matx4x4 b)        /*矩阵复制函数*/
{
    byte i,j;
    for(i=0;i<4;i++){
        for(j=0;j<4;j++)
            b[i][j]=a[i][j];
    }
}
void PrepareMatrix(float Tx,float Ty,float Tz,float Sx,float Sy,float Sz
                 float Rx,float Ry,float Rz,Matx4x4 XForm)    /*矩阵初始化函数*/
{
    Matx4x4 M1,M2,M3,M4,M5,M6,M7,M8,M9;
    Scal3D(Sx,Sy,Sz,M1);
    Rotate3D(1,Rx.M2);
    Rotate3D(2,Ry,M3);
    Rotate3D(3,Rz,M4);
    translate3D(Tx,Ty,Tz,M5);
    Multiply3DMatricies(M2,M1,M6);
    Multiply3DMatricies(M3,M6,M7);
    Multiply3DMatricies(M4,M7,M8);
    Multiply3DMatricies(M5,M8,M9);
    MatCopy(M9,XForm);
}
void PreparcInvMatrix(float Tx,float Ty,float Tz,float Sx,float Sy,float Sz,
                        float Rx,float Ry,float Rz,Matx4x4 XForm)   /*矩阵的逆变换函数*/
{
    Matx4x4 M1,M2,M3,M4,M5,M6,M7,M8,M9;
    Scale3D(Sx,Sy,Sz,M1);
    Rotate3D(1,Rx,M2);
    Rotate3D(2,Ry,M3);
    Rotate3D(3,Rz,M4);
    Translate3D(Tx,Ty,Tz,M5);
    Multiply3DMatricies(M4,M5,M6);
    Multiply3DMatricies(M3,M6,M7);
    Multiply3DMatricies(M2,M7,M8);
    Multiply3DMatricies(M1,M8,M9);
    MatCopy(M9,XForm);
}
void Transform(TDA A,Matx4x4 M,TDA B)        /*3D变换函数*/
{
    B[0]=M[0][0]*A[0]+M[0][1]*A[1]+M[0][2]*A[2]+M[0][3];
    B[1]=M[1][0]*A[0]+M[1][1]*A[1]+M[1][2]*A[2]+M[0][3];
    B[2]=M[2][0]*A[0]+M[2][1]*A[1]+M[2][2]*A[2]+M[0][3];
}
矩阵运算C++类,仅包含一个头文件 C++矩阵运算类,用于矩阵加减乘除操作。 立即下载

相关推荐

和矩阵相关的头文件matrix.h

调试C++程序时,提示not such file"matrix.h"时,只需要在头文件中新建一个matrix.h文件,将本文档中的内容复制过去即可

C++ 数据结构学习 ---- 向量

学习c++数据结构---向量

qq_58240448的博客 2408

平行趋势检验没通过怎么办?别慌,试试三重差分DDD与事件研究法

本文探讨了当平行趋势检验未通过时,如何运用三重差分法(DDD)与事件研究法进行政策评估。通过Stata代码示例和实战案例,详细介绍了DDD的原理、适用场景及实现步骤,并提供了替代方案如合成控制法和匹配DID,帮助研究者获得更准确的因果推断结果。

weixin_28732953的博客 615

Unity3D - 详解Quaternion类

一、简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间,相对于复数为二维空间。 四元数 关于四元数的性质、与旋转的关系、球型线性插值的介绍,请阅读3D游戏与计算机

yuyingwin的专栏 2万+

AD7920实战:从咪头到ADC的音频信号采集电路设计全解析(附电路图)

本文详细解析了基于AD7920 ADC芯片的音频信号采集电路设计全流程。从驻极体咪头的驱动、AD8542运放的两级增益与偏置设计,到关键的抗混叠滤波器配置,以及ADC接口的驱动缓冲与PCB布局要点,提供了完整的实战指南与电路图,帮助开发者实现高质量音频信号采集。

red88的博客 803

Ubuntu终端接入Codex:一行脚本搞定AI编程助手安装与配置

在开发者日常工作中,命令行终端是最高频的操作环境,而AI编程助手的出现正在改变传统的编码方式。通过将大模型能力与终端工具链结合,开发者无需切换窗口即可完成命令查询、代码生成、项目理解和自动执行等任务。Ubuntu作为服务器和开发机的主流系统,搭配Node.js生态和API Key认证,即可在本地闭环运行AI助手。本文从环境准备、密钥配置、权限管理到自动化脚本封装,系统拆解在终端中接入Codex的完整流程,并分享高频用法与实测排障经验,帮助开发者安全、高效地让AI融入命令行工作流。

weixin_29061041的博客 323

Lua 标准库 - 算术函数(mathematical functions)

这是一个标准 C 的算术库,所有的函数存放于math表1、math.abs (x)功能:返回x的绝对值2、math.acos(x)功能:函数返回参数x的反余弦值。参数x 应当在-1和1之间3、math.asin (x)功能:函数返回参数x的反正弦值。参数x 应当在-1和1之间。4、math.atan (x)功能:函数返回参数x的反正切值5、math.atan2

CashChin的专栏 1594

压电陶瓷传感器避坑指南:实测阻抗匹配对信号输出的影响(附示波器调试技巧)

本文深入探讨压电陶瓷传感器在工业振动监测中的阻抗匹配问题,通过等效电路模型和实测数据揭示负载阻抗对信号输出的关键影响。文章提供从元件选型到示波器调试的完整解决方案,特别强调100kΩ以上负载阻抗的重要性,并分享JFET缓冲器设计和PCB布局的实用技巧,帮助工程师避免信号失真和输出不稳定问题。

ooo22的博客 516

c语言包含数学库函数的头文件为,Cmath——C语言数学函数库

c++学习者Cmath——C语言数学函数库使用时需包含头文件:#include int abs(int i)返回整型参数i的绝对值double cabs(struct complex znum)返回复数znum的绝对值double fabs(double x)返回双精度参数x的绝对值long labs(long n)返回长整型参数n的绝对值double exp(double x)返回指数函数ex的...

weixin_35445090的博客 2855

061、LQR(线性二次型调节器)控制基础

本文介绍了LQR(线性二次型调节器)控制在飞控系统中的应用。作者通过一次四旋翼炸机事故引出PID控制的局限性,详细讲解了LQR的数学原理、权重矩阵的物理意义以及实际工程实现方法。文章对比了LQR与PID的控制效果,指出LQR在鲁棒性方面的优势,同时也分析了其存在稳态误差等缺点。最后总结了LQR在飞控中的适用场景,建议将LQR与PID结合使用,并预告了下一章将讨论带积分项的LQI控制。全文包含具体案例、代码实现和调参经验,为飞控算法开发者提供了实用指导。

2401_88858637的博客 720

Matlab之App Designer 如何进行三维图形绘制教程

基于Matlab中的App Designer设计可视化界面并进行数据导入及3D绘图,可以直观的在可视化界面上展示分析结果,方便用户进行图形的操作。本文采用案例讲解的方式,详细介绍了如何采用Matlab App Designer建立数据3D绘图的GUI可视化界面的方法和详细的过程步骤,并介绍了导入数据进行计算时需要注意的相关事项,同时提供了详细的代码,以便读者进行学习和操作。

m0_59012156的博客 2067

C语言常用头文件及库函数

6个常用头文件及库函数

storyteller的博客 4437

python实现下载和离线安装包环境

导出当前电脑python安装的所有包列表requirement.txt。

m0_60352504的博客 1676

常用库函数及头文件

1.排序  sort(a,b,c)          头文件:#include &lt;algorithm&gt; 2.字符串与整实型转换   一、string转int a(int变量)=atoi(b(string变量).c_str())               头文件:#include &lt;cstdlib&gt;      二、string转float a(float变量)=...

King_fxb 1421

Pytorch入门实战(7):基于BERT实现文本隐喻二分类(Kaggle入门题目)

Bert入门实战,文本二分类问题

iioSnail的博客 4056

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

nehe第十课的一些感想

昨天在学习第九课的同时也把第十课完成了。不过,学习第十课没有第九课轻松了,它的注释有的地方省略了(因为不是同一个人写的,本文作者的风格是就问题针对性地给出注释,而不关心一些细节如为什么要这样做),所以对于一些变量的实际作用感受不深。这一课是写一个三维引擎的东西。不仅能看到一个物体,而且可以在其中移动来看其中的内部(通过改变物体的世界 坐标系而不是改变视点的位置),文中给出了几个数据结构,从开始

arxiuluo的专栏 996

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Unity3D中Quaternion.Euler方法解析

8.3.3 Euler方法:欧拉角对应的四元数 基本语法:(1)public static Quaternion Euler(Vector3 euler); (2)public static Quaternion Euler(float x, float y, float z); 功能说明:此方法用于返回欧拉角Vector3(x,y,z)对应的四元数Quaternion实例。四元数Quate

宏哥的博客 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

OpenGL教程之漫游3D世界

Jeff Molofee(NeHe)的OpenGL教程- 漫游3D世界原 文:Lesson 10: Loading And Moving Through A 3D World译 者:CKER  这一课是由Lionel Brits(βtelgeuse)所写的。在本课中我们只对增加的代码做解释。当然只添加课程中所写的代码,程序是不会运行的。如果您有兴趣知道下面的每一行代码是如何运行的话,请下载完整

3487

linux vector 头文件,C++ vector (向量)

标准库Vector类型使用需要的头文件:#include Vector:Vector 是一个类模板。不是一种数据类型。 Vector是一种数据类型。一、 定义和初始化Vector v1; //默认构造函数v1为空Vector v2(v1);//v2是v1的一个副本Vector v3(n,i);//v3包含n个值为i的元素Vector v4(n); //v4含有n个值为0的元素二、...

weixin_31440829的博客 1666

学习下c++中的向量(Vectors)

一直没有好好学过c++的向量(Vector),但是看好多开源代码中被大量使用,所以,学习学习,转自维基百科         Vector 是C++标准程序库中的一个类,可视为会自动扩展容量的数组,以循序(Sequential)的方式维护变量集合。vector的特色包括支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。vector是C++标准程序库中的众多容器(containe

rocispeng的专栏 1万+

vector用法

vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include; 一、vector 的初始化:可以有五种方式,举例说明如下: (1) vector a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以

u011867581的专栏 2654

c++头文件之Vector(Vector的用法)

c++头文件之Vector 开始学习c++,再这个过程中第一个令人头疼的地方就是头文件的含义了,c++头文件的内容会随着我的深入学习进行更新. 首先,我们需要该清楚Vector的定义: C++标准库提供了被封装的动态数组——Vector。大体上讲,就是更容易上手的动态数组.让我们看看Vector的优缺点. 优点: 1). Vector可以存放任意类型的数据 2). 容量可以自动扩展 3). 初始化形式简单,多样 4). 可以插入或删除元素 5). 可以获取数组的长度(是否为空) 6).

C_1223_的博客 3万+
上一篇: 一些C语言算法和技巧
下一篇: Graph.Inc 图形函数
tinyhare
博客等级 码龄15年 11粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值