2009-12-03 17 views
5

(v) कोने की एक सूची को देखते हुए, और कोने (e) को जोड़ने के किनारों की एक सूची है, और एक सतहों (s) कि किनारों कनेक्ट सूची की गणना करने के लिए, कैसे की मात्रा की गणना करने के Polyhedron?सामान्य सूत्र Polyhedron वॉल्यूम

उत्तर

7
  1. बहुभुज लें और उन्हें त्रिकोण में तोड़ दें।
  2. प्रत्येक त्रिकोण और एक मनमाना बिंदु (मूल) द्वारा बनाए गए टेट्राहेड्रॉन पर विचार करें।
  3. इन tetrahedra के हस्ताक्षरित मात्रा Sum।

नोट्स:

  1. यह केवल यदि आप त्रिकोण के बाहर से देखने पर के लिए एक सुसंगत सीसी या सीसीडब्ल्यू आदेश रख सकते काम करेंगे।
  2. tetrahedron के हस्ताक्षर किए मात्रा 1/6 निम्नलिखित मैट्रिक्स के निर्धारक के बराबर है:

[x1 x2 x3 x4]
[y1 y2 Y3 Y4]
[z1 z2 z3 Z4]
[1 1 1 1]

जहां कॉलम लंबवत (x, y, z, 1) के समरूप समन्वय हैं।

यह तब भी काम करता है जब आकार उस वॉल्यूम को घटाकर और इसे जोड़ने के द्वारा उत्पत्ति को घेरता नहीं है, लेकिन यह लगातार आदेश देने पर निर्भर करता है।

यदि आप ऑर्डर को सुरक्षित नहीं कर सकते हैं तो भी आप इसे टेट्राहेड्रॉन में तोड़ने और प्रत्येक के निर्धारक के 1/6 पूर्ण मूल्य के लिए कुछ रास्ता ढूंढ सकते हैं।

+0

आप "यह काम करता है, भले ही आकार है कि मात्रा बंद subracting के साथ-साथ उस में जोड़कर मूल संलग्न नहीं है, लेकिन है कि एक सुसंगत आदेश होने पर निर्भर करता है क्या मतलब है । " ?? यह गणितीय रूप से कैसे किया जा सकता है ?? –

+0

यह प्रत्येक त्रिभुज को उत्पत्ति से जोड़कर गठित टेट्राहेड्रा की मात्रा को दर्शाता है। यदि आकार के बाहर की उत्पत्ति, उत्पत्ति से दूर त्रिकोण एक उत्पत्ति का सामना करने वाले लोगों के विपरीत संकेत के साथ मात्रा उत्पन्न करेंगे। इससे उत्पत्ति और आकार के बीच की मात्रा कुल में शामिल की जा सकती है, लेकिन फिर वापस घटाया जाता है, जिसके परिणामस्वरूप सही मात्रा होती है। – phkahler

+0

बहुत धन्यवाद अब मैं समझता हूं। –

2

एक बहुभुज जहाँ हम यह त्रिकोण में विभाजित और क्षेत्रों जोड़ सकते हैं के साथ इसी तरह,
आप पिरामिड में एक बहुतल विभाजित है और उनके संस्करणों योग कर सकता है। लेकिन मुझे यकीन नहीं है कि इसके लिए एल्गोरिदम लागू करना कितना मुश्किल है।

(मेरा मानना ​​है कि एक गणितीय रास्ता/सूत्र, वैक्टर और मैट्रिक्स का उपयोग कर की तरह होती है।
मैं http://mathoverflow.net पर भी अपने प्रश्न पोस्ट करने के लिए सुझाव)

0

सबसे पहले, नए किनारों खिंच कर त्रिभुजों में हर चेहरे टूट गया।

अब एक त्रिकोण देखें, और मान लीजिए कि यह "ऊपरी" सतह पर है (इनमें से कुछ विवरण बाद में महत्वहीन हो जाएंगे)। पोइहेड्रोन के नीचे कुछ क्षैतिज विमान तक, त्रिभुज के नीचे की मात्रा को देखें। यदि {एच 1, एच 2, एच 3} तीन बिंदुओं की ऊंचाई हैं, और ए आधार का क्षेत्र है, तो ठोस की मात्रा ए (एच 1 + एच 2 + एच 3)/3 होगी। अब हमें ऊपरी चेहरों के लिए इन ठोस पदार्थों की मात्रा जोड़नी है, और उन्हें निचले चेहरे के लिए पोएहेड्रॉन की मात्रा प्राप्त करने के लिए घटाएं।

बीजगणित के साथ खेलो और आप देखेंगे कि क्षैतिज विमान के ऊपर पॉलीहेड्रोन की ऊंचाई कोई फर्क नहीं पड़ता। विमान पॉलीहेड्रोन से ऊपर हो सकता है, या इसके माध्यम से गुजर सकता है, और नतीजा अभी भी सही होगा।

तो हमें क्या चाहिए (1) आधार के क्षेत्र की गणना करने का एक तरीका है, और (2) "निचले" से "ऊपरी" चेहरे को बताने का एक तरीका है। सबसे पहले आसान है यदि आपके पास अंक के कार्टेशियन निर्देशांक हैं, तो अंक आसान होने पर दूसरा आसान है, और आप उन्हें जोड़ सकते हैं और एक पत्थर से दो पक्षियों को मार सकते हैं। मान लीजिए कि प्रत्येक दास के लिए आपके विपरीत को क्रम में, अपने कोनों की एक सूची है। फिर एक्स-वाई विमान पर उन बिंदुओं का प्रक्षेपण एक ऊपरी चेहरे और दक्षिणावर्त के लिए दक्षिणावर्त के लिए विपरीत दिशा में होगा। यदि आप बेस के क्षेत्र की गणना करने के लिए this method का उपयोग करते हैं, तो यह ऊपरी चेहरे के लिए सकारात्मक होगा और निचले हिस्से के लिए नकारात्मक होगा, ताकि आप उन्हें सभी एक साथ जोड़ सकें और जवाब दे सकें।

तो आप कोनों की ऑर्डर सूची कैसे प्राप्त करते हैं? एक त्रिकोण के साथ शुरू करें, एक ऑर्डरिंग चुनें, और प्रत्येक किनारे के पड़ोसी जो किनारे को साझा करते हैं उन्हें उन दो बिंदुओं को विपरीत क्रम में सूचीबद्ध करना चाहिए। पड़ोसी से पड़ोसी तक चले जाओ जब तक कि आपके पास हर त्रिकोण के लिए कोई सूची न हो। यदि पॉलीहेड्रॉन की मात्रा नकारात्मक हो जाती है, तो केवल -1 से गुणा करें (इसका मतलब है कि आपने उस पहले त्रिकोण के लिए गलत क्रम चुना है, और पॉलीहेड्रॉन अंदरूनी था)।

संपादित करें: मैं सबसे अच्छा हिस्सा भूल गया! यदि आप इन वॉल्यूम को जोड़ने के लिए बीजगणित की जांच करते हैं, तो आप देखेंगे कि बहुत से शब्द रद्द हो जाते हैं, खासकर त्रिकोणों को मूल चेहरों में जोड़ते समय। मैंने इसे विस्तार से नहीं किया है, लेकिन ऐसा लगता है कि अंतिम परिणाम एक आश्चर्यजनक सरल कार्य हो सकता है।

1

मैंने पहले यह किया है, लेकिन सतह जाल मैंने हमेशा त्रिकोणीय पहलुओं का उपयोग किया था। यदि आपके जाल में त्रिकोणीय पहलू नहीं हैं, तो आप उन्हें आसानी से त्रिकोणीय पहलुओं में तोड़ सकते हैं। फिर मैंने इसे इंटीरियर के टेट्राहेड्राइजेशन प्राप्त करने के लिए TetGen पर खिलाया। अंत में, मैंने टेट्राहेड्रा के सभी खंडों को जोड़ा। TetGen उपयोग करने में काफी आसान है, और CGAL के अलावा एकमात्र लाइब्रेरी है, मुझे पता है कि जटिल मेस को संभाल सकता है। यदि आप एक विशाल पुस्तकालय स्थापित करने और पागल जैसे टेम्पलेट्स का उपयोग करने में कोई फर्क नहीं पड़ता है तो CGAL का उपयोग करना बहुत आसान है।

0

यहां पाइथन में इसके लिए एक संभावित कार्यान्वयन है। क्या कोई यह जांच सकता है कि यह सही है या नहीं? मुझे विश्वास है कि मुझे अंक की क्रमिकताएं याद आ रही हैं क्योंकि मेरा दूसरा परीक्षण (घन) 0.666 देता है और नहीं 1. किसी को भी विचार करता है?

चीयर्स ईएल

class Simplex(object): 
    ''' 
    Simplex 
    ''' 


    def __init__(self,coordinates): 
     ''' 
     Constructor 
     ''' 

     if not len(coordinates) == 4: 
      raise RuntimeError('You must provide only 4 coordinates!') 

     self.coordinates = coordinates 



    def volume(self): 
     ''' 
     volume: Return volume of simplex. Formula from http://de.wikipedia.org/wiki/Tetraeder 
     ''' 
     import numpy 

     vA = numpy.array(self.coordinates[1]) - numpy.array(self.coordinates[0]) 
     vB = numpy.array(self.coordinates[2]) - numpy.array(self.coordinates[0]) 
     vC = numpy.array(self.coordinates[3]) - numpy.array(self.coordinates[0]) 

     return numpy.abs(numpy.dot(numpy.cross(vA,vB),vC))/6.0 


class Polyeder(object): 

    def __init__(self,coordinates): 
     ''' 
     Constructor 
     ''' 

     if len(coordinates) < 4: 
      raise RuntimeError('You must provide at least 4 coordinates!') 

     self.coordinates = coordinates 


    def volume(self): 

     pivotCoordinate = self.coordinates[0] 

     volumeSum = 0 

     for i in xrange(1,len(self.coordinates)-3): 

      newCoordinates = [pivotCoordinate] 

      for j in xrange(i,i+3): 
       newCoordinates.append(self.coordinates[j]) 

      simplex = Simplex(newCoordinates) 
      volumeSum += simplex.volume() 

     return volumeSum 


coords = [] 

coords.append([0,0,0]) 
coords.append([1,0,0]) 
coords.append([0,1,0]) 
coords.append([0,0,1]) 

s = Simplex(coords) 
print s.volume() 

coords.append([0,1,1]) 
coords.append([1,0,1]) 
coords.append([1,1,0]) 
coords.append([1,1,1]) 

p = Polyeder(coords) 
print p.volume() 
संबंधित मुद्दे