Re: creation of a set of segments, please help
On Nov 13, 5:24 pm, SG <s.gesem...@gmail.com> wrote:
On 14 Nov., 00:08, aaragon <alejandro.ara...@gmail.com> wrote:
bool Segment::operator==(const Segment& s)
{ return ((source_ == s.source_ && target_ == s.target_) || (ta=
rget_
== s.source_ && source_ == s.target_)); }
You have to be very careful with comparing doubles -- especially in
case of many geometric algorithms. They work fine on paper but when it
comes to the implementation rounding errors can be a pain in the a**.
Now, I would like to create a set of segments. Of course, the segment
does not have to have duplicates. However, sets are defined by using
operator< which is not defined here.
Right. Anyhow, using points and segments (with doubles as members) as
keys in a set / map might do you harm. In theory you can still work
out a total order. For example: compare Points lexically and store
segments with source<target and compare segments also lexically.
So the question is, how do I create a std::set of segments? Any ideas?
Try to avoid it whenever possible.
Cheers!
SG
Thanks for replying to my post. This is what I came up with since atan
() returns the angle between -pi/2 and pi/2:
struct SegmentSorter {
bool operator()(const segment_type& s1, const segment_type& s2) const
{
// compute angle of first segment
double phi1 = atan((s1.t_.y() - s1.s_.y())/(s1.t_.x() - s1.s_.x()));
// compute angle of second segment
double phi2 = atan((s2.t_.y() - s2.s_.y())/(s2.t_.x() - s2.s_.x()));
return phi1 < phi2;
}
};
typedef std::set<segment_type, SegmentSorter> segment_set;
What do you think?
aa