سؤال

كيف يمكنني استخدام فئة موروثة من التثليث في سياق التثليث في CGAL؟

في الأساس لدي الكود التالي:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

typedef CGAL::Triangulation_vertex_base_with_info_2<int,K> Vb;
typedef CGAL::Triangulation_face_base_with_info_2<int,K>   Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb>        Tds;
typedef CGAL::Delaunay_triangulation_2<K,Tds>              Delaunay;
typedef CGAL::Triangulation_2<K,Tds>                       Triangulation;

typedef Triangulation::Point Point;

...

Triangulation *t = new Delaunay;

...

// x and y are properly defined and instantiated
t->insert(Point(x,y));

حسنًا، بالطبع، Delaunay_triangulation_2 يرث من Triangulation_2

لذلك، عندما أقوم بتنفيذ هذا الكود، يتم الارتباط مقابل فئة Triangulation_2، بمعنى آخر، لا ينفذ تثليثًا متأخرًا، بدلاً من ذلك ينفذ تثليثًا عاديًا (تنفيذ أساليب الفئة الأصلية بدلاً من الأساليب الفرعية).

أعتقد أن السبب في ذلك هو أن طريقة الإدراج الخاصة بـ Triangulation_2 لم يتم الإعلان عنها على أنها افتراضية، لذا لن تنجح عمليات إعادة التعريف.

هل تعرف طريقة للتغلب على هذا؟ربما تستخدم Constrained_triangulation_2 وConstrained_delaunay_triangulation_2؟(تحدد هذه الفئات بعض الأساليب الافتراضية، لكنني قرأت الكود المصدري ولا أعتقد أنه يمكن استخدامها دون إضافة القيود الصريحة)

أيه أفكار؟

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

المحلول

لقد تحققت من برنامجك، ستحتاج إلى إعادة تنسيقه قليلاً، بحيث يناسب نموذج البرمجة العام.اسمحوا لي أن أتذكر ما يفعله الكود الخاص بك (الكود المتوفر على جيثب):

  1. يقرأ سطر الأوامر
  2. اعتمادًا على الخيارات، يتم إنشاء مثيل للتثليث أو Delaunay_triangulation على الكومة
  3. يستخدم هذا الكائن لبعض المعالجة، على افتراض أن الأساليب افتراضية (لكنها ليست كذلك)

سيكون حل مشكلتك هو وضع الخطوة 3 بطريقة منفصلة، ​​مع نوع التثليث كمعلمة قالب.شيء من هذا القبيل (أستخدم أنواعك وأسماءك):

template < class Triangulation >
void compute_mesh(int n_vertices, int max_x, int max_y)
{
    Triangulation t;
    // DO WHATEVER YOU WANT WITH t
}

بعد ذلك، في وظيفتك الرئيسية، يمكنك تشغيل استخدام مثلثات ديلوناي أو مثلثات غير ديلوناي بالطريقة التالية:

if (triang_type == 'D') 
    compute_mesh<Delaunay>(n_vertices, max_x, max_y);
else 
    compute_mesh<Triangulation>(n_vertices, max_x, max_y);

نصائح أخرى

هل أنت متأكد من هذه الوظائف هي افتراضية؟ بدونها يجري تعريف الظاهري فإن المترجم لن باستدعاء وظائف فئة مشتقة.

ومن نظرة خاطفة على رؤوس CGAL لا يبدو أن هذه الفئات لديها أي وظائف افتراضية على الإطلاق.

وCGAL يستخدم البرمجة العامة، وليس وظائف افتراضية. انه يشبه STL، فقط المجال هو قليلا أكثر صعوبة، وتحتاج إلى الاعتماد أكثر على خوارزميات من يفعل عادة مع المحكمة الخاصة بلبنان.

وأنا لا أستطيع أن أقول حقا، ما هو الحل لمشكلتك، لأنك قدمت مجرد قصاصة صغيرة من شفرة، ولكن حاول استبدال

Triangle *t = new Delaunay;

مع

Triangulation *t = new Delaunay;

أولا. إذا كان لا يساعد، يرجى إضافة المزيد من التفاصيل من تعريفات نوع الخاصة بك.

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