pythonocc镜像算法

实现空间任意一点对于任意一平面的镜像点。

为解决此问题,应先做一个纯数学算法
空间任意一点定义:
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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值