summaryrefslogtreecommitdiff
path: root/graphics/epix/hatching.cc
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/epix/hatching.cc')
-rw-r--r--graphics/epix/hatching.cc258
1 files changed, 0 insertions, 258 deletions
diff --git a/graphics/epix/hatching.cc b/graphics/epix/hatching.cc
deleted file mode 100644
index 00fe64b7a3..0000000000
--- a/graphics/epix/hatching.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * hatching.cc -- ePiX's internal data for filled polygons
- *
- * This file is part of ePiX, a C++ library for creating high-quality
- * figures in LaTeX
- *
- * Version 1.2.0-2
- * Last Change: September 26, 2007
- */
-
-/*
- * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
- * Andrew D. Hwang <rot 13 nujnat at zngupf dot ubylpebff dot rqh>
- * Department of Mathematics and Computer Science
- * College of the Holy Cross
- * Worcester, MA, 01610-2395, USA
- */
-
-/*
- * ePiX is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * ePiX is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- * License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with ePiX; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <list>
-#include <vector>
-#include <cmath>
-
-#include "errors.h"
-
-#include "constants.h"
-#include "functions.h"
-#include "pairs.h"
-
-#include "edge_data.h"
-
-#include "state.h"
-#include "hatching.h"
-
-namespace ePiX {
-
- bd_edge::bd_edge(const edge2d& edge, double ht1, double ht2, int orient)
- : m_edge(edge), m_lo(min(ht1, ht2)), m_hi(max(ht1, ht2)),
- m_orient(orient) { }
-
- pair bd_edge::tail() const
- {
- return m_edge.tail();
- }
-
- pair bd_edge::head() const
- {
- return m_edge.head();
- }
-
- pair bd_edge::dir() const
- {
- return m_edge.head() - m_edge.tail();
- }
-
- double bd_edge::lo() const
- {
- return m_lo;
- }
-
- double bd_edge::hi() const
- {
- return m_hi;
- }
-
- int bd_edge::orient() const
- {
- return m_orient;
- }
-
-
- cut::cut(pair loc, int sign)
- : m_loc(loc), m_sign(sign) { }
-
- pair cut::loc() const
- {
- return m_loc;
- }
-
- int cut::sign() const
- {
- return m_sign;
- }
-
-
- // (h-t) assumed unit
- scan_line::scan_line(const pair& t, const pair& h)
- : m_perp(J(t - h)), m_ht(h.x1()*t.x2() - h.x2()*t.x1()) { }
-
-
- // keep m_cuts sorted by x
- void scan_line::add_cut(const cut& crossing)
- {
- if (EPIX_EPSILON < fabs((m_perp|crossing.loc()) + m_ht))
- return;
-
- const double x(J(m_perp)|crossing.loc());
-
- std::list<cut>::iterator p(m_cuts.begin());
-
- while (p != m_cuts.end() && (J(m_perp)|(*p).loc()) < x)
- ++p;
-
- m_cuts.insert(p, crossing);
- }
-
-
- // add scans to value
- void scan_line::draw(std::vector<edge2d>& value) const
- {
- std::list<cut>::const_iterator p(m_cuts.begin());
-
- if (p == m_cuts.end()) // redundant guard
- return;
-
- int winding((*p).sign());
-
- pair start((*p).loc());
- pair end(start);
-
- while (p != m_cuts.end())
- {
- // non-zero winding rule
- while (winding != 0 && ++p != m_cuts.end())
- {
- end = (*p).loc();
- winding += (*p).sign();
- }
-
- if (start != end)
- value.push_back(edge2d(start, end, true));
-
- // seek to next start
- while (winding == 0 && ++p != m_cuts.end())
- {
- start = (*p).loc();
- winding += (*p).sign();
- }
- }
- } // end of scan_line::draw
-
-
- // private function; assumes horiz is unit
- void hatch_data::hatch_init(const pair& horiz,
- double sep,
- std::list<edge2d> polygon)
- {
- const pair vert(J(horiz));
-
- // initialize loop with first edge
- std::list<edge2d>::iterator p(polygon.begin());
-
- // first pass: Get min, max vertex heights; remove horizontal edges
- double min_ht((*p).tail()|vert);
- double max_ht(min_ht);
-
- for (p = polygon.begin(); p != polygon.end(); ) // increment at bottom
- {
- double tmp_tl((*p).tail()|vert);
- double tmp_hd((*p).head()|vert);
-
- if (fabs(tmp_hd - tmp_tl) < EPIX_EPSILON) // horizontal edge
- p = polygon.erase(p);
-
- else
- {
- // running extrema from head height
- min_ht = min(min_ht, tmp_hd);
- max_ht = max(max_ht, tmp_hd);
-
- int up(tmp_tl < tmp_hd ? 1 : -1); // get edge orientation
- m_edges.push_back(bd_edge(*p, tmp_tl, tmp_hd, up));
- ++p;
- }
- }
-
- // compute subdivision heights, initialize vector of scan_lines
- unsigned int num_cuts((unsigned int) ceil((max_ht - min_ht)/sep));
- const double true_sep((max_ht - min_ht)/num_cuts);
-
- // initialize hatch lines
- for (unsigned int i=0; i <= num_cuts; ++i)
- {
- double ht(min_ht + i*true_sep);
- m_scans.push_back(scan_line(ht*vert, horiz + ht*vert));
- }
-
- // Second pass: add scan line cuts
- for (std::list<bd_edge>::iterator ep=m_edges.begin();
- ep != m_edges.end(); ++ep)
- {
- // indices of scan lines we cross
- unsigned int i_min((unsigned int) ceil(((*ep).lo()-min_ht)/true_sep));
- unsigned int i_max((unsigned int) floor(((*ep).hi()-min_ht)/true_sep));
-
- // compute parameters once per edge
- const pair tl((*ep).tail());
- const pair dir((*ep).dir());
-
- // relative heights of endpoints
- const double ht_hd((*ep).head()|vert);
- const double ht_tl(tl|vert);
-
- const int up((*ep).orient());
-
- for (unsigned int i = i_min; i <= i_max; ++i)
- {
- const double t((min_ht + i*true_sep - ht_tl)/(ht_hd - ht_tl));
- m_scans.at(i).add_cut(cut(tl + t*dir, up));
- }
- }
- } // end of hatch_init
-
-
- // user-visible constructors
- hatch_data::hatch_data(double dir_x, double dir_y,
- double sep, const std::list<edge2d>& polygon)
- {
- pair dir(dir_x, dir_y);
- dir *= 1.0/norm(dir);
-
- hatch_init(dir, sep, polygon);
- }
-
- hatch_data::hatch_data(double th, double sep,
- const std::list<edge2d>& polygon)
- {
- const double theta(th*PI_180); // th in radians
-
- // orthonormal basis; horiz along cuts, vert perp to cuts
- hatch_init(pair(std::cos(theta), std::sin(theta)), sep, polygon);
- }
-
-
- std::vector<edge2d> hatch_data::data() const
- {
- std::vector<edge2d> value;
-
- for (unsigned int i=0; i < m_scans.size(); ++i)
- m_scans.at(i).draw(value);
-
- return value;
- }
-} // end of namespace