far与near的用法

  far 是C/C++语言在16位系统中用以标明指针是个远指针的修饰符,在32位系统已经废除不用了。远指针是说指针所指向的地址已经超出了64K(2的十六次方),所以需要使用DS加偏移量的方法来寻址,而不能直接寻址。其反义的修饰符是near,举例:
      int far *fptr;      
      fptr=(int far*)0xb0000000; 
16位PC机的存储器地址是由段地址和偏移地址组合而成,每一段不能超过64k字节地址,因而同一个段内的地址存取,用偏移地址就可以实现,因段地址寄存器所存的段地址是不变的。当用指针时,只16位就够了,这一类就是near指针。当要在另一个段内取数据,就要跨越段,即要指明存取段的段地址和偏移地址,这时段地址寄存器所存段地址要改变,在使用指针指向另一个段内地址时,就要用32位表示,就是far指针了。由此可见,如果你想写在Win16上也能运行的程序,才会涉及到newr、far指针的概念。在Win32上,指针已无near、far的区分。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在++中,Matrix4d通常也是由程序员自己定义的一个类或结构体,用于表示4x4的矩阵。以下是一个简单的Matrix4d类的示例: ```c++ class Matrix4d { public: double m[4][4]; Matrix4d() { memset(m, 0, sizeof(m)); } Matrix4d operator*(const Matrix4d& other) const { Matrix4d result; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { result.m[i][j] = m[i][0] * other.m[0][j] + m[i][1] * other.m[1][j] + m[i][2] * other.m[2][j] + m[i][3] * other.m[3][j]; } } return result; } Vector4d operator*(const Vector4d& v) const { double x = m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w; double y = m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w; double z = m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w; double w = m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w; return Vector4d(x, y, z, w); } void setIdentity() { memset(m, 0, sizeof(m)); m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1; } void setTranslation(double x, double y, double z) { setIdentity(); m[0][3] = x; m[1][3] = y; m[2][3] = z; } void setRotationX(double angle) { setIdentity(); double cosA = cos(angle); double sinA = sin(angle); m[1][1] = cosA; m[1][2] = -sinA; m[2][1] = sinA; m[2][2] = cosA; } void setRotationY(double angle) { setIdentity(); double cosA = cos(angle); double sinA = sin(angle); m[0][0] = cosA; m[0][2] = sinA; m[2][0] = -sinA; m[2][2] = cosA; } void setRotationZ(double angle) { setIdentity(); double cosA = cos(angle); double sinA = sin(angle); m[0][0] = cosA; m[0][1] = -sinA; m[1][0] = sinA; m[1][1] = cosA; } void setScale(double x, double y, double z) { setIdentity(); m[0][0] = x; m[1][1] = y; m[2][2] = z; } void setPerspective(double fov, double aspect, double near, double far) { setIdentity(); double f = 1.0 / tan(fov * 0.5); m[0][0] = f / aspect; m[1][1] = f; m[2][2] = (far + near) / (near - far); m[2][3] = 2 * far * near / (near - far); m[3][2] = -1; m[3][3] = 0; } }; ``` 上述代码定义了一个4x4矩阵类Matrix4d,它包含了矩阵乘法、向量乘法、单位矩阵、平移、旋转和缩放等常用的矩阵操作。程序员可以使用这个类来进行矩阵的计算和操作,例如: ```c++ Matrix4d mat; mat.setIdentity(); // 设置为单位矩阵 Matrix4d mat2; mat2.setTranslation(1, 2, 3); // 设置平移矩阵 Matrix4d mat3 = mat * mat2; // 矩阵相乘 Vector4d v(1, 2, 3, 1); Vector4d v2 = mat3 * v; // 矩阵与向量相乘 ``` 以上代码演示了如何创建一个Matrix4d对象mat,以及如何使用Matrix4d类中的各种方法对它进行操作和计算。程序员可以使用这个类来进行3D图形的变换,例如平移、旋转、缩放和投影等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值