为了账号安全,请及时绑定邮箱和手机立即绑定

用 Python 进行向量运算

用 Python 进行向量运算

肥皂起泡泡 2022-07-26 16:42:02
我想计算c1inP1Q1和c2in P2Q3。目前,我有这个代码def geometric_definition_fuzzy_standard_w(Q1, P1, Q2, P2, Q3):    O_ = (P1[0] + P2[0]) / 2, (P1[1] + P2[1]) / 2    OQ2 = Q2[0] - O_[0], Q2[1] - O_[1]    OP1 = P1[0] - O_[0], P1[1] - O_[1]    OP2 = P2[0] - O_[0], P2[1] - O_[1]    P2Q2 = OQ2[0] - OP2[0], OQ2[1] - OP2[1]    P1Q2 = OQ2[0] + OP2[0], OQ2[1] + OP2[1]    P1Q1 = OP1[0] + P2Q2[0], OP1[1] + P2Q2[1] # HOW CAN I GET c1???    P2Q3 = OP2[0] + P1Q2[0], OP2[1] + P1Q2[1] # HOW CAN I GET c2 ???    longitude_P1Q1 = math.sqrt(P1Q1[0] ** 2 + P1Q1[1] ** 2)    longitude_P2Q2 = math.sqrt(P2Q2[0] ** 2 + P2Q2[1] ** 2)    input(longitude_P1Q1)    input(longitude_P2Q2)geometry_definition_fuzzy_standard_w((1, 30), (2, 5), (3, 20), (4, 5), (5, 30))我正在调用这样的函数geometric_definition_fuzzy_standard_w((1, 30), (2, 5), (3, 20), (4, 5), (5, 30)) 我的输出15.13274595042155615.033296378372908
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

因为这是一个标准形状 W你知道它P1Q1平行于P2Q2

也就是c1和 的长度的P1Q1P2Q2

IOW:你必须扩展多少才能P2Q2P1Q1


查看完整回答
反对 回复 2022-07-26
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

不要从编程语言的角度考虑解决方案

这个想法是,点 Q1 在 X 坐标中偏移了从 O 到 P1 的距离的一个因子,然后在 XY 坐标中另外偏移了某个标量 c1 一个定义为 P2Q2 的向量的因子。

这是可能的,因为 W 形具有平行线。

要计算系数,您需要单独计算从 Q1 到 Q2 和 P1 到 P2 的每对 x 和 y 坐标之间的距离公式和比率,同样在相反的方向

换句话说,P2Q2 的倍数,X 坐标中的偏移量等于与 P1Q1 相同的向量?

请注意,存在隐式点,比如 W1 和 W2,它们存在于“y=0”上并且直接位于最外层 Q 点的下方


查看完整回答
反对 回复 2022-07-26
?
侃侃无极

TA贡献2051条经验 获得超10个赞

和等式背后的数学思想c1c2证明p1q1p2q2(类似地,p2q3p1q2)之间存在关系。请注意,标准形状 W 的关系并没有说明p1q1与 平行p2q2,但p1q1是 的平移结果,op1并且形状与p2q2(即c1)成比例。也许图像有助于理解这部分。这同样适用于c2

//img1.sycdn.imooc.com//62dfa90e0001bc0602500147.jpg

另外,请注意该关系意味着c1和c2是标量;这意味着两个组成部分的比例必须相同。你不能分割向量,但你可以分割它们的分量。这允许您计算c1和c2每个组件(因此,能够解决每个方程)。


接下来,我提供代码来计算c1,并c2通过计算每个组件的值并测试它是否相同。为了清楚起见,我包含了许多调试消息和输入点的绘图。您可以通过执行来禁用它们python -O geometric.py。


代码:


#!/usr/bin/python                                                                                                                                                                                                                           


# -*- coding: utf-8 -*-


# For better print formatting

from __future__ import print_function



# Helper methods

def calculate_vector(p1, p2):

    return p2[0] - p1[0], p2[1] - p1[1]



def add_vectors(v1, v2):

    return v1[0] + v2[0], v1[1] + v2[1]



def draw_points(points):

    import matplotlib.pyplot as plt


    # Draw points

    x_values = [p[0] for p in points]

    y_values = [p[1] for p in points]

    plt.scatter(x_values, y_values)


    # Set chart properties

    plt.title("Geometry")

    plt.xlabel("X")

    plt.ylabel("Y")


    # Show chart

    plt.show()



# Main method

def geometric_definition_fuzzy_standard_w(q1, p1, q2, p2, q3):

    # Calculate O

    if __debug__:

        print ("Calculating O...")

    o = (p1[0] + p2[0])/2, (p1[1] + p2[1])/2

    if __debug__:

        print ("O: " + str(o))


    # Calculate vectors

    if __debug__:

        print ("Calculating vectors...")

    p1q2 = calculate_vector(p1, q2)

    oq2 = calculate_vector(o, q2)

    op2 = calculate_vector(o, p2)


    p1q1 = calculate_vector(p1, q1)

    op1 = calculate_vector(o, p1)

    p2q2 = calculate_vector(p2, q2)


    p2q3 = calculate_vector(p2, q3)

    p1q2 = calculate_vector(p1, q2)


    if __debug__:

        print("POINTS:")

        print ("Q1: " + str(q1))

        print ("P1: " + str(p1))

        print ("Q2: " + str(q2))

        print ("P2: " + str(p2))

        print ("Q3: " + str(q3))

        print ("0:  " + str(o))

        print()

        print("P1Q2 = OQ2 + OP2")

        print ("P1Q2: " + str(p1q2))

        print ("OQ2:  " + str(oq2))

        print ("OP2:  " + str(op2))

        print()

        print("P1Q1 = OP1 + c1*P2Q2")

        print ("P1Q1: " + str(p1q1))

        print ("OP1:  " + str(op1))

        print ("P2Q2: " + str(p2q2))

        print()

        print("P2Q3 = OP2 + c2*P1Q2")

        print ("P2Q3: " + str(p2q3))

        print ("OP2:  " + str(op2))

        print ("P1Q2: " + str(p1q2))

        print ()


    # Assert that p1q2 = oq2 + op2

    if __debug__:

        print("Checking p1q2 = oq2 + op2...")

    p1q2_calculated = add_vectors(oq2, op2)

    if p1q2_calculated != p1q2:

        print ("ERROR: Assert p1q2 = oq2 + op2 invalid")

    else:

        print ("p1q2 = oq2 + op2 OK")


    # Calculate c1

    if __debug__:

        print ("Calculating c1...")

    c1_0 = (p1q1[0] - op1[0])/p2q2[0]

    c1_1 = (p1q1[1] - op1[1])/p2q2[1]

    if c1_0 != c1_1:

        print ("ERROR: C1 is different for each component (" + str(c1_0) + " != " + str(c1_1) + ")")

    else:

        print ("c1 = " + str(c1_0))


    # Calculate c2

    if __debug__:

        print ("Calculating c2...")

    c2_0 = (p2q3[0] - op2[0])/p1q2[0]

    c2_1 = (p2q3[1] - op2[1])/p1q2[1]

    if c2_0 != c2_1:

        print ("ERROR: C2 is different for each component (" + str(c2_0) + " != " + str(c2_1) + ")")

    else:

        print ("c2 = " + str(c2_0))



    # Draw points

    if __debug__:

        draw_points([q1, p1, q2, p2, q3, o])


    # Return c1 and c2

    return c1_0, c2_0



# Entry point

if __name__ == "__main__":

    P1 = (15, 0)

    P2 = (25, 0)

    Q1 = (0, 10)

    Q2 = (20, 5)

    Q3 =(40, 10)

    C1, C2 = geometric_definition_fuzzy_standard_w(Q1, P1, Q2, P2, Q3)


    #geometric_definition_fuzzy_standard_w((1, 30), (2, 5), (3, 20), (4, 5), (5, 30))

调试输出:


Calculating O...

O: (20, 0)

Calculating vectors...

POINTS:

Q1: (0, 10)

P1: (15, 0)

Q2: (20, 5)

P2: (25, 0)

Q3: (40, 10)

0:  (20, 0)


P1Q2 = OQ2 + OP2

P1Q2: (5, 5)

OQ2:  (0, 5)

OP2:  (5, 0)


P1Q1 = OP1 + c1*P2Q2

P1Q1: (-15, 10)

OP1:  (-5, 0)

P2Q2: (-5, 5)


P2Q3 = OP2 + c2*P1Q2

P2Q3: (15, 10)

OP2:  (5, 0)

P1Q2: (5, 5)


Checking p1q2 = oq2 + op2...

p1q2 = oq2 + op2 OK

Calculating c1...

c1 = 2

Calculating c2...

c2 = 2

//img1.sycdn.imooc.com//62dfa91c000185e506440547.jpg

性能输出:


p1q2 = oq2 + op2 OK

c1 = 2

c2 = 2


查看完整回答
反对 回复 2022-07-26
  • 3 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信