3 回答

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 點的下方

TA貢獻2051條經驗 獲得超10個贊
和等式背后的數學思想c1
是c2
證明p1q1
和p2q2
(類似地,p2q3
和p1q2
)之間存在關系。請注意,標準形狀 W 的關系并沒有說明p1q1
與 平行p2q2
,但p1q1
是 的平移結果,op1
并且形狀與p2q2
(即c1
)成比例。也許圖像有助于理解這部分。這同樣適用于c2
。
另外,請注意該關系意味著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
性能輸出:
p1q2 = oq2 + op2 OK
c1 = 2
c2 = 2
添加回答
舉報