在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ 求指點(diǎn)下這段Python代碼怎么改錯(cuò)?

求指點(diǎn)下這段Python代碼怎么改錯(cuò)?

這段代碼大致目的是希望通過(guò)初始的點(diǎn)A,點(diǎn)A'及所有的點(diǎn)B坐標(biāo),通過(guò)一個(gè)公式不斷迭代計(jì)算的到所有點(diǎn)B'的坐標(biāo),我用的列表元素表示坐標(biāo)值,報(bào)錯(cuò)后不知道該怎么修改了 剛學(xué)Python,問(wèn)題淺薄,請(qǐng)多指教
代碼如下:

import math

#兩點(diǎn)坐標(biāo)距離公式
def sqrtpowsum(A,B):
    return math.sqrt(math.pow(A[0]-B[0],2)+math.pow(A[1]-B[1],2)+math.pow(A[2]-B[2],2))

#型材拉伸量
L0e = 0.1

#初始點(diǎn)A坐標(biāo)
Coordinate_A = [16.6588, 14.0349, 0.0]

#初始點(diǎn)A'坐標(biāo)
Coordinate_A_quote = [16.6588, 14.0349, 300]

#每一輪點(diǎn)B坐標(biāo)
Coordinate_B = [
            [16.6603, 14.0594, -4.86946],
            [16.6662, 14.1329, -9.72499],
            [16.6763, 14.2555, -14.5686]
]

""" ========================
    分割線下方內(nèi)容請(qǐng)勿修改
    ========================
"""

#點(diǎn)A的三個(gè)坐標(biāo)
A_x = Coordinate_A[0]
A_y = Coordinate_A[1]
A_z = Coordinate_A[2]

#點(diǎn)A'的三個(gè)坐標(biāo)
A_quote_x = Coordinate_A_quote[0]
A_quote_y = Coordinate_A_quote[1]
A_quote_z = Coordinate_A_quote[2]

#計(jì)算點(diǎn)B的個(gè)數(shù)
n = len(Coordinate_B)

#該輪點(diǎn)B'的坐標(biāo)
Coordinate_B_quote =[]

for i in range(n):
    # 該輪B點(diǎn)的三個(gè)坐標(biāo)
    B_x = Coordinate_B[i][0]
    B_y = Coordinate_B[i][1]
    B_z = Coordinate_B[i][2]
    # 計(jì)算L和l
    L = sqrtpowsum(Coordinate_A,Coordinate_A_quote) +L0e
    l = sqrtpowsum(Coordinate_A,Coordinate_B)
    m = L/l
    # 計(jì)算該輪點(diǎn)B'的三個(gè)坐標(biāo)
    B_quote_x = m*B_x + (1-m)*A_x
    B_quote_y = m*B_y + (1-m)*A_y
    B_quote_z = m*B_z + (1-m)*A_z
    # 該輪點(diǎn)B’的坐標(biāo)
    Coordinate_B_quote[0] = B_quote_x
    Coordinate_B_quote[1] = B_quote_y
    Coordinate_B_quote[2] = B_quote_z
    # 迭代
    Coordinate_A = Coordinate_B
    Coordinate_A_quote = Coordinate_B_quote
    # 輸出該輪B'坐標(biāo)
    print("B'" + i + "=" + Coordinate_B_quote +"\n")

報(bào)錯(cuò)如下:

Traceback (most recent call last):
 File "E:/python code/trace code.py", line 44, in <module>
   l = sqrtpowsum(Coordinate_A,Coordinate_B)
 File "E:/python code/trace code.py", line 5, in sqrtpowsum
   return math.sqrt(math.pow(A[0]-B[0],2)+math.pow(A[1]-B[1],2)+math.pow(A[2]-B[2],2))
TypeError: unsupported operand type(s) for -: 'float' and 'list'

需要迭代計(jì)算的 B 點(diǎn)有好幾百個(gè),如果能優(yōu)化一下就更好了

回答
編輯回答
醉淸風(fēng)

分割線下面都是錯(cuò)誤

1.Coordinate_B是二維數(shù)組,Coordinate_A坐標(biāo)的值怎么能和列表做加減呢
2.Coordinate_B_quote =[]沒(méi)有定義長(zhǎng)度,不能Coordinate_B_quote[0] = B_quote_x這樣賦值
3.print("B'" + i + "=" + Coordinate_B_quote +"n")需要轉(zhuǎn)換字符串類型

2017年5月17日 15:37
編輯回答
孤客

我改了一下你的代碼如下:

import math

#兩點(diǎn)坐標(biāo)距離公式
def sqrtpowsum(A, B):
    return math.sqrt(sum((a-b)**2 for a, b in zip(A, B)))

#型材拉伸量
L0e = 0.1

#初始點(diǎn)A坐標(biāo)
Coordinate_A = [16.6588, 14.0349, 0.0]

#初始點(diǎn)A'坐標(biāo)
Coordinate_A_quote = [16.6588, 14.0349, 300]

#每一輪點(diǎn)B坐標(biāo)
Coordinate_B_lst = [
    [16.6603, 14.0594, -4.86946],
    [16.6662, 14.1329, -9.72499],
    [16.6763, 14.2555, -14.5686]
]

for i, Coordinate_B in enumerate(Coordinate_B_lst):
    # 計(jì)算L和l
    L = sqrtpowsum(Coordinate_A, Coordinate_A_quote) +L0e
    l = sqrtpowsum(Coordinate_A, Coordinate_B)
    m = L/l
    # 計(jì)算該輪點(diǎn)B'的三個(gè)坐標(biāo)
    Coordinate_B_quote = [m*b+(1-m)*a for a, b in zip(Coordinate_A, Coordinate_B)]
    # 迭代
    Coordinate_A, Coordinate_A_quote = Coordinate_B, Coordinate_B_quote
    # 輸出該輪B'坐標(biāo)
    print("B'" + str(i) + "=" + str(Coordinate_B_quote) +"\n")

除了寫法上不同,邏輯也不太一樣,有一點(diǎn)我不確定是你的 bug 還是我的誤解, 那就是每一輪用來(lái)計(jì)算 B' 的 A_x, A_y 和 A_z 是原 A 點(diǎn)的座標(biāo)還是各輪迭代造成改變的 A 座標(biāo), 不過(guò)你可以參考看看寫法, 也許會(huì)有一些心得。


我回答過(guò)的問(wèn)題: Python-QA

2017年4月30日 09:50