See what's going on with flipcode!

This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.


  Pluecker Class
  Submitted by

The plucker class, in one file. Pretty easy to understand. This code is now in the public domain.

Download Associated File: plucker.h (2,889 bytes)

#ifndef _HPluckerH_
#define _HPluckerH_

#include "vector.h"

class HQRPlucker { public: HQRPlucker() {} HQRPlucker(HQRVector* origin,HQRVector* second) { //Origin, first point, second, second point on line->Not direction //No nasty cases, can use as constructor MakePluckerFromVec(origin,second); }

inline bool RetVectorLine(HQRVector* retval) { //Retval[0] = Direction, Retval[1] = Line Point (Closest to origin) if (!GrassmanCheck()) return false; //Not real line, can't return vectors retval[0].Copy(m_coords); //First Vector is direction retval[1].VecCrossProduct(m_coords[0],m_coords[1]); retval[1].Scale(1/(m_coords[1].VecDotProduct(m_coords[1]))); //Divide, because homogenous coord return true; }

inline bool MakePluckerFromPlanes(HQRPlane* pone,HQRPlane* ptwo) { //NOTE; Returns false if planes parallel -> Degenerate Case can't use as constructor if ((ptwo->Normal()->VecDotProduct(*pone->Normal()))==1) return false; HQRVector temp; //NOTE; Scalar is the D value to the plane m_coords[0].VecCrossProduct(*ptwo->Normal(),*pone->Normal()); m_coords[1].CopyWithScale(ptwo->Normal(),pone->Scalar()); temp.CopyWithScale(pone->Normal(),ptwo->Scalar()); m_coords[1].subtract(temp); return true; } inline void MakePluckerFromVec(HQRVector* Q,HQRVector* P) { //Q vector is first vector, P is second vector in directed line m_coords[0].Copy(P); m_coords[0].subtract(*Q); m_coords[1].VecCrossProduct(*P,*Q); }

inline float PDotProduct(HQRPlucker* against) { //Performs dot product with "against" and this. return (m_coords[0].VecDotProduct(against->Coords(1)) + m_coords[1].VecDotProduct(against->Coords(0))); }

inline bool PSideTest(HQRPlucker* against) { //Does a dotproduct, returns true if ccw orientation/intersection, false if cw. if (PDotProduct(against)<0) return false; return true; }

inline HQRVector Direction() {return m_coords[0];} //Direction inline HQRVector* Coords() {return m_coords;} //Pointer to coords inline HQRVector Coords(unsigned int n) {return m_coords[n];} //Coords by number inline bool GrassmanCheck() { //Returns true if real line. if (EpCheck(PDotProduct(this))) return true; return false; }

inline bool TriangleHit(HQRPlucker** edges) { //Returns True if this line stabs the triangle (3 edges) bool result; result=(PDotProduct(edges[0])<0); if (result!=(PDotProduct(edges[1])<0)) return false; if (result!=(PDotProduct(edges[2])<0)) return false;

return true; }

inline bool PolyHit(HQRPlucker** edges,unsigned int numedges) { //Returns True is this line stabs the polygon (numedge) of edges bool result;

result=(PDotProduct(edges[0])<0); for (unsigned int ii=1; ii<numedges; ii++) { if (result!=(PDotProduct(edges[ii])<0)) return false; } return true; } private: HQRVector m_coords[2]; //The coords. };


The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.


Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.