社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Pure Python 3.6.3-查找两个三维向量之间的度数差异

Rees K • 6 年前 • 1698 次点击  

出于一些不虔诚的原因,我试图用Turtle库制作一个纯Python3.6.3的线框图形显示程序。我已经到了一个地步,我想跳过绘制不必要的tris优化的目的。不必要的tris意味着tris应该被模型的其他部分遮住,也就是说,从三维相机的正常面对。

程序正在处理的模型数据只是一个巨大的三维数组,每个tri的格式如下。

[[Vert],[Vert],[Vert],[Normal]]

我当前版本的代码只有一个模型(多维数据集),如下所示:

from turtle import *

Cube = [[[-50,50,-50],[-50,50,50,],[50,50,50],[0,1,0]],
        [[-50,50,-50],[50,50,50,],[50,50,-50],[0,1,0]],
        [[-50,50,-50],[-50,50,50],[-50,-50,50],[1,0,0]],
        [[-50,50,-50],[-50,-50,-50],[-50,-50,50],[1,0,0]],
        [[-50,50,50],[50,50,50],[50,-50,50],[0,0,1]],
        [[-50,50,50],[50,-50,50],[-50,50,50],[0,0,1]],
        [[-50,-50,-50],[-50,-50,50,],[50,-50,50],[0,-1,0]],
        [[-50,-50,-50],[50,-50,50,],[50,-50,-50],[0,-1,0]],
        [[50,50,-50],[50,50,50],[50,-50,50],[-1,0,0]],
        [[50,50,-50],[50,-50,-50],[50,-50,50],[-1,0,0]],
        [[-50,50,-50],[50,50,-50],[50,-50,-50],[0,0,-1]],
        [[-50,50,-50],[50,-50,-50],[-50,50,-50],[0,0,-1]]]

CamVector = [0,1,0]

def DrawModel(Model):
    for i in range(0,len(Model)):
        goto(Model[i][0][0],Model[i][0][1])
        pd()
        goto(Model[i][1][0],Model[i][1][1])
        goto(Model[i][2][0],Model[i][2][1])
        goto(Model[i][0][0],Model[i][0][1])
        pu()

Model = Cube
DrawModel(Model)

但是我想把每个tri的法向和camvector进行比较,这样代码就变成这样了:

def DrawModel(Model):
    for i in range(0,len(Model)):
        AngleAwayFromCamera = *Math voodoo*
        if AngleAwayFromCamera <= 90:
            *draw tri*

如果有人对如何帮助有任何想法,可以向像我这样有核桃大小大脑的人解释,那就太好了。我看了很多文件,但大多数都飞到了我的头上——可能是因为我没有通过GCSE数学考试。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/42903
文章 [ 1 ]  |  最新文章 6 年前
gmds
Reply   •   1 楼
gmds    6 年前

在不太深入数学细节的情况下,有一种叫做 点积 数学方面:

enter image description here

基本上,这是一种组合两个向量的方法(称为 )得到一个号码。这个数字等于 ,乘以 ,乘以它们之间夹角的余弦(我们称之为)。

多亏了这个等式,通过改变事物,我们最终可以得到我们想要的,也就是。

说我们有 : [1, 2, 3] : [4, 5, 6] . 我们可以通过平方它们的元素并取和的平方根来计算它们的大小。因此, (1 ** 2 + 2 ** 2 + 3 ** 2) ** 0.5 = 14 ** 0.5 ,以及 (4 ** 2 + 5 ** 2 + 6 ** 2) ** 0.5 = 77 ** 0.5 .

把它们相乘给我们 1078 ** 0.5 . 因此,点积等于 (1078 ** 0.5) * cos θ .

结果表明,点积可以通过两个矢量的对应元素相乘并求和得到。所以,为了 上面,点积是 1 * 4 + 2 * 5 + 3 * 6 = 32 .

给定这两个不同(但相等)的点积表达式,我们可以将它们等同于求解,如下所示(arccos是将cos转换为:

(1078 ** 0.5) * cos θ = 32
cos θ = 32 / (1078 ** 0.5)
θ = arccos(32 / (1078 ** 0.5))
θ ≈ 12.93 (in degrees)

现在,剩下的就是在代码中实现它:

from numpy import arccos

def angle_between_vectors(v1, v2):
    def magnitude(v):
        return sum(e ** 2 for e in v) ** 0.5

    dot_product = sum(e1 * e2 for e1, e2 in zip(v1, v2))
    magnitudes = magnitude(v1) * magnitude(v2)
    angle = arccos(dot_product / magnitudes)
    return angle

将此函数应用于 从弧度到度数的转换(除以_,再乘以180)得到12.93。