本帖最后由 asasqwwq 于 2025-1-1 17:35 编辑
找了很多图像绕点旋转的代码,都不对,这里分享一个自己用GDI模块写的。(GdiPlus模块自行下载)
|
图像_位图_旋转_绕点 | 字节集 | | |
位图字节集 | 字节集 | | | | 旋转角度 | 双精度小数型 | | | | 旋转中心x | 双精度小数型 | | | | 旋转中心y | 双精度小数型 | | | | 置背景色 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | GP图像 | GP图像 | | | 原宽 | 整数型 | | | 原高 | 整数型 | | | GP位图 | GP位图 | | | GP图形 | GP图形 | | | 中心点 | 坐标F | | | 局字节集 | 字节集 | | | 旋转顶点X | 双精度小数型 | | 4 | 旋转顶点Y | 双精度小数型 | | 4 | 新宽 | 整数型 | | | 新高 | 整数型 | | | GP纯色画刷 | GP纯色画刷 | | | Gdiplus初始化 () 如果真 (旋转角度 = 0 ) 返回 (位图字节集 )
GP图像. 创建自字节集 (位图字节集, )原宽 = GP图像. 取宽度 ()原高 = GP图像. 取高度 () 点_计算某点绕中心点旋转 (0, 0, 旋转中心x, 旋转中心y, 旋转角度, 旋转顶点X [1 ], 旋转顶点Y [1 ], 真)点_计算某点绕中心点旋转 (原宽 - 1, 0, 旋转中心x, 旋转中心y, 旋转角度, 旋转顶点X [2 ], 旋转顶点Y [2 ], 真)点_计算某点绕中心点旋转 (原宽 - 1, 原高 - 1, 旋转中心x, 旋转中心y, 旋转角度, 旋转顶点X [3 ], 旋转顶点Y [3 ], 真)点_计算某点绕中心点旋转 (0, 原高 - 1, 旋转中心x, 旋转中心y, 旋转角度, 旋转顶点X [4 ], 旋转顶点Y [4 ], 真) 数组排序 (旋转顶点X, 真)数组排序 (旋转顶点Y, 真)新宽 = 旋转顶点X [4 ] - 旋转顶点X [1 ] + 1 新高 = 旋转顶点Y [4 ] - 旋转顶点Y [1 ] + 1 GP位图. 创建自像素格式 (新宽, 新高, )GP图形. 创建自图像 (GP位图 ) 如果真 (置背景色 ≠ 0 ) GP纯色画刷. 创建 (RGB到ARGB (置背景色, ))  GP图形. 填充矩形I (GP纯色画刷, 0, 0, 新宽, 新高 )
中心点.x = 旋转中心x - 旋转顶点X [1 ]中心点.y = 旋转中心y - 旋转顶点Y [1 ]GP图形. 变形旋转在 (旋转角度, 中心点, ) GP图形. 画图像 (GP图像, -旋转顶点X [1 ], -旋转顶点Y [1 ])局字节集 = 图像_位图_裁剪空白边框 (GP位图. 保存到字节集 ( #图像格式_BMP, ), 置背景色 ) GP图像. 销毁 ()GP位图. 销毁 ()GP图形. 销毁 ()Gdiplus关闭 ()返回 (局字节集 )
|
图像_位图_裁剪空白边框 | 字节集 | | |
位图数据 | 字节集 | | | | 空白边框颜色 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 位图 | 位图 | | | 裁剪位图 | 位图 | | | 宽 | 整数型 | | | 高 | 整数型 | | | 左X | 整数型 | | | 顶Y | 整数型 | | | 右X | 整数型 | | | 底Y | 整数型 | | | x | 整数型 | | | y | 整数型 | | | 发现非边框色 | 逻辑型 | | |
位图. 载入数据 (位图数据 )宽 = 位图. 取宽度 ()高 = 位图. 取高度 ()连续赋值 (-1, 左X, 顶Y, 右X, 底Y ) 变量循环首 (0, 宽 - 1, 1, x ) 发现非边框色 = 假  变量循环首 (0, 高 - 1, 1, y )  如果真 (位图. 取某点颜色 (x, y ) ≠ 空白边框颜色 )   发现非边框色 = 真   跳出循环 ()    变量循环尾 () 如果 (发现非边框色 )  如果 (左X = -1 )   左X = x    右X = x      如果真 (右X = -1 且 左X ≠ -1 ) 跳出循环 ()    变量循环尾 () 变量循环首 (0, 高 - 1, 1, y ) 发现非边框色 = 假  变量循环首 (0, 宽 - 1, 1, x )  如果真 (位图. 取某点颜色 (x, y ) ≠ 空白边框颜色 )   发现非边框色 = 真   跳出循环 ()    变量循环尾 () 如果 (发现非边框色 )  如果 (顶Y = -1 )   顶Y = y    底Y = y      如果真 (底Y ≠ -1 且 顶Y ≠ -1 ) 跳出循环 ()    变量循环尾 ()左X = 选择 (左X = -1, 0, 左X )顶Y = 选择 (顶Y = -1, 0, 顶Y )右X = 选择 (右X = -1, 宽 - 1, 右X )底Y = 选择 (底Y = -1, 高 - 1, 底Y )裁剪位图. 创建 (右X - 左X + 1, 底Y - 顶Y + 1, 24, )位图. 复制到 (左X, 顶Y, 右X - 左X + 1, 底Y - 顶Y + 1, 裁剪位图, 0, 0, )返回 (裁剪位图. 取位图数据 ())
|
点_计算某点绕中心点旋转 | 坐标L | | |
旋转点X | 双精度小数型 | | | | 旋转点Y | 双精度小数型 | | | | 中心点X | 双精度小数型 | | | | 中心点Y | 双精度小数型 | | | | 角度 | 双精度小数型 | | | | 结果点X | 双精度小数型 | | | | 结果点Y | 双精度小数型 | | | | 反转角度方向 | 逻辑型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 余弦值 | 双精度小数型 | | | 正弦值 | 双精度小数型 | | | 旋转_中心差X | 双精度小数型 | | | 旋转_中心差Y | 双精度小数型 | | |
如果 (反转角度方向 ) 角度 = 角度 % 360  角度 = (360 - 角度 ) % 360  余弦值 = 求余弦 (角度 × #pi ÷ 180 )正弦值 = 求正弦 (角度 × #pi ÷ 180 )旋转_中心差X = 旋转点X - 中心点X 旋转_中心差Y = 旋转点Y - 中心点Y 结果点X = 旋转_中心差X × 余弦值 - 旋转_中心差Y × 正弦值 + 中心点X 结果点Y = 旋转_中心差X × 正弦值 + 旋转_中心差Y × 余弦值 + 中心点Y 返回 (制坐标L (四舍五入 (结果点X, ), 四舍五入 (结果点Y, )) )
|