मैं समीकरण x^2 + y^2 + z^2 = S के पूर्णांक समाधानों की एक छवि तैयार करने के लिए एक व्यक्तिगत परियोजना पर काम कर रहा हूं जहां 'एस' कोई पूर्णांक है।

दूसरे शब्दों में, मैं उन सभी 3D बिंदुओं [x,y,z] की तलाश में हूं जहां x, y, और z सभी पूर्ण वर्ग पूर्णांक हैं और x + y + z = S

उदाहरण के लिए, S = 2809 के हल होंगे:

  • [१४४, १२९६, १३६९],
  • [१४४, ७२९, १९३६],
  • [०, ०, २८०९]
  • ... प्लस उपरोक्त के सभी क्रमपरिवर्तन (अर्थात 144+729+1936 = 1936+729+144)

इससे पहले कि मैं अपने प्रश्न पर पहुँचूँ, यहाँ कुछ संदर्भ के लिए एक छोटी स्पर्शरेखा है:

सामान्य समीकरण x + y + z = S के सभी हल निम्न द्वारा परिभाषित एक 2D तल पर होंगे:

  • ए = [एस, 0, 0]
  • बी = [0, एस, 0]
  • सी = [0, 0, एस]

यहाँ x + y + z = 50 के सभी समाधानों (सिर्फ वर्ग बिंदु नहीं) का एक ग्राफ दिया गया है, जो यह दर्शाता है कि इस समीकरण के सभी समाधान ऊपर परिभाषित ABC द्वारा परिबद्ध एक ही तल पर होंगे। ध्यान दें कि नीचे दिए गए त्रिभुज की युक्तियाँ हैं: [५०, ०, ०], [०, ५०, ०], और [०, ०, ५०]

ABC plane

मेरे प्रश्न पर वापस: वर्ग समाधान बिंदुओं को खोजने के बाद, मैं ए के साथ एबीसी विमान के आधार पर 3 डी समाधान बिंदुओं को 2 डी निर्देशांक में स्थानांतरित करना चाहता हूं (0,0), बी अधिकतम 'x' मान है, और सी है अधिकतम 'y' मान। मैं तब इन समाधानों को एक छवि फ़ाइल में आउटपुट करने की आशा करता हूं।

मेरा रैखिक बीजगणित ज्ञान विरल है, और मैं ३ गैर-कोलीनियर बिंदुओं के आधार पर ३डी निर्देशांक को २डी विमान निर्देशांक में स्थानांतरित करने के लिए एक विधि खोजने में असमर्थ रहा हूं।

मेरा कोड वर्तमान में अजगर में है, लेकिन एक एल्गोरिथम/गणितीय उत्तर उतना ही अच्छा है!

किसी भी प्रकार की मदद की बेहद सराहना की जाती है!

1
Matt 20 सितंबर 2020, 23:51

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि मैंने देखा है, आप पहले से ही अपने (x, y, z) अंक ढूंढ सकते हैं, और आपका प्रश्न उन्हें एक विमान पर प्रोजेक्ट करने के तरीके के बारे में है।

कृपया प्रोजेक्शन मैट्रिक्स का संदर्भ लें, यह जानने के लिए कि 3डी दुनिया को अपनी पसंद के इमेज प्लेन पर कैसे प्रोजेक्ट करें .

विशेष रूप से, आपको अपने (x, y, z) निर्देशांकों को सजातीय निर्देशांक के रूप में व्यक्त करना होगा। उन्हें (x, y, z, 1) के रूप में, और उन्हें एक प्रासंगिक कैमरा मैट्रिक्स द्वारा गुणा करने के लिए जो उस विमान के लिए ऑर्थोगोनल है जिस पर आपको उन्हें कास्ट करने की आवश्यकता है।

इससे फॉर्म (x', y', f) के 2d सजातीय निर्देशांक प्राप्त होंगे जिससे आप (x_projected, y_projected) = (x'/f, y'/f) द्वारा अनुमानित निर्देशांक प्राप्त करने में सक्षम होंगे।

OpenCV आपका मित्र है।

रिकैप:

  1. इनपुट: n (x, y, z) अंक
  2. opencv का उपयोग करके M आकार का प्रोजेक्शन (कैमरा) मैट्रिक्स (4, 3) प्राप्त करें या किसी भी उपकरण का उपयोग करके स्वयं की गणना करें।
  3. सभी बिंदुओं पर अंतिम आयाम 1 जोड़ें, ताकि उन्हें 3डी सजातीय निर्देशांक के रूप में प्राप्त किया जा सके: n अंक (x, y, z, 1)
  4. अनुमानित बिंदुओं को 2d सजातीय निर्देशांक के रूप में प्राप्त करने के लिए मैट्रिक्स द्वारा सभी बिंदुओं को गुणा करें: M * (x, y, z, 1)^T = (x', y', f)
  5. (x, y) = (x'/f, y'/f) द्वारा n वास्तविक 2d अनुमानित निर्देशांक (M मैट्रिक्स द्वारा परिभाषित कैमरा केंद्र के सापेक्ष) प्राप्त करें

बोनस: आप अपने सभी (x, y, z, 1) अंक को कॉलम के रूप में (4, n) मैट्रिक्स, P में ढेर कर सकते हैं, और पूरी गुणा प्रक्रिया R = M * P होगी, एक परिणाम मैट्रिक्स R आकार का (3, n) जिसके स्तंभ परिणामी सजातीय निर्देशांक हैं।

3
Gulzar 21 सितंबर 2020, 00:40

मुझे लगता है कि गुलज़ार का जवाब सही है, लेकिन प्रतिपादन के आसपास अधिक केंद्रित है (यानी कैमरा और समरूप निर्देशांक)। हालाँकि मैंने यह पता लगाया कि मैं जो चाहता हूँ उसे कैसे करना है।

import ast
import math
import matplotlib.pyplot as plt

def dot_3d(a, b):
    return (a[0]*b[0])+ (a[1]*b[1]) + (a[2]*b[2])

def minus_3d(a, b):
    return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]

def midpoint_3d(a, b):
    return [(a[0] + b[0])/2, (a[1] + b[1])/2, (a[2] + b[2])/2]

def normalize_3d(vec):
    magnitude = math.sqrt(vec[0]**2 + vec[1]**2 + vec[2]**2)
    return [vec[0]/magnitude, vec[1]/magnitude, vec[2]/magnitude]

X = 2809

A = [X, 0, 0]
B = [0, X, 0]
C = [0, 0, X]

S = set([])
for a in range(X+1):
    if int(math.sqrt(a))**2 == a:
        for b in range(X+1):
            if int(math.sqrt(b))**2 == b:
                for c in range(X+1):
                    if int(math.sqrt(c))**2 == c and a + b + c == X:
                        S.add(str([a, b, c]))
S = list(S)

origin = A
normal = normalize_3d([X/3, X/3, X/3])
ax1 = normalize_3d(minus_3d(B, A))
ax2 = normalize_3d(minus_3d(C, midpoint_3d(A, B)))

answers = []

for point_str in S:
    point = ast.literal_eval(point_str)
    x = dot_3d(ax1, minus_3d(point, origin))
    y = dot_3d(ax2, minus_3d(point, origin))
    answers.append([x, y])

plt.scatter([p[0] for p in answers], [p[1] for p in answers])
plt.xlabel('x')
plt.ylabel('y')
plt.show()

रेखांकन शुरू करने वाले 3D निर्देशांक: यहां छवि विवरण दर्ज करें

एबीसी विमान पर "अनुमानित" निर्देशांक: यहां छवि विवरण दर्ज करें

0
Matt 23 सितंबर 2020, 07:21