实现空间任意一点对于任意一平面的镜像点。
为解决此问题,应先做一个纯数学算法
空间任意一点定义:
mirror_point=[[423,267,123],[1082,304,21],[1200,539,35],[1121,590,46],[1019,560,54],[867,634,79]]
任意平面定义:
mirror_info_list={"coordinates":[[0,0,0],[0,0,1],[0,1,0]]}
import math
import numpy as np
mirror_point=[[423,267,123],[1082,304,21],[1200,539,35],[1121,590,46],[1019,560,54],[867,634,79]]
mirror_info_list={"coordinates":[[0,0,0],[0,0,1],[0,1,0]]}
for mirror_info in mirror_info_list:
coordinates = mirror_info_list.get("coordinates", None)
point1 = coordinates[0]
point2 = coordinates[1]
point3 = coordinates[2]
x1 = point1[0]
y1 = point1[1]
z1 = point1[2]
x2 = point2[0]
y2 = point2[1]
z2 = point2[2]
x3 = point3[0]
y3 = point3[1]
z3 = point3[2]
u1 = x2 - x1
u2 = y2 - y1
u3 = z2 - z1
v1 = x3 - x1
v2 = y3 - y1
v3 = z3 - z1
ac = np.array([[0, -v3, v2], [v3, 0, -v1], [-v2, v1, 0]])
ab = np.array([u1, u2, u3])
n = np.dot(ab, ac)
# 单位法向量
n_1 = n[0]
n_2 = n[1]
n_3 = n[2]
k = math.sqrt((n_1 * n_1) + (n_2 * n_2) + n_3 * n_3)
if k == 0:
print("平面未定义正确")
final_k = 1 / k
final_n = final_k * n
final_n1 = float(final_n[0])
final_n2 = float(final_n[1])
final_n3 = float(final_n[2])
d = -(final_n1 * x1 + final_n2 * y1 + final_n3 * z1)
for i in range(len(mirror_point)):
a = mirror_point[i][0]
b = mirror_point[i][1]
c = mirror_point[i][2]
Q = np.array([a, b, c])
Q1 = float(Q[0])
Q2 = float(Q[1])
Q3 = float(Q[2])
Q_final_n = Q1 * final_n1 + Q2 * final_n2 + Q3 * final_n3
change_Q = Q - (Q_final_n + d) * final_n
# 求对称点
m1 = 2 * change_Q[0] - Q[0]
n1 = 2 * change_Q[1] - Q[1]
l1 = 2 * change_Q[2] - Q[2]
fina = [m1, n1, l1]
print(fina)
输出结果:
Pythonocc镜像算法实现
import math
import numpy as np
from OCC.gp import gp_Pnt
from OCC.Display.SimpleGui import init_display
from OCC.BRepBuilderAPI import BRepBuilderAPI_MakeEdge
display, start_display, add_menu, add_function_to_menu = init_display()
mirror_point = [[423, 267, 123], [1082, 304, 21], [1200, 539, 35], [1121, 590, 46], [1019, 560, 54], [867, 634, 79]]
mirror_info_list = {"coordinates": [[0, 0, 0], [0, 0, 1], [0, 1, 0]]}
for mirror_info in mirror_info_list:
coordinates = mirror_info_list.get("coordinates", None)
point1 = coordinates[0]
point2 = coordinates[1]
point3 = coordinates[2]
x1 = point1[0]
y1 = point1[1]
z1 = point1[2]
x2 = point2[0]
y2 = point2[1]
z2 = point2[2]
x3 = point3[0]
y3 = point3[1]
z3 = point3[2]
u1 = x2 - x1
u2 = y2 - y1
u3 = z2 - z1
v1 = x3 - x1
v2 = y3 - y1
v3 = z3 - z1
ac = np.array([[0, -v3, v2], [v3, 0, -v1], [-v2, v1, 0]])
ab = np.array([u1, u2, u3])
n = np.dot(ab, ac)
# 单位法向量
n_1 = n[0]
n_2 = n[1]
n_3 = n[2]
k = math.sqrt((n_1 * n_1) + (n_2 * n_2) + n_3 * n_3)
if k == 0:
print("平面未定义正确")
final_k = 1 / k
final_n = final_k * n
final_n1 = float(final_n[0])
final_n2 = float(final_n[1])
final_n3 = float(final_n[2])
d = -(final_n1 * x1 + final_n2 * y1 + final_n3 * z1)
finallist = []
for i in range(len(mirror_point)):
a = mirror_point[i][0]
b = mirror_point[i][1]
c = mirror_point[i][2]
Q = np.array([a, b, c])
Q1 = float(Q[0])
Q2 = float(Q[1])
Q3 = float(Q[2])
Q_final_n = Q1 * final_n1 + Q2 * final_n2 + Q3 * final_n3
change_Q = Q - (Q_final_n + d) * final_n
# 求对称点
m1 = 2 * change_Q[0] - Q[0]
n1 = 2 * change_Q[1] - Q[1]
l1 = 2 * change_Q[2] - Q[2]
fina = [m1, n1, l1]
finallist.append(fina)
for i in range(len(mirror_point) - 1):
aa = mirror_point[i]
mm = mirror_point[i + 1]
xa = aa[0]
ya = aa[1]
za = aa[2]
xxm = mm[0]
yym = mm[1]
zzm = mm[2]
pointline_a = gp_Pnt(xa, ya, za)
pointline_m = gp_Pnt(xxm, yym, zzm)
line = BRepBuilderAPI_MakeEdge(pointline_a, pointline_m).Shape()
display.DisplayShape(line)
for i in range(len(finallist) - 1):
a = finallist[i]
m = finallist[i + 1]
x = a[0]
y = a[1]
z = a[2]
xx = m[0]
yy = m[1]
zz = m[2]
pointline_1 = gp_Pnt(x, y, z)
pointline_2 = gp_Pnt(xx, yy, zz)
mirrorline = BRepBuilderAPI_MakeEdge(pointline_1, pointline_2).Shape()
display.DisplayShape(mirrorline)
start_display()
运行结果:
初次写博,有什么不对的地方请批评指正!sx