- 积分
- 2220
- 明经币
- 个
- 注册时间
- 2021-11-14
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
楼主 |
发表于 2023-2-8 17:11:54
|
显示全部楼层
本帖最后由 landsat99 于 2023-2-8 17:15 编辑
测试配套的 坐标变换 平移 旋转 镜像附上。
比如:对一个Rectangle 同时进行了 旋转 平移 水平镜像加偏移,生成新的Rec。
然后新旧Rec 对比,判断是否等价。
- # Vector.py
- import numpy as np
- import matplotlib.pyplot as plt
- class Rec():
- def __init__(self, RecOri):
- self.Data = np.append(RecOri.T, [[1, 1, 1, 1]], axis=0)
- def Rotate(self, beta): # 旋转 顺时针为正
- rad = beta / 180 * np.pi
- self.transform = np.array([[np.cos(rad), -np.sin(rad), 0],
- [np.sin(rad), np.cos(rad), 0],
- [0, 0, 1]])
- return self.Process()
- def Move(self, del_x, del_y): # 平移 笛卡尔坐标方向
- self.transform = np.array(
- [[1, 0, del_x], [0, 1, del_y], [0, 0, 1]])
- return self.Process()
- def Hori(self, col=0): # 水平镜像
- self.col = col # 镜像竖向轴 偏移量
- self.transform = np.array(
- [[-1, 0, self.col], [0, 1, 0], [0, 0, 1]])
- return self.Process()
- def Vert(self, row=0): # 垂直镜像
- self.row = row # 镜像横向轴 偏移量
- self.transform = np.array(
- [[1, 0, 0], [0, -1, self.row], [0, 0, 1]])
- return self.Process()
- def Process(self):
- Re = np.dot(self.transform, self.Data)
- return np.delete(Re, 2, 0).T
- def plot2D(RecOri, RecNew):
- x_ori = np.append(RecOri.T[0], [RecOri.T[0][0]])
- y_ori = np.append(RecOri.T[1], [RecOri.T[1][0]])
- x_new = np.append(RecNew.T[0], [RecNew.T[0][0]])
- y_new = np.append(RecNew.T[1], [RecNew.T[1][0]])
- plt.scatter(x_ori, y_ori, alpha=0.5)
- ax = plt.gca()
- ax.set_aspect(1)
- ax.spines['right'].set_visible(False)
- ax.spines['top'].set_visible(False)
- ax.spines['left'].set_position(('data', 0))
- ax.spines['bottom'].set_position(('data', 0))
- plt.xlim(xmin=-5, xmax=10)
- plt.ylim(ymin=-6, ymax=6)
- plt.scatter(x_ori, y_ori) # 画散点图
- plt.plot(x_ori, y_ori) # 画连线图
- plt.scatter(x_new, y_new)
- plt.plot(x_new, y_new)
- plt.show()
- if __name__ == '__main__':
- # 原始四边形 点集序列
- RecOri = np.array([[1, 1], [3.5, 1], [4, 2], [2, 5]])
- # 变换操作
- RecObj_1 = Rec(RecOri)
- RecNew = RecObj_1.Rotate(70) # 旋转
- RecNew = Rec(RecNew)
- RecNew = RecNew.Move(3, -4) # 平移
- RecNew = Rec(RecNew)
- RecNew = RecNew.Hori(2) # 水平镜像
- plot2D(RecOri, RecNew)
对比等价算法 (浮点精度 此处设为4位)
- # EquRec.py
- import matplotlib.pyplot as plt
- import numpy as np
- import Vector as ve
- def Dist(P1, P2):
- return (P2[0] - P1[0])**2 + (P2[1] - P1[1])**2
- def LenList(PoiArr):
- dist1 = round(Dist(PoiArr[0], PoiArr[1]), 4)
- dist2 = round(Dist(PoiArr[1], PoiArr[2]), 4)
- dist3 = round(Dist(PoiArr[2], PoiArr[3]), 4)
- dist4 = round(Dist(PoiArr[3], PoiArr[0]), 4)
- crs1 = round(Dist(PoiArr[0], PoiArr[2]), 4)
- crs2 = round(Dist(PoiArr[1], PoiArr[3]), 4)
- return [dist1, dist2, dist3, dist4], [crs1, crs2]
- RecA = np.array([[1, 1], [4, 1], [4, 2], [1, 2]])
- RectObj = ve.Rec(RecA)
- RecB = RectObj.Rotate(60)
- if set(LenList(RecA)[0]) == set(LenList(RecB)[0]) and set(LenList(RecA)[1]) == set(LenList(RecB)[1]):
- print("----两个四边形 完全相等----")
- else:
- print("**两个四边形 不同")
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|