मैं नीचे दिए गए कोड को समझने की कोशिश कर रहा हूं, यह एक ऐसी संरचना के लिए है जो पॉइंटक्लाउड में XYZ और तीव्रता मान रखती है, फ़ील्ड PCL_ADD_POINT4D एक स्टैंडअलोन स्टेटमेंट की तरह दिखता है जो किसी भी ज्ञात प्रकार का नहीं है, इसका क्या अर्थ है? क्या यह सामग्री को संबोधित करने का एक तरीका है?

struct EIGEN_ALIGN16 _PointXYZI
   {
    PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
     union
     {
       struct
       {
         float intensity;
       };
       float data_c[4];
     };
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
   };



इस से है http://docs.ros.org/hydro/api/ pcl/html/point__types_8hpp_source.html#l00382

PCL_ADD_POINT4D क्या है और क्या कोई स्पष्ट कारण है कि intensity को एक स्ट्रक्चर में होना चाहिए। चीयर्स।

संपादित करें:

जैसा कि @बीटा ने बताया है PCL_ADD_POINT4D यहां से आता है

किसी स्ट्रक्चर के अंदर intensity का होना अभी भी अजीब है। (यदि इसका कोई वैध कारण है तो मैं प्रश्न को खुला छोड़ दूंगा)

0
Ganindu 12 अगस्त 2020, 19:19

2 जवाब

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

भाग 1: PCL_ADD_POINT4D मैक्रो को संदर्भित करता है

PCL_ADD_POINT4D निम्नलिखित पंक्तियों को संदर्भित करता है

 #define PCL_ADD_POINT4D \
   union EIGEN_ALIGN16 { \
     float data[4]; \
     struct { \
       float x; \
       float y; \
       float z; \
     }; \
   }; \

यहाँ EIGEN_ALIGN16 एक SSE मैक्रो है जो पॉइंट ऑपरेशंस को ऑप्टिमाइज़ करने में मदद करता है क्योंकि वे हैं आमतौर पर हम इन संदर्भों में परिभाषित प्रकार के वैक्टर (हमारे मामले में बिंदु वैक्टर/बादल) पर लागू होते हैं।

स्रोत फ़ाइल का लिंक यहां है

भाग 2: एक चर रखने के लिए संरचना

मुझे लगता है कि यह किसी भी चीज़ से अधिक एक आकर्षक डिज़ाइन पैटर्न चीज़ है, मुझे इसकी आदत हो गई है क्योंकि मेरी आँखें उत्कृष्ट पीसीएल लाइब्रेरी और अधिक।

स्ट्रक्चर्स में सदस्यों को क्रम में आसन्न मेमोरी स्थानों में संग्रहीत किया जाता है, और यूनियनों में सभी सदस्य एक ही स्थान पर शुरू होते हैं और एक अतिव्यापी प्रकृति होती है (एक लंबी स्ट्रिंग बनाने के लिए विभिन्न आकार (लंबाई के अनुसार) स्ट्रिंग्स के संयोजन की कल्पना करें [स्ट्रक्चर] बनाम अलग-अलग लंबाई के तार लटकाएं (या रस्सियाँ) एक बिंदु [संघ] से, संघ के मामले में पूरी चीज़ की लंबाई स्ट्रिंग के सबसे लंबे टुकड़े की लंबाई होगी।

हम अपने नए प्रकारों को एक अच्छा कॉम्पैक्ट लुक देने के लिए इन सुविधाओं का फायदा उठा सकते हैं और ठीक यही पीसीएल के लेखकों ने किया है।

struct point_xyz{
    union{
        float x;
        float y;
        float z;
        float padding; // redundant with data[4] already taking care of it
    };
    float data[4];
};

अगर हम एक point_xyz को उदाहरण के रूप में तत्काल करते हैं। point1 हम इसके सदस्यों को point1.data[0] या point1.x के माध्यम से एक्सेस कर सकते हैं, साथ ही हम .data का उपयोग करके इस तरह से इसे पसंद करने वाले कार्यों के लिए पूरे बिंदु को पास कर सकते हैं।

तो यह मूल प्रश्न के लिए कैसे प्रासंगिक है?

मुझे लगता है कि ऐसा इसलिए है क्योंकि इस बिंदु प्रकार संरचना परिभाषा पीसीएल स्रोत के साथ नियमित रूप से दिखाई देती है और तीव्रता की घोषणा करते समय उसी ब्लूप्रिंट का उपयोग आंखों पर आसान होने के लिए किया जाता था।

1
Ganindu 20 अगस्त 2020, 19:53

PCL_ADD_POINT4D एक मैक्रो है जिसे पंक्ति 144 में परिभाषित किया गया है वही फ़ाइल. तथ्य यह है कि यह बड़े अक्षरों में है, हमें पहले से ही एक सुराग देता है।

और मुझे कोई कारण नहीं दिख रहा है कि intensity को कंपाइलर विशिष्ट कारणों के अलावा, अज्ञात संरचना में क्यों होना चाहिए।

1
Miguel 12 अगस्त 2020, 19:37