Library of Assembled Shared Sources
ray_3d_transformation_3d.h
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2011 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43#ifndef LASS_GUARDIAN_OF_INCLUSION_PRIM_RAY_3D_TRANSFORMATION_3D_H
44#define LASS_GUARDIAN_OF_INCLUSION_PRIM_RAY_3D_TRANSFORMATION_3D_H
45
46#include "prim_common.h"
47#include "ray_3d.h"
48#include "transformation_3d.h"
49
50namespace lass
51{
52namespace prim
53{
54
55namespace impl
56{
57 template <typename NP> struct RayParameterRescaler;
58
59 template <>
60 struct RayParameterRescaler<prim::Unnormalized>
61 {
62 // unnormalized directions don't alter parameter: same t is same point
63 template <typename T, typename VectorType>
64 static void rescale(T& /*tRay*/, const VectorType& /*unnormalizedNewDirection*/)
65 {
66 }
67 };
68
69 template <>
70 struct RayParameterRescaler<prim::Normalized>
71 {
72 // normalized ray's compress parameters because of renormalisation of direction.
73 // to get same point, scale parameter by norm before renormalisation.
74 template <typename T, typename VectorType>
75 static void rescale(T& tRay, const VectorType& unnormalizedNewDirection)
76 {
77 tRay *= unnormalizedNewDirection.norm();
78 }
79 };
80}
81
82
83
84/** apply transformation to ray
85 * @relates Transformation3D
86 */
87template<typename T, class NP, class PP>
89 const Ray3D<T, NP, PP>& subject, const Transformation3D<T>& transformation)
90{
91 return Ray3D<T, NP, PP>(
92 transform(subject.support(), transformation),
93 transform(subject.direction(), transformation));
94}
95
96
97
98/** apply transformation to ray, and rescale a parameter to represent same point
99 *
100 * @param tRay
101 * - INPUT & OUTPUT
102 * - if direction gets renormalized, then a point on ray is no longer represented
103 * by same parameter. Adjust parameter @a tRay to fix this.
104 * - If you fill in 1 as @a tRay, you can use the result to
105 * rescale multiple parameters by multiplying it.
106 * - <tt>transform(ray, transf).point(t') == transform(ray.point(t), transf)</tt>
107 *
108 * @relates Transformation3D
109 */
110template<typename T, class NP, class PP>
112 const Ray3D<T, NP, PP>& subject, const Transformation3D<T>& transformation, T& tRay)
113{
114 typedef Ray3D<T, NP, PP> TRay;
115 const typename TRay::TPoint support = transform(subject.support(), transformation);
116 const typename TRay::TVector direction = transform(subject.direction(), transformation);
117 impl::RayParameterRescaler<NP>::rescale(tRay, direction);
118 return Ray3D<T, NP, PP>(support, direction);;
119}
120
121}
122}
123
124#endif
125
126// EOF
const TVector & direction() const
Return direction of ray.
Definition ray_3d.inl:141
const TPoint & support() const
return origin of ray.
Definition ray_3d.inl:118
Aabb2D< U, MMP > transform(const Aabb2D< U, MMP > &subject, const Transformation2D< U > &transformation)
Ray3D< T, NP, PP > transform(const Ray3D< T, NP, PP > &subject, const Transformation3D< T > &transformation, T &tRay)
apply transformation to ray, and rescale a parameter to represent same point
Ray3D< T, NP, PP > transform(const Ray3D< T, NP, PP > &subject, const Transformation3D< T > &transformation)
apply transformation to ray
implementation details of lass::prim
set of geometrical primitives
Definition aabb_2d.h:81
Library for Assembled Shared Sources.
Definition config.h:53