X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fskyline.hh;h=a93316d93577779a92d7ccaee47520c2fcddd89c;hb=28f3294954eff1f263d3b2e3de1c520f4d2fbdfc;hp=3ca05e0ff2cc4866c536648b2c2fe6d347c573ac;hpb=75eebcb49e52d296b1da3e1074e0825d2c780db4;p=lilypond.git diff --git a/lily/include/skyline.hh b/lily/include/skyline.hh index 3ca05e0ff2..a93316d935 100644 --- a/lily/include/skyline.hh +++ b/lily/include/skyline.hh @@ -1,41 +1,116 @@ /* - skyline.hh -- declare Skyline_entry and funcbs. + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2006--2012 Joe Neeman - (c) 2002--2006 Han-Wen Nienhuys + LilyPond 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 3 of the License, or + (at your option) any later version. + + LilyPond 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 LilyPond. If not, see . */ #ifndef SKYLINE_HH #define SKYLINE_HH -#include "array.hh" +#include "lily-proto.hh" +#include "axis.hh" #include "box.hh" +#include "interval.hh" +#include "direction.hh" +#include "std-vector.hh" +#include "smobs.hh" -struct Skyline_entry +#include + +struct Building { - Interval width_; - Real height_; - Skyline_entry (); - Skyline_entry (Interval, Real); + Real start_; + Real end_; + Real y_intercept_; + Real slope_; + + void precompute (Real start, Real start_height, Real end_height, Real end); + Building (Real start, Real start_height, Real end_height, Real end); + Building (Box const &b, Axis a, Direction d); + void print () const; + + Real height (Real x) const; + Real intersection_x (Building const &other) const; + void leading_part (Real chop); + bool conceals (Building const &other, Real x) const; + Real shift_to_intersect (Real x, Real y) const; + Interval overlapping_shift_interval (Building const &other) const; +}; + +class Skyline +{ +private: + list buildings_; + Direction sky_; + + void internal_merge_skyline (list *, list *, + list *const result) const; + list internal_build_skyline (list *) const; + Real internal_distance (Skyline const &, Real horizon_padding, Real *touch_point) const; + Real internal_distance (Skyline const &, Real *touch_point) const; + void normalize (); + + DECLARE_SIMPLE_SMOBS (Skyline); + +public: + Skyline (); + Skyline (Skyline const &src); + Skyline (Direction sky); + Skyline (vector const &bldgs, Axis a, Direction sky); + Skyline (vector > const &bldgs, Axis a, Direction sky); + Skyline (vector const &skypairs, Direction sky); + Skyline (Box const &b, Axis a, Direction sky); + + vector to_points (Axis) const; + void deholify (); + void merge (Skyline const &); + void insert (Box const &, Axis); + void print () const; + void print_points () const; + void raise (Real); + void shift (Real); + void invert (); + Real distance (Skyline const &, Real horizon_padding = 0) const; + Real smallest_shift (Skyline const &, Direction d, + Real horizon_padding = 0, + Real vertical_padding = 0) const; + Real touching_point (Skyline const &, Real horizon_padding = 0) const; + Real shift_to_avoid (Skyline const &other, Real, Direction d, Real horizon_padding = 0); + Real raise_to_avoid (Skyline const &other, Real, Direction d, Real horizon_padding = 0); + Drul_array shifts_to_avoid_intersection (Skyline const &, Real horizon_padding = 0) const; + Interval raises_to_avoid_intersection (Skyline const &, Real horizon_padding = 0) const; + Real height (Real airplane) const; + Real max_height () const; + Real max_height_position () const; + void set_minimum_height (Real height); + void clear (); + bool is_empty () const; + bool is_singleton () const; + Real left () const; + Real right () const; + Skyline padded (Real horizon_padding) const; + + DECLARE_SCHEME_CALLBACK (get_touching_point, (SCM, SCM, SCM)); + DECLARE_SCHEME_CALLBACK (get_distance, (SCM, SCM, SCM)); + DECLARE_SCHEME_CALLBACK (get_max_height, (SCM)); + DECLARE_SCHEME_CALLBACK (get_max_height_position, (SCM)); + DECLARE_SCHEME_CALLBACK (get_height, (SCM, SCM)); }; -void -merge_skyline (Array *a1, Array const &a2, - Direction); -void insert_extent_into_skyline (Array *line, Box b, Axis line_axis, - Direction d); -Array -extents_to_skyline (Array const &extents, Axis a, Direction d); -Array empty_skyline (Direction d); -void heighten_skyline (Array *buildings, Real ground); -Real -skyline_meshing_distance (Array const &buildings, - Array const &clouds); - -Real -skyline_height (Array const &buildings, - Real airplane, Direction sky_dir); +extern bool debug_skylines; #endif /* SKYLINE_HH */