Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Shapes.h

 

#ifndef SHAPES_H

#define SHAPES_H

#include <stdexcept>

#include <valarray>

#include <algorithm>

////////////////////////////////////////////////////////////////////////////////

template< typename T >

static double bounded(T value, T minValue, T maxValue)

{

return std::min(std::max(value, minValue), maxValue);

}

template< typename T >

static double bounded(T value, T maxValue = 0.)

{

return bounded(value, 0., maxValue);

}

////////////////////////////////////////////////////////////////////////////////

struct ColorChannel

{

static const double maxValue = 1.;

ColorChannel(double value = 0);

operator double() const;

ColorChannel& operator = (double value);

// ...

private:

double value;

};

struct Color

{

ColorChannel red, green, blue, alpha;

Color(ColorChannel red, ColorChannel green, ColorChannel blue,

ColorChannel alpha = 1.);

 

static const Color blackColor;

static const Color whiteColor;

static const Color grayColor;

};

struct DrawStyle

{

Color lineColor, fillColor;

DrawStyle(Color lineColor = Color::blackColor,

Color fillColor = Color::grayColor);

};

////////////////////////////////////////////////////////////////////////////////

template< typename T, size_t D >

struct Vector

{

Vector (const T& value = 0);

Vector< T, D >& operator += (const Vector< T, D >& value);

Vector< T, D >& operator -= (const Vector< T, D >& value);

Vector< T, D >& operator *= (const T& value);

// ...

const T& operator [] (size_t dimension) const throw (std::out_of_range);

T& operator [] (size_t dimension) throw (std::out_of_range);

Vector< T, D >& makePositive();

private:

std::valarray< T > data;

};

template< typename T, size_t D >

Vector< T, D > operator + (const Vector< T, D >& left, const Vector< T, D >& right);

template< typename T, size_t D >

Vector< T, D > operator - (const Vector< T, D >& left, const Vector< T, D >& right);

template< typename T, size_t D >

Vector< T, D > operator * (const Vector< T, D >& left, const T& value);

////////////////////////////////////////////////////////////////////////////////

template< typename T, size_t D >

Vector< T, D >::Vector (const T& value)

: data(value, D)

{}

template< typename T, size_t D >

Vector< T, D >& Vector< T, D >::makePositive()

{

data = abs(data);

return *this;

}

template< typename T, size_t D >

Vector< T, D >& Vector< T, D >::operator += (const Vector< T, D >& value)

{

data += value.data;

return *this;

}

template< typename T, size_t D >

Vector< T, D >& Vector< T, D >::operator -= (const Vector< T, D >& value)

{

data -= value.data;

return *this;

}

template< typename T, size_t D >

Vector< T, D >& Vector< T, D >::operator *= (const T& value)

{

data *= value;

return *this;

}

template< typename T, size_t D >

T& Vector< T, D >::operator [] (size_t dimension) throw (std::out_of_range)

{

if (dimension > D - 1) throw std::out_of_range("dimension error");

return data[dimension];

}

template< typename T, size_t D >

const T& Vector< T, D >::operator [] (size_t dimension) const throw (std::out_of_range)

{

return data[dimension];

}

template< typename T, size_t D >

Vector< T, D > operator + (const Vector< T, D >& left, const Vector< T, D >& right)

{

Vector< T, D > res(left);

res += right;

return res;

}

template< typename T, size_t D >

Vector< T, D > operator - (const Vector< T, D >& left, const Vector< T, D >& right)

{

Vector< T, D > res(left);

res -= right;

return res;

}

template< typename T, size_t D >

Vector< T, D > operator * (const Vector< T, D >& left, const T& right)

{

Vector< T, D > res(left);

res *= right;

return res;

}

typedef double Coord;

typedef Vector< Coord, 2 > Vector2D;

#define X 0

#define Y 1

////////////////////////////////////////////////////////////////////////////////

class Figure

{

public:

virtual ~Figure();

virtual DrawStyle& getStyle();

virtual const DrawStyle& getStyle() const;

protected:

DrawStyle style;

};

template < typename T >

class Shape: public Figure

{

public:

virtual T getCenter() const { return center; }

virtual T getSize() const { return size; }

virtual void setBounds(const T& p1, const T& p2) = 0;

virtual void move(const T& destination) = 0;

virtual bool belongs(const T& point) = 0;

protected:

T center;

T size;

};

typedef Shape< Vector2D > Shape2D;

class Rectangle: public Shape2D

{

public:

Rectangle(const Vector2D& p1, const Vector2D& p2);

virtual void setBounds(const Vector2D& p1, const Vector2D& p2);

virtual void move(const Vector2D& destination);

virtual bool belongs(const Vector2D& point);

};

#endif




Переглядів: 355

<== попередня сторінка | наступна сторінка ==>
Перелік питань, які мають бути розроблені | Shapes.cpp

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.012 сек.