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

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

unique_sir的博客 1万+

Unity3D - 详解Quaternion类

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

yuyingwin的专栏 2万+

国产数据库PolarDB-X实战:5分钟快速搭建本地开发环境(附Docker一键部署脚本)

本文提供了一份详尽的国产分布式数据库PolarDB-X本地开发环境搭建指南。通过Docker Compose一键部署脚本,开发者可在5分钟内快速启动一个功能完整的PolarDB-X实例,涵盖环境准备、脚本解析、连接验证及日常维护,极大简化了国产数据库的入门和体验流程。

weixin_29246195的博客 359

SAP物料主数据表结构全解析:ABAP开发与MM模块必知必会

本文深入解析SAP物料主数据的核心表结构,涵盖MARA、MAKT、MARC、MARD及MVKE等关键表。详细阐述了物料主数据在ABAP开发和MM模块中的存储逻辑与关联关系,帮助开发者和顾问高效处理数据查询、增强功能及业务故障排查,是掌握SAP物料管理基础的必读指南。

weixin_29216957的博客 383

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

实用电路精讲系列---快速精密桥式放大器电路

快速精密桥式放大器通过惠斯通电桥转换物理量为差分信号,经仪表放大器精密放大,具有高共模抑制、低噪声和宽带宽特性。其核心包含:电桥传感器转换、仪表放大器信号调理(增益可调、温漂补偿)、输出级适配ADC。典型应用包括智能断路器监测、胎压检测、电池安全预警等10大领域,需注意传感器-放大器-ADC最短路径布局。实用电路采用LT1057S和LT1010构建,实现稳定供电、差分处理、功率放大和桥式驱动,满足高精度、快速响应需求。该技术在工业控制、医疗设备等领域具有重要价值。

weixin_40590799的博客 1415

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

Windows环境Oracle19C安装与配置全攻略

本文详细介绍了在Windows环境下安装与配置Oracle19C数据库的完整流程,包括环境准备、安装步骤、网络配置、客户端工具设置及常见问题解决方案。特别针对Windows 10和Windows Server 2016及以上版本提供了优化建议,帮助用户高效完成Oracle19C的部署与维护。

weixin_28455801的博客 487

【Python机器学习】零基础掌握TweedieRegressor广义线性回归模型

本次文章主要介绍了如何使用Tweedie回归模型预测电动汽车的实际续航里程。基于车速、气温和驾驶习惯等多种因素,模型能够准确地预测出电动汽车的续航里程,从而为生产商和消费者提供有用的信息。优点总结,Tweedie回归模型在处理具有多元性和高度散布的数据方面表现出色,特别适用于需要考虑多种影响因素的预测任务。优点名称对应描述说明多元性强可以同时处理多种类型和维度的数据高度可定制允许用户自定义损失函数和正则项对异常值鲁棒能够较好地处理数据中的异常值易于解释参数和预测结果都相对容易解释。

Mr数据杨 1007

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

6个常用头文件及库函数

storyteller的博客 4437

uniapp [安卓苹果App端] - 详细实现PDF预览功能在线预览PDF文档,Uniapp App端实现pdf文件预览在线预览pdf二进制文件流、本地pdf文档、PDF文件地址url路径(解决白屏

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniapp在线预览pdf功能,在安卓苹果app平台实现PDF的预览查看,uniappApp端实现pdf文件预览,UNIAPP在线预览PDF文档,Uniappapp在线预览pdf文件流,从后端接口里获取pdf文件如何转成链接预览,预览pdf的插件,uni-app的pdf预览功能,uniapp使用pdf.js插件预览pdf文件,预览pdf白屏没有报错,打开后没反应,打开是空白,加载PDF时发生错误,如

🏆 前端领域优质创作者 1万+

常用库函数及头文件

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

【RT-DETR改进涨点】ResNet18、34、50、101等多个版本移植到ultralytics仓库(RT-DETR官方一比一移植)

本文是本专栏的第一篇改进,我将RT-DETR官方版本中的ResNet18、ResNet34、ResNet50、ResNet101移植到ultralytics仓库,网上很多改进机制是将基础版本的也就是2015年发布的ResNet移植到ultralytics仓库中,但是其实RT-DETR实验的ResNet和其是有很大区别的在其中有很多细节上的不同(文章中我也会列出举例)

Snu77的博客 7222

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

nehe第十课的一些感想

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

arxiuluo的专栏 996

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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、付费专栏及课程。

余额充值