Задача. Да се реализират класове, представящи точка в равнината и правоъгълник със стани успоредни на координатните оси:
  • class Point
    • Представяне - две double координати
    • Конструктори (подразбиране и с координати), селектори и мутатори
    • distXto, distYto (разстояние между две точки съответно по X и по Y)
      • Колко параметъра ще имаме?
      • Функциите const ли ще са?
      • Каква е разликата дали параметър е обявен като Point p или Point const& p?
      • Ползвайте селекторите!
    • min, max (минимум и максимум на точки)
      • Функциите вземат покоординатно минимум или максимум
      • Полезни са при реализация на сечение и обединение на правоъгълници
      • Използвайте конструктор за да създадете точката - резултат
      • Може ли да върнем Point const& вместо Point? Защо?
    • translate (транслация на точка)
      • Като параметър приемаме точка, която тълкуаме като транслиращ вектор
      • Защо не трябва функцията да е const?
      • Ползвайте мутаторите, вместо да работите директно с член-данните
  • class Rect
    • Представяне - две точки по диагонала, TopLeft и BottomRight
    • Конструктори (подразбиране и с точки), селектори (getTL(), getBR()) и мутатори (setTL() и setBR())
      • Трябва да има конструктор по подразбиране с празно тяло. Автоматично се извикват конструктори по подразбиране за двете точки
      • Могат ли селекторите да връщат Point const& вместо Point? Има ли смисъл?
      • Проблем: потребителят може да подаде грешни TopLeft и BottomRight точки на конструкторите или мутаторите (т.е. например да ги размени, така че те не са наистина горна лява и долна дясна).
        • Решение: напишете функция normalize, която по подадени две произволни точки задава правилни горна лява и долна дясна точка и я викайте в конструкторите и мутаторите. Функцията normalize може да е private
    • Височина и широчина на правоъгълник
    • Лице и периметър на правоъгълник
    • Проверка дали точка е вътре в правоъгълник
    • Подправоъгълник (дали един правоъгълник се съдържа в друг, т.е. дали всичките върхове на единия се съдържат в другия)
    • Обединение на два правоъгълника (най-малкият правоъгълник, съдържащ и двата)
      • Изразете точките на обединението с помощта на min и max на точките на двата правоъгълника
      • Конструирайте резултата с конструктор
    • Сечение на два правоъгълника (най-големият правоъгълник, съдържащ се и в двата)
      • Изразете с помощта на min и max
      • Проблем: какво се получава, ако сечението е празно?
        • Решение: нужна е функция overlap проверка дали два правоъгълника въобще се пресичат. За целта може да се добавят функции betweenX и betweenY на класа Point, които определят дали една точка е между други две по X и по Y.
      • Използвайте функцията overlap за да проверите лошите случаи при сечение. Как ще върнете празен правоъгълник?
    • Разлика на два правоъгълника (най-големият правоъгълник, съдържащ се в единия и непресичащ се с другия)
    • Транслация
      • Използвайте транслация на точки
      • Защо не можем да ползваме напр. getTL().translate(p)?
    • Разпъване и свиване на правоъгълника във всички посоки с размер d.
      • Коя от функциите за точки е удобно да ползвате
      • Можете ли да използвате разпъване, за да реализирате свиване?
Да се използват построените класове, за да се намери лицето на сечението на всички правоъгълници в даден масив и периметъра на обединението им.
Последно модифициране: събота, 12 ноември 2011, 17:38