[PATCH 1/4] libcamera: geometry: Add floating-point version of Point class

Stefan Klug stefan.klug at ideasonboard.com
Mon Apr 15 12:26:22 CEST 2024


Hi Paul,

thanks for the patch.

On Fri, Apr 05, 2024 at 05:02:56PM +0900, Paul Elder wrote:
> The piecewise linear function (Pwl) class from the Raspberry Pi IPA has
> its own Point class while one already exists in libcamera's geometry.h
> header. The reason is because libcamera's Point is on the plane of
> integer, while Raspberry Pi's is on the plane of reals.
> 
> While making this a template class might be cleaner, it was deemed to be
> too intrusive of a change, and it might not feel nice to need to specify
> the type from a public API point of view. Hence we introduce a FPoint
> class to designate a Point class on the plane of reals.

Sounds reasonable to me. One thing that came to my mind is a bit
nitpicking on the name. I would name it PointF, so that the Point and
PointF types end up at similar places in alphabetical listings (docs,
type-completion etc.)

> 
> This is in preparation for copying/moving the Pwl class from the
> Raspberry Pi IPA to libipa.
> 
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
>  include/libcamera/geometry.h | 50 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 50 insertions(+)
> 
> diff --git a/include/libcamera/geometry.h b/include/libcamera/geometry.h
> index d7fdbe70..7d0c0f23 100644
> --- a/include/libcamera/geometry.h
> +++ b/include/libcamera/geometry.h
> @@ -8,6 +8,7 @@
>  #pragma once
>  
>  #include <algorithm>
> +#include <cmath>
>  #include <ostream>
>  #include <string>
>  
> @@ -49,6 +50,55 @@ static inline bool operator!=(const Point &lhs, const Point &rhs)
>  
>  std::ostream &operator<<(std::ostream &out, const Point &p);
>  
> +struct FPoint {
> +	constexpr FPoint()
> +		: x(0), y(0)
> +	{
> +	}
> +
> +	constexpr FPoint(double _x, double _y)
> +		: x(_x), y(_y)
> +	{
> +	}
> +
> +	constexpr FPoint operator-(FPoint const &p) const
> +	{
> +		return FPoint(x - p.x, y - p.y);
> +	}
> +
> +	constexpr FPoint operator+(FPoint const &p) const
> +	{
> +		return FPoint(x + p.x, y + p.y);
> +	}
> +
> +	constexpr double operator%(FPoint const &p) const
> +	{
> +		return x * p.x + y * p.y;
> +	}
> +
> +	constexpr FPoint operator*(double f) const
> +	{
> +		return FPoint(x * f, y * f);
> +	}
> +
> +	constexpr FPoint operator/(double f) const
> +	{
> +		return FPoint(x / f, y / f);
> +	}
> +
> +	constexpr double len2() const
> +	{
> +		return x * x + y * y;
> +	}
> +
> +	constexpr double len() const
> +	{
> +		return std::sqrt(len2());
> +	}
> +
> +	double x, y;
> +};

As this is in the public API, we should add documentation for it. I also
saw some tests for Point in test/geometry.cpp. These should be
duplicated for the float version.

For completeness sake, the operator!= and operator<<(std::ostream &out,
const FPoint &p) should also be copied.

Best regards,
Stefan

> +
>  class Size
>  {
>  public:
> -- 
> 2.39.2
> 


More information about the libcamera-devel mailing list