Arrangement_2 IO problem

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Arrangement_2 IO problem

Paul Neugebauer
Hi list,

I have got a strange problem with the Arrangement_2 IO. Here is a part
of my program:

    ...
    Naive_pl    naive_pl(arr);

        point_location_query(naive_pl, source);

    // Write the arrangement to a file
    std::ofstream    out_file("output/arr_io.dat");
    Formatter    formatter;

    write(arr, out_file, formatter);
    out_file.close();

    // Read the arrangement from a file
    std::ifstream in_file2("output/arr_io.dat");
    Arrangement_2    arr2;

    read(arr2, in_file2, formatter);
    in_file2.close();
    assert(arr2.is_valid());

    Naive_pl    naive_pl2(arr2);

        point_location_query(naive_pl2, source);
    ...

The ouput is: The point is located inside the UNBOUNDED face
                        The point is located inside the BOUNDED face

But it is the same point: source
If I use naive_pl for the second point_location_query again, like this:

        point_location_query(naive_pl, source);

everything is ok.

Any idea anybody ?

Thanks,
paul



--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://lists-sop.inria.fr/wws/info/cgal-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Arrangement_2 IO problem

efif
It's seems like a bug. Probably in the writing to or reading from a
file. Can you confirm?

Paul Neugebauer wrote:

> Hi list,
>
> I have got a strange problem with the Arrangement_2 IO. Here is a part
> of my program:
>
>    ...
>    Naive_pl    naive_pl(arr);
>
>        point_location_query(naive_pl, source);
>
>    // Write the arrangement to a file
>    std::ofstream    out_file("output/arr_io.dat");
>    Formatter    formatter;
>
>    write(arr, out_file, formatter);
>    out_file.close();
>
>    // Read the arrangement from a file
>    std::ifstream in_file2("output/arr_io.dat");
>    Arrangement_2    arr2;
>
>    read(arr2, in_file2, formatter);
>    in_file2.close();
>    assert(arr2.is_valid());
>
>    Naive_pl    naive_pl2(arr2);
>
>        point_location_query(naive_pl2, source);
>    ...
>
> The ouput is: The point is located inside the UNBOUNDED face
>                        The point is located inside the BOUNDED face
>
> But it is the same point: source
> If I use naive_pl for the second point_location_query again, like this:
>
>        point_location_query(naive_pl, source);
>
> everything is ok.
>
> Any idea anybody ?
>
> Thanks,
> paul
>
>
>
--
   ____  _        ____             _
  /_____/_) o    /__________  __  //
 (____ (   (    (    (_/ (_/-(-'_(/
                         _/



----------------------------------------------------------------------------
This e-mail message may contain information which is CONFIDENTIAL, privileged or proprietary to Lucidlogix Technologies, Ltd. and is subject to restrictions on disclosure and use. If you have received this e-mail message in error, please notify the sender immediately by telephone or e-mail and destroy the original message without making a copy. Thank you.
----------------------------------------------------------------------------
--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://lists-sop.inria.fr/wws/info/cgal-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Arrangement_2 IO problem

Paul Neugebauer
Yes, I think you are right. It is a writing or reading problem. As you
can see this is from examples/Arrangement_2/io.cpp but modified. I have
marked the little modification. I just try to write the arr2 to a file
again. I always get a Segmentation fault (core dumped).

//! \file examples/Arrangement_2/io.cpp
// Using the arrangement I/O operators.

#include "arr_rational_nt.h"
#include <CGAL/Cartesian.h>
#include <CGAL/Arr_segment_traits_2.h>
#include <CGAL/Arrangement_2.h>
#include <CGAL/IO/Arr_iostream.h>
#include <fstream>

#include "point_location_utils.h"

typedef CGAL::Cartesian<Number_type>                  Kernel;
typedef CGAL::Arr_segment_traits_2<Kernel>            Traits_2;
typedef CGAL::Arrangement_2<Traits_2>                 Arrangement_2;

int main ()
{
  // Construct the arrangement.
  Arrangement_2    arr;

  construct_segments_arr (arr);

  std::cout << "Writing an arrangement of size:" << std::endl
            << "   V = " << arr.number_of_vertices()
            << ",  E = " << arr.number_of_edges()
            << ",  F = " << arr.number_of_faces() << std::endl;

  // Write the arrangement to a file.
  std::ofstream    out_file ("arr_ex_io.dat");

  out_file << arr;
  out_file.close();

  // Read the arrangement from the file.
  Arrangement_2    arr2;
  std::ifstream    in_file ("arr_ex_io.dat");

  in_file >> arr2;
  in_file.close();

  std::cout << "Read an arrangement of size:" << std::endl
            << "   V = " << arr2.number_of_vertices()
            << ",  E = " << arr2.number_of_edges()
            << ",  F = " << arr2.number_of_faces() << std::endl;

  //+++++++++++++++++++modified +++++++++++++++++++++++++
  // Write the arrangement to a file2.
  std::ofstream    out_file2 ("arr_ex_io2.dat");

  std::cout << "still ok" << std::endl;
  out_file2 << arr2;
  std::cout << "not ok" << std::endl;

  out_file2.close();
  //+++++++++++++++++++modified +++++++++++++++++++++++++

  return (0);
}

I hope this helps!

I use CGAL 3.3-2 from the ubuntu packages.

paul


Efi Fogel schrieb:

> It's seems like a bug. Probably in the writing to or reading from a
> file. Can you confirm?
>
> Paul Neugebauer wrote:
>> Hi list,
>>
>> I have got a strange problem with the Arrangement_2 IO. Here is a
>> part of my program:
>>
>>    ...
>>    Naive_pl    naive_pl(arr);
>>
>>        point_location_query(naive_pl, source);
>>
>>    // Write the arrangement to a file
>>    std::ofstream    out_file("output/arr_io.dat");
>>    Formatter    formatter;
>>
>>    write(arr, out_file, formatter);
>>    out_file.close();
>>
>>    // Read the arrangement from a file
>>    std::ifstream in_file2("output/arr_io.dat");
>>    Arrangement_2    arr2;
>>
>>    read(arr2, in_file2, formatter);
>>    in_file2.close();
>>    assert(arr2.is_valid());
>>
>>    Naive_pl    naive_pl2(arr2);
>>
>>        point_location_query(naive_pl2, source);
>>    ...
>>
>> The ouput is: The point is located inside the UNBOUNDED face
>>                        The point is located inside the BOUNDED face
>>
>> But it is the same point: source
>> If I use naive_pl for the second point_location_query again, like this:
>>
>>        point_location_query(naive_pl, source);
>>
>> everything is ok.
>>
>> Any idea anybody ?
>>
>> Thanks,
>> paul
>>
>>
>>

--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://lists-sop.inria.fr/wws/info/cgal-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Arrangement_2 IO problem

David Keller-3
Hi,
This seems to be the same bug I posted on 3/28/2008 on this list. Later
on, I proposed a solution in the form of a patch which I attach to this
message again. Hope it helps, please let me know.

By the way, @Efi Fogel: On 4/17/2008 I pointed out another issue in
overlaying arrangements with partially equal curves. Did you in the
meanwhile find the time to have a closer look at it? I'm still lost
there. Thanks for your help.

Kind regards
David Keller

Paul Neugebauer wrote:

> Yes, I think you are right. It is a writing or reading problem. As you
> can see this is from examples/Arrangement_2/io.cpp but modified. I
> have marked the little modification. I just try to write the arr2 to a
> file again. I always get a Segmentation fault (core dumped).
>
> //! \file examples/Arrangement_2/io.cpp
> // Using the arrangement I/O operators.
>
> #include "arr_rational_nt.h"
> #include <CGAL/Cartesian.h>
> #include <CGAL/Arr_segment_traits_2.h>
> #include <CGAL/Arrangement_2.h>
> #include <CGAL/IO/Arr_iostream.h>
> #include <fstream>
>
> #include "point_location_utils.h"
>
> typedef CGAL::Cartesian<Number_type>                  Kernel;
> typedef CGAL::Arr_segment_traits_2<Kernel>            Traits_2;
> typedef CGAL::Arrangement_2<Traits_2>                 Arrangement_2;
>
> int main ()
> {
>  // Construct the arrangement.
>  Arrangement_2    arr;
>
>  construct_segments_arr (arr);
>
>  std::cout << "Writing an arrangement of size:" << std::endl
>            << "   V = " << arr.number_of_vertices()
>            << ",  E = " << arr.number_of_edges()
>            << ",  F = " << arr.number_of_faces() << std::endl;
>
>  // Write the arrangement to a file.
>  std::ofstream    out_file ("arr_ex_io.dat");
>
>  out_file << arr;
>  out_file.close();
>
>  // Read the arrangement from the file.
>  Arrangement_2    arr2;
>  std::ifstream    in_file ("arr_ex_io.dat");
>
>  in_file >> arr2;
>  in_file.close();
>
>  std::cout << "Read an arrangement of size:" << std::endl
>            << "   V = " << arr2.number_of_vertices()
>            << ",  E = " << arr2.number_of_edges()
>            << ",  F = " << arr2.number_of_faces() << std::endl;
>
>  //+++++++++++++++++++modified +++++++++++++++++++++++++
>  // Write the arrangement to a file2.
>  std::ofstream    out_file2 ("arr_ex_io2.dat");
>
>  std::cout << "still ok" << std::endl;
>  out_file2 << arr2;
>  std::cout << "not ok" << std::endl;
>
>  out_file2.close();
>  //+++++++++++++++++++modified +++++++++++++++++++++++++
>
>  return (0);
> }
>
> I hope this helps!
>
> I use CGAL 3.3-2 from the ubuntu packages.
>
> paul
>
>
> Efi Fogel schrieb:
>> It's seems like a bug. Probably in the writing to or reading from a
>> file. Can you confirm?
>>
>> Paul Neugebauer wrote:
>>> Hi list,
>>>
>>> I have got a strange problem with the Arrangement_2 IO. Here is a
>>> part of my program:
>>>
>>>    ...
>>>    Naive_pl    naive_pl(arr);
>>>
>>>        point_location_query(naive_pl, source);
>>>
>>>    // Write the arrangement to a file
>>>    std::ofstream    out_file("output/arr_io.dat");
>>>    Formatter    formatter;
>>>
>>>    write(arr, out_file, formatter);
>>>    out_file.close();
>>>
>>>    // Read the arrangement from a file
>>>    std::ifstream in_file2("output/arr_io.dat");
>>>    Arrangement_2    arr2;
>>>
>>>    read(arr2, in_file2, formatter);
>>>    in_file2.close();
>>>    assert(arr2.is_valid());
>>>
>>>    Naive_pl    naive_pl2(arr2);
>>>
>>>        point_location_query(naive_pl2, source);
>>>    ...
>>>
>>> The ouput is: The point is located inside the UNBOUNDED face
>>>                        The point is located inside the BOUNDED face
>>>
>>> But it is the same point: source
>>> If I use naive_pl for the second point_location_query again, like this:
>>>
>>>        point_location_query(naive_pl, source);
>>>
>>> everything is ok.
>>>
>>> Any idea anybody ?
>>>
>>> Thanks,
>>> paul
>>>
>>>
>>>
>
--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://lists-sop.inria.fr/wws/info/cgal-discuss

diff -Naur CGAL-3.3.1.orig/include/CGAL/Arr_accessor.h CGAL-3.3.1/include/CGAL/Arr_accessor.h
--- CGAL-3.3.1.orig/include/CGAL/Arr_accessor.h 2007-08-25 21:01:33.000000000 +0200
+++ CGAL-3.3.1/include/CGAL/Arr_accessor.h 2008-04-06 17:34:08.000000000 +0200
@@ -1119,6 +1119,46 @@
   {
     return (p_arr->dcel.new_isolated_vertex());
   }
+
+  /*!
+   * Set the bottom right vertex
+   */
+  void set_bottom_right_fictitious_vertex( Dcel_vertex* vertex )
+  {
+    p_arr->v_br = vertex;
+  }
+
+  /*!
+   * Set the top right vertex
+   */
+  void set_top_right_fictitious_vertex( Dcel_vertex* vertex )
+  {
+    p_arr->v_tr = vertex;
+  }
+
+  /*!
+   * Set the bottom left vertex
+   */
+  void set_bottom_left_fictitious_vertex( Dcel_vertex* vertex )
+  {
+    p_arr->v_bl = vertex;
+  }
+
+  /*!
+   * Set the top left vertex
+   */
+  void set_top_left_fictitious_vertex( Dcel_vertex* vertex )
+  {
+    p_arr->v_tl = vertex;
+  }
+
+  /*! Set the fictitious face of the arrangement. */
+  void set_fictitious_face( Dcel_face* face )
+  {
+    p_arr->un_face = face;
+  }
+
+
   //@}
 };
 
diff -Naur CGAL-3.3.1.orig/include/CGAL/IO/Arrangement_2_reader.h CGAL-3.3.1/include/CGAL/IO/Arrangement_2_reader.h
--- CGAL-3.3.1.orig/include/CGAL/IO/Arrangement_2_reader.h 2007-08-25 21:01:33.000000000 +0200
+++ CGAL-3.3.1/include/CGAL/IO/Arrangement_2_reader.h 2008-04-06 21:05:15.000000000 +0200
@@ -123,6 +123,10 @@
                                                  MINUS_INFINITY);
     v_tr =  m_arr_access.new_vertex_at_infinity (PLUS_INFINITY,
                                                  PLUS_INFINITY);
+    m_arr_access.set_bottom_left_fictitious_vertex( v_bl );
+    m_arr_access.set_top_left_fictitious_vertex( v_tl );
+    m_arr_access.set_bottom_right_fictitious_vertex( v_br );
+    m_arr_access.set_top_right_fictitious_vertex( v_tr );
 
     // Read the DCEL vertices and store them in the vertices vector.
     formatter.read_vertices_begin();
@@ -276,6 +280,10 @@
   void _read_face(Formatter& formatter)
   {
     formatter.read_face_begin();
+  
+    // Read unbounded
+    bool ubd = formatter.read_size ("unbounded" );
+
 
     // Try reading the outer CCB of the face.
     formatter.read_outer_ccb_begin();
@@ -288,6 +296,7 @@
       // Allocate the fictitious DCEL face.
       new_f = m_arr_access.new_face();
       new_f->set_halfedge (NULL);
+      m_arr_access.set_fictitious_face( new_f );
     }
     else
     {
@@ -296,6 +305,7 @@
       he = _read_ccb (formatter, new_f, outer_size, NULL);
       new_f->set_halfedge (he);
     }
+    new_f->set_unbounded( ubd );
     formatter.read_outer_ccb_end();
 
     // Read the holes inside the face.
diff -Naur CGAL-3.3.1.orig/include/CGAL/IO/Arrangement_2_writer.h CGAL-3.3.1/include/CGAL/IO/Arrangement_2_writer.h
--- CGAL-3.3.1.orig/include/CGAL/IO/Arrangement_2_writer.h 2007-08-25 21:01:33.000000000 +0200
+++ CGAL-3.3.1/include/CGAL/IO/Arrangement_2_writer.h 2008-04-06 21:02:45.000000000 +0200
@@ -219,6 +219,9 @@
 
     formatter.write_face_begin();
 
+    // Write unbounded
+    formatter.write_size ("unbounded", static_cast<int>( f->is_unbounded() ) );
+
     // Write the outer CCB.
     formatter.write_outer_ccb_begin();
     if (f->is_fictitious())
diff -Naur CGAL-3.3.1.orig/include/CGAL/IO/Arr_text_formatter.h CGAL-3.3.1/include/CGAL/IO/Arr_text_formatter.h
--- CGAL-3.3.1.orig/include/CGAL/IO/Arr_text_formatter.h 2007-08-25 21:01:33.000000000 +0200
+++ CGAL-3.3.1/include/CGAL/IO/Arr_text_formatter.h 2008-04-06 20:59:36.000000000 +0200
@@ -27,6 +27,7 @@
 
 #include <CGAL/basic.h>
 #include <iostream>
+#include <string>
 
 CGAL_BEGIN_NAMESPACE
 
@@ -391,6 +392,10 @@
     int  val;
 
     in() >> val;
+
+    // ignore blank after value
+    m_in->ignore();
+
     return (val);
   }
 
@@ -479,8 +484,9 @@
   {
     CGAL_assertion (m_in != NULL);
 
-    int     c;
-    while ((c = m_in->get()) != EOF && c != '\n');
+    std::string line;
+    std::getline( *m_in, line );
+
     return;
   }
   
@@ -488,12 +494,15 @@
   void _skip_comments ()
   {
     CGAL_assertion (m_in != NULL);
-
-    int     c;
-    while ((c = m_in->get()) != EOF && c == '#')
-      _skip_until_EOL();
-    m_in->putback (c);
-
+    
+    std::string comment;
+    std::getline( *m_in, comment );
+    if ( comment.empty() )
+      return _skip_comments();
+    int s = comment[0];
+    if ( s == '\n' )
+      return _skip_comments();
+    CGAL_assertion ( s == '#' );
     return;
   }