সিজিএল 2 জ্যামিতি সংযুক্ত করছে


11

বর্তমানে আমি জালের বিভিন্ন অংশে যোগ দেওয়ার চেষ্টা করছি, যা সংযুক্ত নয়। উদাহরণ থেকে আমি এটি পেয়েছি (blobby_3cc.off)।

সঙ্গে keep_large_connected_componentsএবং keep_largest_connected_componentsআমি সব ক্ষুদ্রতর উপাদান মুছে ফেলুন। যা এই 3 নীচে রাখে।

ডকুমেন্টেশনে আমি তাদের সাথে যোগদানের এবং নিখোঁজ অংশগুলি পূরণ করার কোনও উপায় খুঁজে পাচ্ছি না। একটি সমাধান হ'ল 1 ত্রিভুজ তৈরি করা এবং গর্তগুলি পূরণ করা (তারপরে এটি 1 টি বস্তু, প্রচুর গর্ত সহ)। তবে আমি এইগুলিতে একসাথে যোগদানের উপায় খুঁজে পাচ্ছি না।

কারও কি এর সমাধান আছে?

আমি সি ++ এর জন্য সিজিএল ব্যবহার করছি।

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


3

আমি যখন সিজিএল দিয়ে শুরু করেছি তখন আমি প্রায় সাথে সাথেই এই সমস্যার মধ্যে পড়েছিলাম। বহুভুজ জাল ডকুমেন্টেশন সাবধানে পড়ার পরে আমি একটি সমাধান খুঁজে পেতে সক্ষম হয়েছি । মূলত, কোরাইফাইনমেন্টের পরিবর্তিত সংস্করণের মাধ্যমে , আপনি সহজেই দুটি পৃথক জ্যামিতি একসাথে জাল করতে পারেন, তাদের পলি গণনা বা আকার নির্বিশেষে (তবে, বহুভুজের পার্থক্য যত বেশি হবে তত কম কার্যকর হবে)।

আপনাকে প্রথমে যা করতে হবে তা নিশ্চিত করুন জ্যামিতিটি স্ব-ছেদ না করেছে। দ্বিতীয়ত, নিশ্চিত করুন যে CGAL::Polygon_mesh_processing::clip()দুটি জ্যামিতিতে সক্রিয় রয়েছে (আমি এটি ব্যবহারের পরামর্শ দিই close_volumes=false)। এরপরে, দুটি নতুন মেসের মিলন গণনা করুন:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/corefinement.h>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3>             Mesh;
namespace PMP = CGAL::Polygon_mesh_processing;
int main(int argc, char* argv[])
{
  const char* filename1 = (argc > 1) ? argv[1] : "data/blobby.off";
  const char* filename2 = (argc > 2) ? argv[2] : "data/eight.off";
  std::ifstream input(filename1);
  Mesh mesh1, mesh2;
  if (!input || !(input >> mesh1))
  {
    std::cerr << "First mesh is not a valid off file." << std::endl;
    return 1;
  }
  input.close();
  input.open(filename2);
  if (!input || !(input >> mesh2))
  {
    std::cerr << "Second mesh is not a valid off file." << std::endl;
    return 1;
  }
  Mesh out;
  bool valid_union = PMP::corefine_and_compute_union(mesh1,mesh2, out);
  if (valid_union)
  {
    std::cout << "Union was successfully computed\n";
    std::ofstream output("union.off");
    output << out;
    return 0;
  }
  std::cout << "Union could not be computed\n";
  return 1;
}

সঠিক নির্মাণের সাথে কার্নেল থেকে বিন্দুর সাহায্যে জাল ব্যবহার করার পরিবর্তে, সঠিক পয়েন্টগুলি জাল শীর্ষকের একটি সম্পত্তি যা আমরা পরবর্তী ক্রিয়াকলাপগুলিতে পুনরায় ব্যবহার করতে পারি। এই সম্পত্তি সহ, আমরা ভাসমান পয়েন্ট স্থানাঙ্কযুক্ত পয়েন্টগুলি সহ একটি জাল সামাল দিতে পারি তবে সঠিক নির্মাণের দ্বারা সরবরাহ করা দৃ rob়তা থেকে উপকৃত হতে পারি .:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/corefinement.h>
#include <fstream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Exact_predicates_exact_constructions_kernel EK;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
typedef Mesh::Property_map<vertex_descriptor,EK::Point_3> Exact_point_map;
typedef Mesh::Property_map<vertex_descriptor,bool> Exact_point_computed;
namespace PMP = CGAL::Polygon_mesh_processing;
namespace params = PMP::parameters;
struct Coref_point_map
{
  // typedef for the property map
  typedef boost::property_traits<Exact_point_map>::value_type value_type;
  typedef boost::property_traits<Exact_point_map>::reference reference;
  typedef boost::property_traits<Exact_point_map>::category category;
  typedef boost::property_traits<Exact_point_map>::key_type key_type;
  // exterior references
  Exact_point_computed* exact_point_computed_ptr;
  Exact_point_map* exact_point_ptr;
  Mesh* mesh_ptr;
  Exact_point_computed& exact_point_computed() const
  {
    CGAL_assertion(exact_point_computed_ptr!=NULL);
    return *exact_point_computed_ptr;
  }
  Exact_point_map& exact_point() const
  {
    CGAL_assertion(exact_point_ptr!=NULL);
    return *exact_point_ptr;
  }
  Mesh& mesh() const
  {
    CGAL_assertion(mesh_ptr!=NULL);
    return *mesh_ptr;
  }
  // Converters
  CGAL::Cartesian_converter<K, EK> to_exact;
  CGAL::Cartesian_converter<EK, K> to_input;
  Coref_point_map()
    : exact_point_computed_ptr(NULL)
    , exact_point_ptr(NULL)
    , mesh_ptr(NULL)
  {}
  Coref_point_map(Exact_point_map& ep,
                  Exact_point_computed& epc,
                  Mesh& m)
    : exact_point_computed_ptr(&epc)
    , exact_point_ptr(&ep)
    , mesh_ptr(&m)
  {}
  friend
  reference get(const Coref_point_map& map, key_type k)
  {
    // create exact point if it does not exist
    if (!map.exact_point_computed()[k]){
      map.exact_point()[k]=map.to_exact(map.mesh().point(k));
      map.exact_point_computed()[k]=true;
    }
    return map.exact_point()[k];
  }
  friend
  void put(const Coref_point_map& map, key_type k, const EK::Point_3& p)
  {
    map.exact_point_computed()[k]=true;
    map.exact_point()[k]=p;
    // create the input point from the exact one
    map.mesh().point(k)=map.to_input(p);
  }
};
int main(int argc, char* argv[])
{
  const char* filename1 = (argc > 1) ? argv[1] : "data/blobby.off";
  const char* filename2 = (argc > 2) ? argv[2] : "data/eight.off";
  std::ifstream input(filename1);
  Mesh mesh1, mesh2;
  if (!input || !(input >> mesh1))
  {
    std::cerr << "First mesh is not a valid off file." << std::endl;
    return 1;
  }
  input.close();
  input.open(filename2);
  if (!input || !(input >> mesh2))
  {
    std::cerr << "Second mesh is not a valid off file." << std::endl;
    return 1;
  }
  Exact_point_map mesh1_exact_points =
    mesh1.add_property_map<vertex_descriptor,EK::Point_3>("e:exact_point").first;
  Exact_point_computed mesh1_exact_points_computed =
    mesh1.add_property_map<vertex_descriptor,bool>("e:exact_points_computed").first;
  Exact_point_map mesh2_exact_points =
    mesh2.add_property_map<vertex_descriptor,EK::Point_3>("e:exact_point").first;
  Exact_point_computed mesh2_exact_points_computed =
    mesh2.add_property_map<vertex_descriptor,bool>("e:exact_points_computed").first;
  Coref_point_map mesh1_pm(mesh1_exact_points, mesh1_exact_points_computed, mesh1);
  Coref_point_map mesh2_pm(mesh2_exact_points, mesh2_exact_points_computed, mesh2);
  if ( PMP::corefine_and_compute_intersection(mesh1,
                                              mesh2,
                                              mesh1,
                                              params::vertex_point_map(mesh1_pm),
                                              params::vertex_point_map(mesh2_pm),
                                              params::vertex_point_map(mesh1_pm) ) )
  {
    if ( PMP::corefine_and_compute_union(mesh1,
                                         mesh2,
                                         mesh2,
                                         params::vertex_point_map(mesh1_pm),
                                         params::vertex_point_map(mesh2_pm),
                                         params::vertex_point_map(mesh2_pm) ) )
    {
      std::cout << "Intersection and union were successfully computed\n";
      std::ofstream output("inter_union.off");
      output << mesh2;
      return 0;
    }
    std::cout << "Union could not be computed\n";
    return 1;
  }
  std::cout << "Intersection could not be computed\n";
  return 1;
}


ধন্যবাদ তোমার উত্তরের জন্য. আমি আপনার কোড বুঝতে চেষ্টা, কিন্তু কিছু ফাংশন আমি বুঝতে বলে মনে হচ্ছে না corefine_and_compute_union, corefine_and_compute_intersection। আমি ডক্সে কোনও স্পষ্ট বোঝা পাচ্ছি না। আপনি কিছুটা ব্যাখ্যা করতে পারেন?
নীলস

মূলত, corefine_and_compute_unionজালটি ওভারল্যাপের কয়েকটি অংশ গণনা করে এবং বহুভুজ ফিল দিয়ে অপসারণ ও প্রতিস্থাপন করা দরকার। corefine_and_compute_intersectionএকই জিনিসটির কাছে, তবে একটি মসৃণ জাল পূরণের পরিবর্তে কাটাটি পূরণ করতে বিদ্যমান জাল ব্যবহার করে uses প্রথম ফাংশনটি সাধারণত কাজ করার জন্য একটি সঠিক ইনপুট প্রয়োজন, তবে দ্বিতীয়টি এটি প্যারামিটার হিসাবে নিজেকে পাস করার অনুমতি দেয়।
ডেথ ওয়াল্টজ

আমাকে এই সপ্তাহান্তে এটি পরীক্ষা করে দেখতে হবে এবং ফলাফলটি দেখতে হবে যাতে আমি জানি যে এটি কীভাবে কাজ করে। অনুগ্রহ শেষ হওয়ার আগেই আমি এই উত্তরটিকে সঠিক উত্তর হিসাবে গ্রহণ করব।
নীলস

ঠিক আছে, যদি এটি কাজ না করে তবে আমাকে জানান
ডেথ ওয়াল্টজ

0

জালটি মূলত কেমন দেখাচ্ছে? ক্ষুদ্রতম অংশগুলি বাদ দেওয়ার পরিবর্তে বিভিন্ন উপাদানগুলিকে একত্রিত করা কি সম্ভব হবে? দেখুন CGAL combinatorical মেরামত আরও তথ্যের জন্য।

বিভিন্ন উপাদান সংযোগ একটি বরং কঠিন সমস্যা। আমি বিশ্বাস করি যে নিয়মিত গর্ত ভর্তি অ্যালগরিদমগুলি কেবল আবদ্ধ গর্তগুলিতেই কাজ করে, অর্থাত একটি খোলা প্রান্ত রয়েছে যা গর্তটির চারপাশে যায় এবং শুরুতে শেষ হয়।

আমার প্রস্তাবটি হ'ল জাল বিশ্লেষণ করার জন্য খোলা প্রান্ত-তালিকাগুলি যাতে সংযুক্ত হওয়া দরকার, যেমন, লাল, সবুজ, নীল এবং বেগুনি রেখাগুলি খুঁজে পাওয়া যায়। এগুলিকে একে অপরের সাথে যুক্ত করার একটি উপায় খুঁজুন, যেমন রেগ-সবুজ এবং নীল-বেগুনি। উদাহরণস্বরূপ জুটি বাঁধার জন্য প্রান্তগুলির গড় ব্যবহার করা যথেষ্ট should

তারপরে আপনার প্রান্তগুলির মধ্যে ব্যবধানটি ত্রিভঙ্গ করতে কিছু পদ্ধতি প্রয়োজন। যেমনটি আপনি উল্লেখ করেছেন, অংশগুলি সংযোগের জন্য এটি একটি ত্রিভুজ (বা দুটি) তৈরি করার জন্য যথেষ্ট এবং সিজিএল :: বহুভুজ_মেশ_প্রসেসিং :: ত্রিভুজুলেট_প্রেমী_আর_ফায়ার_হোলের মতো বাকী অংশটি ব্যবহার করতে হবে।

এটি করার জন্য আপনি একে অপরের নিকটে থাকা প্রতিটি তালিকার দুটি প্রান্তটি সন্ধান করার চেষ্টা করতে পারেন। অর্থাত্ পয়েন্ট দূরত্বের যোগফল যতটা সম্ভব ছোট। সুতরাং একটি তালিকা থেকে একটি প্রান্ত বাছাই করুন এবং অন্যটির নিকটতম প্রান্তটি সন্ধান করুন। যখন আপনার দুটি প্রান্ত রয়েছে, তখন একটি জোড়া ত্রিভুজ যুক্ত করুন এবং বাকীটি পূরণ করতে CGAL ব্যবহার করুন। এটি কাজ করার জন্য বিভিন্ন অংশগুলির একই পৃষ্ঠের ওরিয়েন্টেশন হওয়া উচিত, তবে সম্ভবত এটিই সম্ভব।

আরেকটি উপায় হ'ল বিন্দু মেঘ থেকে জাল তৈরির জন্য কেবল শীর্ষগুলি ব্যবহার করা হবে তবে এটি আপনার বর্তমান জালটির সাথে মেলে এমন গ্যারান্টিযুক্ত নয়। সবচেয়ে সহজ সমাধানটি সম্ভবত সমস্যাটি সম্পূর্ণরূপে এড়াতে চেষ্টা করা, অর্থাত্ জালগুলির উত্সটি নিশ্চিত হওয়া সংযুক্ত মেসগুলি উত্পাদন করে তা নিশ্চিত করা।

কানেক্ট করার জন্য প্রান্তের উদাহরণ


আপনার জবাবের জন্য আপনাকে ধন্যবাদ, এটি প্রকৃতপক্ষে সেই পদ্ধতির যা আমি কিছুক্ষণের জন্য কাজ করে চলেছি, আমি প্রায় প্রোগ্রামিং শেষ করেছি, বর্তমানে ভুল দিকগুলির সাথে মুখগুলি নিয়ে সমস্যা রয়েছে তাই ভরাট ছিদ্রগুলি ব্যর্থ হয়।
নীলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.