2013-05-09 12 views
11

मेरे पास 3-आयामी सरणी है। एक ईंट के रूप में इसके बारे में सोचो। इस ईंट के 24 संभावित घूर्णन हैं (जो अक्षों को समन्वयित करने के समानांतर किनारों को रखते हैं)। मैं सभी संबंधित 3-आयामी सरणी कैसे उत्पन्न करूं?3-आयामी सरणी के सभी 24 घूर्णन कैसे प्राप्त करें?

+0

आप एक प्रयास अपने आप को करना चाहिए ... –

+2

@ MitchWheat- यह एक कठिन समस्या है! मुझे लगता है कि अगर मैं यह प्रयास करता हूं तो भी मैं बहुत जल्दी फंस जाऊंगा। – templatetypedef

उत्तर

2

आप रोटेशन मैट्रिस का उपयोग कर सकते हैं। एक्स-अक्ष के चारों ओर एक 3 डी सरणी घुमाने का मतलब है कि स्थिति (i,j,k) पर तत्व (i,-k,j) स्थिति में मैप किया जाएगा। बेशक, यदि आपकी सरणी 0-अनुक्रमित है, तो आपको शायद -k को size-1-k या उसके जैसा कुछ बदलना होगा।

इसी तरह, y-axis नक्शे (i,j,k) से (k,j,-i) के आसपास घूमते हुए। इन दो घूर्णन को matrices के रूप में दर्शाया जा सकता है।

|i'| |1 0 0| |i| 
|j'| = |0 0 -1|*|j| 
|k'| |0 1 0| |k| 

और y- अक्ष रोटेशन के लिए: X- अक्ष रोटेशन के लिए

|i'| |0 0 1| |i| 
|j'| = |0 1 0|*|j| 
|k'| |-1 0 0| |k| 

कोई भी सामान्य रोटेशन उन दो चक्र का एक अनुक्रम के रूप में वर्णित किया जा सकता है। लगातार दो घूर्णन लागू करना सिर्फ 3x3 matrices गुणा कर रहा है। इसलिए, यदि आपको उनके सभी संभावित उत्पाद मिलते हैं, तो आपको 24 मैट्रिस (पहचान सहित) मिलेंगे, प्रत्येक आपके सरणी के वैध रोटेशन से मेल खाता है। सभी संभव गुणाओं को ढूंढना थोड़ा मुश्किल है, क्योंकि वे यात्रा नहीं करते हैं।

मुझे लगता है कि तुम सिर्फ जानवर बल से 4 प्रपत्र (A^p)*(B^q)*(A^r)*(B^s), के सभी उत्पादों जहां ए और बी से पहले और p,q,r,s अपनी शक्तियों रहे हैं दो मैट्रिक्स हैं, और सीमा 0 से 3 (ए या बी exponentiating करने के लिए उन्हें ले जाएगा कर सकते हैं पहचान मैट्रिक्स पर वापस)।

इसे इस तरह से करना, आप सभी 24 वैध रोटेशन मैट्रिक्स उत्पन्न कर सकते हैं, और उनमें से प्रत्येक का उपयोग करके 3 डी सरणी घुमा सकते हैं, नकारात्मक इंडेक्स को स्थानांतरित करने के लिए देखभाल करते हैं ताकि आप सीमाओं से बाहर न पहुंच सकें।

3

एक मर (आधा जोड़ी पासा) 24 अलग-अलग उन्मुखताओं को देखने के लिए आसान है, और उन्हें उत्पन्न करने के लिए ऑपरेशन अनुक्रमों का सुझाव दे सकता है। आप देखेंगे कि छह में से कोई भी चेहरा ऊपर से ऊपर हो सकता है, और नीचे दिए गए पक्ष चार अलग-अलग कार्डिनल दिशाओं में घुमाए जा सकते हैं। हमें दो आपरेशन निरूपित करते हैं: " बारी" और "रोल", जहाँ बारी अगले करने के लिए एक कार्डिनल से z अक्ष के बारे में मरने घूमता है, और रोल दूर मर घूमता 90 डिग्री आप से है, तो दूर का चेहरा नीचे का चेहरा बन जाता है और निकटतम चेहरा शीर्ष पर होता है। इन ऑपरेशंस को फ़ेलिप लोपस के उत्तर में वर्णित रोटेशन मैट्रिस का उपयोग करके व्यक्त किया जा सकता है, या सरल कार्यों के रूप में व्यक्त किया जा सकता है जब दिया गया (x, y, z) वापसी (-y, x, z) या (x, z, - वाई), क्रमशः।

किसी भी तरह, यदि आप निकट चेहरे पर 1 के साथ मर जाते हैं, 2 दाएं और 3 शीर्ष पर, आप पाएंगे कि चरणों का निम्नलिखित अनुक्रम बारह अलग-अलग ओरिएंटेशन को 1, 2, या 3 स्पॉट के साथ उत्पन्न करता है शीर्ष: आरटीटीआरटीटीटीटीटीटी। फिर अनुक्रम आरटीआर 6, 4, 5 का खुलासा करता है जहां मूल रूप से 1, 2, 3 थे, और अनुक्रम आरटीटीटीटीटीटीटीटीटी की पुनरावृत्ति शीर्ष पर 4, 5, या 6 धब्बे के साथ बारह अभिविन्यास उत्पन्न करती है। उल्लिखित अनुक्रम निम्नलिखित पायथन कोड में एम्बेडेड है।

def roll(v): return (v[0],v[2],-v[1]) 
def turn(v): return (-v[1],v[0],v[2]) 
def sequence (v): 
    for cycle in range(2): 
     for step in range(3): # Yield RTTT 3 times 
      v = roll(v) 
      yield(v)   # Yield R 
      for i in range(3): # Yield TTT 
       v = turn(v) 
       yield(v) 
     v = roll(turn(roll(v))) # Do RTR 

p = sequence((1, 1, 1)) 
q = sequence((-1,-1, 1)) 
for i in sorted(zip(p,q)): 
    print i 

अंकों की तब्दील जोड़े का एक क्रमबद्ध सूची मुद्रण के लिए तर्क दोहरा है: (i) किसी चेहरे उन्मुखीकरण इसके कोनों में से दो के स्थानों से निर्दिष्ट किया जा सकता; (ii) फिर प्रत्येक जोड़ी की विशिष्टता की जांच करना आसान है, उदाहरण के लिए uniq पर आउटपुट पाइप करके।

यहाँ कैसे हल कर उत्पादन शुरू होता है:

((-1, -1, -1), (-1, 1, 1)) 
((-1, -1, -1), (1, -1, 1)) 
((-1, -1, -1), (1, 1, -1)) 
((-1, -1, 1), (-1, 1, -1)) 
((-1, -1, 1), (1, -1, -1)) 
((-1, -1, 1), (1, 1, 1)) 
((-1, 1, -1), (-1, -1, 1)) 
((-1, 1, -1), (1, -1, -1)) 
((-1, 1, -1), (1, 1, 1)) 
संबंधित मुद्दे