Go to the documentation of this file.00001 #ifndef __Edge_H__
00002 #define __Edge_H__
00003
00004 #include "Vector2.h"
00005 #include "Interpolation.h"
00006
00007 #include <cmath>
00008
00009 namespace EdgeDetection
00010 {
00011
00012 class Edge
00013 {
00014 private: double offset;
00015 private: double angle;
00016
00017 public: double GetOffset() { return offset; }
00018 public: double GetAngle() { return angle; }
00019 public: Vector2 GetCenter() { return Vector2::Multiply(offset, Vector2(angle)); }
00020
00021 public: Edge()
00022 {
00023 this->offset = 0;
00024 this->angle = 0;
00025 }
00026 public: Edge(double offset, double angle)
00027 {
00028 this->offset = offset;
00029 this->angle = angle;
00030
00031 while (this->angle < -M_PI) this->angle += 2 * M_PI;
00032 while (this->angle > +M_PI) this->angle -= 2 * M_PI;
00033 }
00034 public: ~Edge() { }
00035
00036 public: static double GetDistance(Edge edge1, Edge edge2)
00037 {
00038 while (edge1.angle - edge2.angle < -M_PI) edge1.angle += 2 * M_PI;
00039 while (edge1.angle - edge2.angle > +M_PI) edge1.angle -= 2 * M_PI;
00040
00041 double offsetDifference = edge1.offset - edge2.offset;
00042 double angleDifference = edge1.angle - edge2.angle;
00043
00044 return Vector2(offsetDifference, angleDifference).GetLength();
00045 }
00046 public: static Edge Interpolate(Edge edge1, Edge edge2, double fraction)
00047 {
00048 while (edge1.angle - edge2.angle < -M_PI) edge1.angle += 2 * M_PI;
00049 while (edge1.angle - edge2.angle > +M_PI) edge1.angle -= 2 * M_PI;
00050
00051 double offset = Interpolation::InterpolateForward(edge1.offset, edge2.offset, fraction);
00052 double angle = Interpolation::InterpolateForward(edge1.angle, edge2.angle, fraction);
00053
00054 return Edge(offset, angle);
00055 }
00056 };
00057 };
00058
00059 #endif