开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1134|回复: 7
收起左侧

[C/C++] C++大神麻烦帮忙看看一个算法

[复制链接]
结帖率:0% (0/5)
发表于 2020-2-29 15:04:34 | 显示全部楼层 |阅读模式   贵州省黔东南苗族侗族自治州
80精币
private:
Vector3 GetPosition(DWORD64 transform)
{
  if (!transform) return Vector3{ 0.f, 0.f, 0.f };
  struct Matrix34 { BYTE vec0[16]; BYTE vec1[16]; BYTE vec2[16]; };
  const __m128 mulVec0 = { -2.000, 2.000, -2.000, 0.000 };
  const __m128 mulVec1 = { 2.000, -2.000, -2.000, 0.000 };
  const __m128 mulVec2 = { -2.000, -2.000, 2.000, 0.000 };
  int Index = *(PINT)(transform + 0x40);
  DWORD64 pTransformData = safe_read(transform + 0x38, DWORD64);
  DWORD64 transformData[2];
  safe_memcpy(&transformData, (PVOID)(pTransformData + 0x18), 16);
  size_t sizeMatriciesBuf = 48 * Index + 48;
  size_t sizeIndicesBuf = 4 * Index + 4;
  int pIndicesBuf[100];
  Matrix34 pMatriciesBuf[1000];
  
  safe_memcpy(pMatriciesBuf, (PVOID)transformData[0], sizeMatriciesBuf);
  safe_memcpy(pIndicesBuf, (PVOID)transformData[1], sizeIndicesBuf);
  
  __m128 result = *(__m128*)((ULONGLONG)pMatriciesBuf + 0x30 * Index);
  int transformIndex = *(int*)((ULONGLONG)pIndicesBuf + 0x4 * Index);
  
  while (transformIndex >= 0)
  {
   Matrix34 matrix34 = *(Matrix34*)((ULONGLONG)pMatriciesBuf + 0x30 * transformIndex);
   __m128 xxxx = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&matrix34.vec1), 0x00));
   __m128 yyyy = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&matrix34.vec1), 0x55));
   __m128 zwxy = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&matrix34.vec1), 0x8E));
   __m128 wzyw = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&matrix34.vec1), 0xDB));
   __m128 zzzz = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&matrix34.vec1), 0xAA));
   __m128 yxwy = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&matrix34.vec1), 0x71));
   __m128 tmp7 = _mm_mul_ps(*(__m128*)(&matrix34.vec2), result);
   result = _mm_add_ps(
    _mm_add_ps(
     _mm_add_ps(
      _mm_mul_ps(
       _mm_sub_ps(
        _mm_mul_ps(_mm_mul_ps(xxxx, mulVec1), zwxy),
        _mm_mul_ps(_mm_mul_ps(yyyy, mulVec2), wzyw)),
       _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(tmp7), 0xAA))),
      _mm_mul_ps(
       _mm_sub_ps(
        _mm_mul_ps(_mm_mul_ps(zzzz, mulVec2), wzyw),
        _mm_mul_ps(_mm_mul_ps(xxxx, mulVec0), yxwy)),
       _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(tmp7), 0x55)))),
     _mm_add_ps(
      _mm_mul_ps(
       _mm_sub_ps(
        _mm_mul_ps(_mm_mul_ps(yyyy, mulVec0), yxwy),
        _mm_mul_ps(_mm_mul_ps(zzzz, mulVec1), zwxy)),
       _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(tmp7), 0x00))),
      tmp7)), *(__m128*)(&matrix34.vec0));
   transformIndex = *(int*)((ULONGLONG)pIndicesBuf + 0x4 * transformIndex);
  }
  return Vector3(result.m128_f32[0], result.m128_f32[1], result.m128_f32[2]);
}



//C语言能力有没法帮忙翻译一下


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:100% (4/4)
发表于 2020-2-29 16:29:46 | 显示全部楼层   湖北省武汉市
这是C++STL里面的vector的定义,在易语言里面您可以直接使用长度为0的数组替代
回复

使用道具 举报

结帖率:80% (4/5)

签到天数: 2 天

发表于 2020-2-29 20:51:08 | 显示全部楼层   山西省吕梁市
论坛里有一个翻译工具,找一下!
回复

使用道具 举报

结帖率:0% (0/5)
 楼主| 发表于 2020-3-1 13:39:45 | 显示全部楼层   贵州省黔东南苗族侗族自治州
huzpsb 发表于 2020-2-29 16:29
这是C++STL里面的vector的定义,在易语言里面您可以直接使用长度为0的数组替代

嗯嗯,主要是下面的算法
回复

使用道具 举报

发表于 2020-3-1 14:19:31 | 显示全部楼层   广西壮族自治区钦州市
小新wl 发表于 2020-2-29 20:51
论坛里有一个翻译工具,找一下!

除非精通C++和易语言 才写得出互相翻译的 你觉得可能?
回复

使用道具 举报

结帖率:80% (4/5)

签到天数: 2 天

发表于 2020-3-2 10:08:26 | 显示全部楼层   山西省吕梁市
我记得论坛有人发过
https://www.arpun.com/soft/79478.html
试试这个
回复

使用道具 举报

结帖率:100% (4/4)
发表于 2020-3-2 12:16:38 | 显示全部楼层   湖北省武汉市
qq1030655828 发表于 2020-3-1 13:39
嗯嗯,主要是下面的算法

理论上不可能翻译,因为dword64是64位特有的xx类型,易语言没有
回复

使用道具 举报

结帖率:100% (4/4)
发表于 2020-3-2 12:18:00 | 显示全部楼层   湖北省武汉市
a617273503 发表于 2020-3-1 14:19
除非精通C++和易语言 才写得出互相翻译的 你觉得可能?

  1. 私有类:
  2. 不定长数组3 获取位置(64位不定类型变量 区块)
  3. {
  4.   if (!区块) return Vector3{ 0.f, 0.f, 0.f };
  5.   定义结构体 索引34 { BYTE vec0[16]; BYTE vec1[16]; BYTE vec2[16]; };
  6.   定义 常量 __m128 mulVec0 = { -2.000, 2.000, -2.000, 0.000 };
  7.   定义 常量 __m128 mulVec1 = { 2.000, -2.000, -2.000, 0.000 };
  8.   定义 常量 __m128 mulVec2 = { -2.000, -2.000, 2.000, 0.000 };
  9.   整数变量 索引 = *(P整数变量)(区块 + 0x40);
  10.   64位不定类型变量 p区块Data = 带校验_read(区块 + 0x38, 64位不定类型变量);
  11.   64位不定类型变量 区块Data[2];
  12.   带校验_内存复制(&区块Data, (PVOID)(p区块Data + 0x18), 16);
  13.   大小_t 大小MatriciesBuf = 48 * 索引 + 48;
  14.   大小_t 大小IndicesBuf = 4 * 索引 + 4;
  15.   整数变量 pIndicesBuf[100];
  16.   索引34 pMatriciesBuf[1000];
  17.   
  18.   带校验_内存复制(pMatriciesBuf, (PVOID)区块Data[0], 大小MatriciesBuf);
  19.   带校验_内存复制(pIndicesBuf, (PVOID)区块Data[1], 大小IndicesBuf);
  20.   
  21.   __m128 result = *(__m128*)((ULONGLONG)pMatriciesBuf + 0x30 * 索引);
  22.   整数变量 区块索引 = *(整数变量*)((ULONGLONG)pIndicesBuf + 0x4 * 索引);
  23.   
  24.   while (区块索引 >= 0)
  25.   {
  26.    索引34 索引34 = *(索引34*)((ULONGLONG)pMatriciesBuf + 0x30 * 区块索引);
  27.    __m128 xxxx = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&索引34.vec1), 0x00));
  28.    __m128 yyyy = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&索引34.vec1), 0x55));
  29.    __m128 zwxy = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&索引34.vec1), 0x8E));
  30.    __m128 wzyw = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&索引34.vec1), 0xDB));
  31.    __m128 zzzz = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&索引34.vec1), 0xAA));
  32.    __m128 yxwy = _mm_castsi128_ps(_mm_shuffle_epi32(*(__m128i*)(&索引34.vec1), 0x71));
  33.    __m128 tmp7 = _mm_mul_ps(*(__m128*)(&索引34.vec2), result);
  34.    result = _mm_add_ps(
  35.     _mm_add_ps(
  36.      _mm_add_ps(
  37.       _mm_mul_ps(
  38.        _mm_sub_ps(
  39.         _mm_mul_ps(_mm_mul_ps(xxxx, mulVec1), zwxy),
  40.         _mm_mul_ps(_mm_mul_ps(yyyy, mulVec2), wzyw)),
  41.        _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(tmp7), 0xAA))),
  42.       _mm_mul_ps(
  43.        _mm_sub_ps(
  44.         _mm_mul_ps(_mm_mul_ps(zzzz, mulVec2), wzyw),
  45.         _mm_mul_ps(_mm_mul_ps(xxxx, mulVec0), yxwy)),
  46.        _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(tmp7), 0x55)))),
  47.      _mm_add_ps(
  48.       _mm_mul_ps(
  49.        _mm_sub_ps(
  50.         _mm_mul_ps(_mm_mul_ps(yyyy, mulVec0), yxwy),
  51.         _mm_mul_ps(_mm_mul_ps(zzzz, mulVec1), zwxy)),
  52.        _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(tmp7), 0x00))),
  53.       tmp7)), *(__m128*)(&索引34.vec0));
  54.    区块索引 = *(整数变量*)((ULONGLONG)pIndicesBuf + 0x4 * 区块索引);
  55.   }
  56.   return Vector3(result.m128_f32[0], result.m128_f32[1], result.m128_f32[2]);
  57. }
复制代码

伪代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表