تحميل نموذج إلى بنية بيانات نصف حافة من ملف .ply

StackOverflow https://stackoverflow.com/questions/556095

  •  05-09-2019
  •  | 
  •  

سؤال

أحاول بناء محلل. محظور لتحميل نماذج ثلاثية الأبعاد مخزنة كملفات .ply في شبكة بنية بيانات نصف حافة.

آسف على السؤال الهائل، أنا غذر جدا وأردت أن أتأكد من أنني وضعت جميع التفاصيل. ولهذا السبب، سأكرر أهدافي النهائية على الفور، فقط حتى يتمكن المستخدمون من رؤية فكرة عما أريده قبل قراءة الكتلة العملاقة من النص المتابعين.

1) ماذا سيكون تجزئة جيدة لنمذت حواف نصف من قمة الملفات ووجه الملفات .ply

أو

2) هل هناك نهج أفضل لملء بنية نصف حافة من البيانات في ملف .ply؟


يسرد الملف .ply القمم، تليها وجوه الشبكة. الحل الواضح هو ملء جدول الرأس أولا، ثم قم بإنشاء جدول EDGE باستخدام قائمة الوجوه. المشكلة هي أن كل حافة لديها حافة شريكة، لذلك بالنسبة لشبكة رباعية، فإن أول رباعية أحملها سيتطلب 8 حواف نصف. هذه ليست مشكلة في البداية، ما عليك سوى إنشاء أربع حواف للوجه وعكس كل حافة لجعل شريكها نصف حافة. المشكلة هنا هي أن هذا يخلق 4 حواف نصف متدلية مرتبطة ب 4 وجوه مختلفة.

لذلك هناك طريقتان للهجوم: تولد أولا جميع الحواف للوجوه، ثم حاول إقران حواف الشريك. أنا حقا لا أحب هذا النهج، يبدو أقل كفاءة برمجيا لأنه سيتضمن الكثير من البحث والفرز.

ثانيا: تابع كإعلان أولا: ابدأ بالوجه الأول المحدد وإنشاء الحواف المطلوبة لإنشاء المضلع، وكما يتم إنشاء الحواف أيضا إنشاء توائم أيضا. ومع ذلك، سننذذ قائمة الحافة، لذلك سوف تجزئة جميع الحواف في جدول. بعد ذلك، عندما نقوم بإنشاء حواف للوجوه الأخرى، إذا تم إنشاء حافة بالفعل (لأنه حافة شريكة لوجه محمل سابق)، فسوف نقوم ببساطة بالاستيلاء على المؤشر من الجدول.

هذا هو المكان الذي عالق. أحتاج إلى وظيفة تجزئة ذكية لنمذ قائمة EDGE. يجب تقليل الاصطدامات لزيادة الكفاءة. إن المخطط الذي لدي في الاعتبار الآن هو تسمية * حواف بناء على القممتين التي أنشأتها، أي حواف 01 و 10 توأمان. سيقوم سيناريو الحالة الأسوأ بإنشاء جدول تجزئة يمكن أن ينضم فيها جميع القمم، وهذا ينتهي بك الأمر إلى حجم 2 ^ n حيث n = عدد القمم، وهو أمر غير مقبول تماما. هدفي هو الحصول على التجزئة أقرب إلى عدد الحواف الفعلية (= مجموع عدد الحواف لكل وجه) في حين لا يزال تقليل التصادمات.

* ملاحظة: نظرا لأن حواف نصف فرض مخطط رسم "عكس اتجاه عقارب الساعة فقط"، فمن غير الممكن الحصول على تصادم اسم. من خلال تسمية الحواف بناء على الرأسين الذي يسحبونها، فإننا نؤمن أن جميع الأسماء فريدة من نوعها إلى نصف حافة واحدة.

هل كانت مفيدة؟

المحلول

أنا فيلبوس جدا

قد ترغب في شيء عن ذلك.

طريقة تافهة للحصول على حافة هي فهارس مؤشراتها. لجعلها فريدة من نوعها تأخذ الفهرس الأصغر أولا والمؤشر الأكبر الثاني. شيء من هذا القبيل:

uint hash(const Vertex& v1, const Vertex& v2)
{
    int i1 = v1.index;
    int i2 = v2.index;
    if (i1 > i2)
        swap(i1, i2);
    return (i1 | (i2 << 16));
}

في البيانات الفعلية المدببة بواسطة جدول التجزئة هذا، من المحتمل أن ترغب في تتبع الزوج الذي رأيته بالفعل وعدم وجود زوج (المقابل) الذي تتوقعه.

نصائح أخرى

هل تخزن المؤشرات أو المراجع في الحافة؟ إذا كنت تستخدم incides، فلن تشبه وظيفة التجزئة تافهة

19 * index0 + 7 * index1

أن تكون "جيدة بما فيه الكفاية"؟ إذا كان من المفترض أن يكون التجزئة متماثل، فسأذهب ل XOR بسيطة من المؤشرين، ولكن كحبع نصف موجه بالفعل، فمن المحتمل أن تكون أفضل حالا باستخدام تجزئة غير متماثلة وتبحث على وجه التحديد إلى اتجاه الحافة المقترنة.

بصفتها في الواقع مقارنة الحواف هي عملية رخيصة نسبيا (أي أرخص من توليد التجزئة المعقدة)، فإن الاكتسامات ليست فظيعة كما تصبح بها تبدو.

وهذا هو، في تجربتي. على استعداد للحرق من قبل خبراء الجمع الحقيقي هنا. :-)

كإصدار SIDENOTE: قد ترغب في التأكد من أن تنفيذك القابل للانفجار الخاص بك هو لائق مع حذف، لأنه قد يؤدي إلى إزالة أي حافة مقترنة تجدها من الجدول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top