अपने heplots पैकेज में, मैं एक बहुभिन्नरूपी रैखिक परीक्षण का प्रतिनिधित्व करने के लिए परिकल्पना और त्रुटि 3D दीर्घवृत्त की साजिश रचता हूं। मुझे लगता है कि जब एच दीर्घवृत्त वास्तव में केवल 2D होता है, तो मुझे एक अप्रिय मौआ प्रभाव मिलता है जैसा कि नीचे देखा गया है। ध्यान दें कि त्रुटि दीर्घवृत्त में यह दोष नहीं होता है।

इस मेगावाट में heplot3d को कॉल करने से कोई तार फ्रेम नहीं होता है लेकिन सतहों की पारदर्शी छायांकन का उपयोग होता है।

library(rgl)
library(heplots)
data(penguins, package="palmerpenguins")

peng <- penguins
peng.mod0 <-lm(cbind(bill_length, bill_depth, flipper_length, body_mass) ~ species, data=peng)
heplot3d(peng.mod0, shade=TRUE, shade.alpha=0.2, wire=FALSE, size="effect")

क्या इस समस्या से बचने के लिए इस फ़ंक्शन में कोड को संशोधित करने का कोई तरीका है? इसका क्या कारण होता है? क्या इसका सतहों के मानदंडों से कोई लेना-देना हो सकता है?

enter image description here

0
user101089 22 अक्टूबर 2020, 19:19

1 उत्तर

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

यहाँ समस्या यह है कि दीर्घवृत्त के आगे और पीछे के पृष्ठ एक ही तल में खींचे जा रहे हैं। जिस तरह से rgl पारदर्शी वस्तुओं को खींचता है, वह वस्तुओं को पीछे से सामने की ओर छांटने पर निर्भर करता है, लेकिन यह केवल ऐसा ही कर सकता है: उदा। दो प्रतिच्छेद करने वाले त्रिभुजों के विभिन्न भागों को अलग-अलग छँटाई की आवश्यकता होगी। आपके उदाहरण में, rgl फ्लैट दीर्घवृत्त के आगे और पीछे को सॉर्ट करने का प्रयास करता है, लेकिन संख्यात्मक त्रुटियों का मतलब है कि यह ड्राइंग क्रम को यादृच्छिक बनाता है, और चीजें वास्तव में बदसूरत दिखती हैं।

इससे बचने का सबसे आसान तरीका है back = "cull" का उपयोग कॉल में दीर्घवृत्त बनाने के लिए करना। तब पीठ बिल्कुल भी नहीं खींची जाएगी और चीजें बहुत बेहतर दिखेंगी।

वहाँ अभी भी समस्याएँ होंगी जहाँ दो दीर्घवृत्त प्रतिच्छेद करते हैं; जिसे ठीक करना अधिक कठिन है। आपको लाल दीर्घवृत्त को नीले रंग के प्रत्येक तरफ के भागों में तोड़ना होगा और उन्हें अलग से खींचना होगा। नीले रंग के उन हिस्सों को खींचना भी आवश्यक हो सकता है जो लाल रंग के अंदर हैं और बाहर के हिस्सों से अलग हैं। ये चीजें अब clipMesh3d फ़ंक्शन का उपयोग करके संभव हैं, लेकिन इसे ठीक करना कठिन है।

जोड़ने के लिए संपादित:

पारदर्शी दीर्घवृत्त बनाते समय depth_mask = FALSE सेट करना यहां एक बेहतर उपाय है। (यह एक अन्य भौतिक संपत्ति है, यह डिफ़ॉल्ट रूप से TRUE है।) यहां स्पष्टीकरण दिया गया है:

  • "गहराई का मुखौटा" यह निर्धारित करता है कि क्या किसी वस्तु को खींचने से बाद में खींची गई वस्तुओं को दिखाई देने से रोका जा सकेगा। अपारदर्शी वस्तुओं को हमेशा depth_mask = TRUE के साथ खींचा जाना चाहिए क्योंकि उन्हें हमेशा छिपाना चाहिए कि उनके पीछे क्या है।

  • पारदर्शी वस्तुओं के लिए किस सेटिंग का उपयोग करना है, यह तय करना कठिन है। क्योंकि उन्हें ड्राइंग से पहले क्रमबद्ध किया जाता है, गहराई मुखौटा कोई फर्क नहीं पड़ता, लेकिन क्योंकि छँटाई केवल अनुमानित है, कभी-कभी यह मदद करता है। आपके मामले में, आप दो आकृतियाँ बना रहे हैं जो गोलाई त्रुटि तक बिल्कुल समान गहराई पर हैं। depth_mask = TRUE के साथ, कभी-कभी दूसरा नहीं खींचा जाता है क्योंकि गोलाई त्रुटि इसे और दूर दिखती है। यदि आप depth_mask = FALSE सेट करते हैं, तो दोनों हमेशा खींचे जाएंगे, और दीर्घवृत्त बेहतर दिखाई देंगे। यह सभी आकृतियों के लिए सही नहीं है, लेकिन इस मामले में यह काम करता है।

  • मैंने जो कुछ गणनाएँ की हैं, वे सुझाव देते हैं कि depth_mask = TRUE जब भी alpha > 0.5, और depth_mask = FALSE छोटे alpha मानों का उपयोग करें।

1
user2554330 25 अक्टूबर 2020, 13:13