首页/文章/ 详情

关于矢量的基础函数

3月前浏览763






























































proc calculate {points} {    set num_points [llength $points]    if {$num_points < 2 || $num_points > 4} {        return -code error "Invalid number of points. Must be 2, 3, or 4."    }    set last_point [lindex $points end]    switch $num_points {        2 {            set point1 [lindex $points 0]            set point2 [lindex $points 1]            set vector [vecsub $point2 $point1]            set normalized_vector [vecnormalize $vector]            return [list $normalized_vector $point2]        }        3 - 4 {            set point1 [lindex $points 0]            set point2 [lindex $points 1]            set point3 [lindex $points 2]            set vector1 [vecsub $point2 $point1]            set vector2 [vecsub $point3 $point1]            set normal [veccross $vector1 $vector2]            set normalized_normal [vecnormalize $normal]            return [list $normalized_normal $last_point]        }    }}
proc vecsub {v1 v2} {    set result [list]    foreach i $v1 j $v2 {        lappend result [expr {$j - $i}]    }    return $result}
proc vecnormalize {v} {    set length 0    foreach i $v {        set length [expr {$length + $i*$i}]    }    set length [expr {sqrt($length)}]    set result [list]    foreach i $v {        lappend result [expr {$i / $length}]    }    return $result}
proc veccross {v1 v2} {    set x [expr {[lindex $v1 1]*[lindex $v2 2] - [lindex $v1 2]*[lindex $v2 1]}]    set y [expr {[lindex $v1 2]*[lindex $v2 0] - [lindex $v1 0]*[lindex $v2 2]}]    set z [expr {[lindex $v1 0]*[lindex $v2 1] - [lindex $v1 1]*[lindex $v2 0]}]    return [list $x $y $z]}
calculate {{-65.0463 -298.55 -61.6646 } {38.73903 -207.005 -48.1097} }
calculate {{-65.0463 -298.55 -61.6646 } {38.73903 -207.005 -48.1097} {-51.713 -230.822 -49.622}}
calculate {{-65.0463 -298.55 -61.6646 } {38.73903 -207.005 -48.1097} {-51.713 -230.822 -49.622} {-44.304 -262.711 -49.416} }


来源:TodayCAEer
UM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-08-14
最近编辑:3月前
TodayCAEer
本科 签名征集中
获赞 18粉丝 27文章 242课程 0
点赞
收藏
作者推荐

tcl调用Python实现两组节点最近距离计算

记录一下,hypermesh二次开发项目中实际遇到的问题,寻找两组节点之间的最近距离。之前都是使用Tcl的循环加循环方式来计算最近距离。数据量小感受不出慢。但用上这个项目的数据,两组节点分别10000个,程序运行的时间复杂度为O(n^2),需要循环100,000,000次。大力出奇迹版本#定义两组3D节点的坐标setnodes1{{123}{456}{789}}setnodes2{{101112}{131415}{161718}}#计算两组节点之间的最短距离setminDistance1e9;#初始值设为一个较大的数#遍历两组节点的所有组合,计算距离foreachnode1$nodes1{foreachnode2$nodes2{setdx[expr[lindex$node20]-[lindex$node10]]setdy[expr[lindex$node21]-[lindex$node11]]setdz[expr[lindex$node22]-[lindex$node12]]setdistance[expr{sqrt($dx*$dx+$dy*$dy+$dz*$dz)}]if{$distance&lt;$minDistance}{setminDistance$distance}}}#输出最短距离puts&quot;最短距离为:$minDistance&quot;后面听着电脑风扇呜呜呜的响起,于是,转用Python来重新实现这个任务。同样的数据量不到一秒就计算出来了。python的矩阵运算版本importnumpyasnpdefcalculate_min_distance(nodes1,nodes2):matrix1=np.array(nodes1)matrix2=np.array(nodes2)distance_matrix=np.sqrt(np.sum((matrix1[:,np.newaxis]-matrix2)**2,axis=-1))min_distance=np.min(distance_matrix)returnmin_distance#示例输入坐标nodes1=[[2.8095238095238,2.9047619047619,0],[2.8095238095238,3,0.28571428571429],[2.8095238095238,30,0.28571428571429]]nodes2=[[3,2.2380952380952,1.047619047619],[3,2.5238095238095,0.95238095238095]]#计算最短距离min_distance=calculate_min_distance(nodes1,nodes2)#输出最短距离print(&quot;最短距离为:&quot;,min_distance)有一点需要注意,列表之间的格式需要转换一下,tcl列表转换为Python列表代码settcl_list{{123}{23}{2589}}setpython_list_str&quot;&quot;foreachsublist$tcl_list{appendpython_list_str[format&quot;\[%s\]&quot;[join$sublist&quot;,&quot;]]appendpython_list_str&quot;,&quot;}#去除最后一个逗号setpython_list_str[stringtrimright$python_list_str&quot;,&quot;]puts[format&quot;\[%s\]&quot;$python_list_str]tcl如何调用python,传送门在这里。来源:TodayCAEer

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈