#ifndef _MOOF_LINE_HH_
#define _MOOF_LINE_HH_
-#include <Moof/Contact.hh>
-#include <Moof/Drawable.hh>
-#include <Moof/Log.hh>
-#include <Moof/Math.hh>
-#include <Moof/OpenGL.hh>
-#include <Moof/Ray.hh>
-#include <Moof/Shape.hh>
-#include <Moof/Sphere.hh>
-#include <Moof/Texture.hh>
+/**
+ * \file line.hh
+ * Classes related to line segments.
+ */
+#include <moof/contact.hh>
+#include <moof/drawable.hh>
+#include <moof/log.hh>
+#include <moof/math.hh>
+#include <moof/opengl.hh>
+#include <moof/ray.hh>
+#include <moof/shape.hh>
+#include <moof/sphere.hh>
+#include <moof/texture.hh>
-namespace Mf {
+
+namespace moof {
template <int D>
-struct Line : public Drawable, public Shape<D>
+struct line : public drawable, public shape<D>
{
- typedef cml::vector< Scalar, cml::fixed<D> > Vector;
+ typedef moof::vector< scalar, fixed<D> > vector;
+
- Vector a;
- Vector b;
+ vector a;
+ vector b;
- Line() {}
+ line() {}
- Line(const Vector& point1, const Vector& point2) :
+ line(const vector& point1, const vector& point2) :
a(point1),
b(point2) {}
- Vector getDirection() const
+ vector direction() const
{
return b - a;
}
- Scalar getLength() const
+ scalar length() const
{
- return getDirection().length();
+ return direction().length();
}
- bool intersect(const Line& other, Contact<D>& hit) const
+ bool intersect(const line& other, contact<D>& hit) const
{
- Scalar d = (other.b[1] - other.a[1]) * (b[0] - a[0]) -
+ scalar d = (other.b[1] - other.a[1]) * (b[0] - a[0]) -
(other.b[0] - other.a[0]) * (b[1] - a[1]);
if (d == SCALAR(0.0)) return false; // lines are parallel
// ignoring the (somewhat remote) possibility of coincidence
- Scalar m = ((other.b[0] - other.a[0]) * (a[1] - other.a[1]) -
+ scalar m = ((other.b[0] - other.a[0]) * (a[1] - other.a[1]) -
(other.b[1] - other.a[1]) * (a[0] - other.a[0])) / d;
- Scalar n = ((b[0] - a[0]) * (b[1] - other.a[1]) -
+ scalar n = ((b[0] - a[0]) * (b[1] - other.a[1]) -
(b[1] - a[1]) * (b[0] - other.a[0])) / d;
if (m < SCALAR(0.0) || m > SCALAR(1.0) || // not intersecting
n < SCALAR(0.0) || n > SCALAR(1.0)) return false;
- Vector2 tangent = b - a;
- Vector2 normal = cml::perp(tangent).normalize();
+ vector2 tangent = b - a;
+ vector2 normal = perp(tangent).normalize();
- if (cml::dot(normal, other.a - other.b) < SCALAR(0.0))
+ if (dot(normal, other.a - other.b) < SCALAR(0.0))
{
normal = -normal;
}
return true;
}
- bool intersect(const Sphere<D>& other, Contact<D>& hit) const
+ bool intersect(const sphere<D>& other, contact<D>& hit) const
{
- Vector surface = b - a;
- Vector toPoint = other.point - a;
+ vector surface = b - a;
+ vector toPoint = other.point - a;
- Scalar surfaceLength = surface.length();
+ scalar surfaceLength = surface.length();
surface.normalize();
- Scalar projection = cml::dot(surface, toPoint);
+ scalar projection = dot(surface, toPoint);
if (projection < SCALAR(0.0) || projection > surfaceLength)
{
return false;
}
- Vector point = a + surface * projection;
- Vector normal = other.point - point;
+ vector point = a + surface * projection;
+ vector normal = other.point - point;
- Scalar distance = normal.length();
+ scalar distance = normal.length();
if (distance > other.radius) false; // not intersecting
}
- bool intersectRay(const Ray<2>& ray, Ray<2>::Contact& hit) const
+ bool intersect_ray(const ray<2>& ray, ray<2>::contact& hit) const
{
- Vector2 v1 = a - ray.point;
- Scalar a1 = cml::signed_angle_2D(v1, b - ray.point);
+ vector2 v1 = a - ray.point;
+ scalar a1 = signed_angle_2D(v1, b - ray.point);
- //logWarning << "angle:::::::::: " << a1 << std::endl;
+ //log_warning << "angle:::::::::: " << a1 << std::endl;
- if (a1 == Constants::pi())
+ if (a1 == constants::pi())
{
hit.distance = 5.4321;
return true;
return true;
}
- Scalar a2 = cml::signed_angle_2D(v1, ray.direction);
+ scalar a2 = signed_angle_2D(v1, ray.direction);
if (a2 < SCALAR(0.0) || a2 > a1) return false;
//hit.distance = 1.23456;
- //hit.normal = Vector2(0.0, 0.0);
+ //hit.normal = vector2(0.0, 0.0);
- Vector2 n = (b - a).normalize();
- Scalar z = cml::dot(ray.point - a, n);
- Vector2 p = a + n * z;
+ vector2 n = (b - a).normalize();
+ scalar z = dot(ray.point - a, n);
+ vector2 p = a + n * z;
hit.distance = (ray.point - p).length();
- hit.normal = cml::perp(a - b);
+ hit.normal = perp(a - b);
return true;
// C = ray.point
// D = ray.direction
- Scalar denom = ray.direction[0] * (b[1] - a[1]) +
+ scalar denom = ray.direction[0] * (b[1] - a[1]) +
ray.direction[1] * (a[0] - b[0]);
// check if the ray and line are parallel
- //if (isEqual(denom, SCALAR(0.0)))
+ //if (is_equal(denom, SCALAR(0.0)))
if (denom == SCALAR(0.0))
{
- Scalar numer = a[0] * (ray.point[1] - b[1]) +
+ scalar numer = a[0] * (ray.point[1] - b[1]) +
b[0] * (a[1] - ray.point[1]) +
ray.point[0] * (b[1] - a[1]);
// check if they are collinear
- if (isEqual(numer, SCALAR(0.0)))
+ if (is_equal(numer, SCALAR(0.0)))
{
hit.distance = SCALAR(0.0);
hit.normal.set(0.0, 0.0);
return false;
}
- Scalar s = (ray.direction[0] * (ray.point[1] - a[1]) +
+ scalar s = (ray.direction[0] * (ray.point[1] - a[1]) +
ray.direction[1] * (a[0] - ray.point[0])) / denom;
// check if the ray hits the segment
// check if the intersection is behind the ray
if (hit.distance < SCALAR(0.0)) return false;
- Vector normal = cml::perp(a - b);
- if (cml::dot(a - ray.point, normal) < 0) hit.normal = normal;
+ vector normal = perp(a - b);
+ if (dot(a - ray.point, normal) < 0) hit.normal = normal;
else hit.normal = -normal;
return true;
*/
}
- void draw(Scalar alpha = 0.0) const
+ void draw(scalar alpha = 0.0) const
{
- Mf::Texture::resetBind();
+ texture::reset_binding();
glBegin(GL_LINES);
glVertex(a);
glVertex(b);
};
-typedef Line<2> Line2;
-typedef Line<3> Line3;
+typedef line<2> line2;
+typedef line<3> line3;
template <int D, int N>
-struct Polygon : public Drawable, public Shape<D>
+struct polygon : public drawable, public shape<D>
{
- typedef cml::vector< Scalar, cml::fixed<D> > Vector;
+ typedef moof::vector< scalar, fixed<D> > vector;
- Vector points[N];
+ vector points[N];
- Polygon() {}
+ polygon() {}
- bool intersectRay(const Ray<D>& ray, typename Ray<D>::Contact& hit)
+ bool intersect_ray(const ray<D>& ray, typename ray<D>::contact& hit)
{
return false;
}
- void draw(Scalar alpha = 0.0) const
+ void draw(scalar alpha = 0.0) const
{
- Mf::Texture::resetBind();
+ texture::reset_binding();
glBegin(GL_POLYGON);
for (int i = 0; i < D; ++i)
{
};
-typedef Polygon<2,3> Triangle2;
-typedef Polygon<3,3> Triangle3;
+typedef polygon<2,3> triangle2;
+typedef polygon<3,3> triangle3;
template <int D>
-bool intersect(const Line<D>& line, const Sphere<D>& sphere,
- Contact<D>& hit)
+bool intersect(const line<D>& line, const sphere<D>& sphere,
+ contact<D>& hit)
{
return false;
}
-} // namespace Mf
+} // namespace moof
#endif // _MOOF_LINE_HH_