Лабораторная работа №1 PHP
Оценка 4.7

Лабораторная работа №1 PHP

Оценка 4.7
Лабораторные работы
docx
информатика
Взрослым
04.04.2018
Лабораторная работа №1 PHP
По аналогии создадим класс Painter, который будет отвечать за рисование графика, а также вспомогательный класс oXY, отвечающий за рисование двухмерной координатной плоскости с необходимым шагом по оси x и y. Начнем разработку с класс оxy, как и при разработке любого другого класса, необходимо определить ключевые свойства и функции разрабатываемого объекта. Так как речь идет о координатной плоскости в двухмерном пространстве, то можно выделить следующие свойства: координаты начала плоскости, высота и ширина координатных осей, шаг деления по оси х и у в пикселях (данное свойство можно сравнить с количеством клеток в тетради, через которые мы расставляем шаги координатной сетки).
Лабораторная работа №5.6.docx
Лабораторная работа №5. По аналогии создадим класс Painter, который будет отвечать за рисование графика, а также вспомогательный класс oXY, отвечающий за рисование двухмерной координатной плоскости с необходимым шагом по оси x и y. Начнем разработку с класс оxy, как и при разработке любого другого класса, необходимо определить ключевые свойства и функции разрабатываемого объекта. Так как речь идет о координатной плоскости в двухмерном пространстве, то можно выделить следующие свойства: координаты начала плоскости, высота и ширина координатных осей, шаг деления по оси х и у в пикселях (данное свойство можно сравнить с количеством клеток в тетради, через которые мы расставляем шаги координатной сетки). Из последнего свойства вытекает необходимость в переопределении координат объектов, например, если мы имеем точку в координате (10,10) и координатную сетку с расстоянием между делениями 10 пикселей, то заданная точка на самом деле, должна будет отобразиться на координате (100,100). В связи с этим в рамках данного класса нам понадобиться метод перевода координат объекта в соответствующие им координаты на плоскости. Так же стоит учесть, что начальная точка плоскости, может находиться в любой произвольной точке, а значит при вычислении координат объекта на плоскости мы должны так же учитывать смещение начала координат. Еще одной важной особенностью отображения объектов на координатной плоскости, является различие в направлении роста оси у, так в стандартном представлении ось у растет снизу вверх, однако при работе с графическими библиотеками в программировании данная ось растет сверху вниз, это приводит к тому, что при работе с координатой у нам необходимо пересчитывать ее значение, опираясь на размер координатной сетки, координате ее начала, а так же размеру шага деления, так как эта операция должна применяться ко всем объектам, лучше всего реализовать данное преобразование в отдельной функции. class oXY extends BaseFigure { private $oXY; private $width; private $height; private $stepX; private $stepY; public function GetXY($x, $y) { return new Point( $this->ScaleX($x) + $this->oXY->x, $this->oXY->y + -1 * $this->ScaleX($y) ); //получение координат относительно оси } public function ScaleX($value) { return $value * $this->stepX; } public function ScaleY($value) { return $value * $this->stepY; } public function ChangeXY($obj) { //функция пересчитывает координаты заданного объекта, для отображения на плоскости switch(get_class($obj)) { case 'Line': >y); $obj->start = $this->GetXY($obj->start->x, $obj->start- $obj->end = $this->GetXY($obj->end->x, $obj->end->y); return; case 'Rectangle': $topLeft = $obj->GetTopLeft(); $obj->Move($this->GetXY($topLeft->x, $topLeft->y)); $obj->width = $this->ScaleX($obj->width); $obj->height = $this->ScaleY($obj->height); return; default: return; } } public function Draw($img) { imageline ($img, $this->oXY->x, $this->oXY->y, $this->oXY->x + $this- >width, $this->oXY->y, $this->getStrokeColor($img)); imageline ($img, $this->oXY->x, $this->oXY->y, 0, $this->oXY->y , $this->getStrokeColor($img)); imageline ($img, $this->oXY->x, $this->oXY->y, $this->oXY->x, 0, $this->getStrokeColor($img)); imageline ($img, $this->oXY->x, $this->oXY->y, $this->oXY->x, $this- >height, $this->getStrokeColor($img)); for($i = 0; $i < $this->width; $i += $this->stepX) { $this->getStrokeColor($img)); imageline ($img, $i, $this->oXY->y - 2, $i, $this->oXY->y + 2, } for($i = 0; $i < $this->width; $i += $this->stepX) { $this->getStrokeColor($img)); imageline ($img, $this->oXY->x - 2, $i, $this->oXY->x + 2, $i, } } public function __construct($width, $height, $stepX = 5, $stepY = 5, $oXY = null) { //по умолчанию считаем что начало координат в центре if($oXY === null) { $oXY = new Point((int)($width / 2), (int)($height / 2)); } $this->oXY = $oXY; $this->width = $width; $this->height = $height; $this->stepX = $stepX; $this->stepY = $stepY; } } Далее приступим к реализации класса Painter, который будет играть роль холста, собирающего объекты рисунка в одном месте и при необходимости, отображающего хранящиеся объекты на этом холсте, другими словами данный класс не будет сразу отрисоввывать изображение, он лишь ведет учет объектов, которые возможно придется отрисовать. Для реализации такой логики работы, нашему классу достаточно иметь 3 свойства: 1. Сам холст, 2. Массив добавленных объектов, 3 координатная сетка ( не обязательный). Так же понадобится метод, сигнализирующий о том, что нужно отрисовать изображение, а также метод, позволяющий добавить объект в массив. Можно обойтись без данного метода и добавлять объекты в массив на прямую, однако в данном случае, при наличие координатной сетки, придется не забыть перевести координаты, добавляемого объекта в соответствующие координаты, координатной сетки. Реализация данного процесса с помощью функций, позволит нам «забыть» о данном преобразовании. class Painter { private $image = null; private $oxy = null; private $elements = array(); public function __construct($width, $height, $oxy = true, $bg = array(255, 255, 255)) { $this->image = imagecreatetruecolor($width, $height); imagefill($this->image, 0, 0, imagecolorallocate($this->image, $bg[0], $bg[1], $bg[2])); if($oxy) { $this->oxy = new oXY($width, $height); } } public function Add($obj) { if(method_exists($obj, 'Draw')) { if($this->oxy !== null) { $this->oxy->ChangeXY($obj); } $this->elements[] = $obj; } } public function Draw() { if($this->oxy !== null) { $this->oxy->Draw($this->image); } for($i = 0; $i < count($this->elements); ++$i) { $this->elements[$i]->Draw($this->image); } header('Content-type: image/png'); imagejpeg($this->image); imagedestroy($this->image); } } Пример линейного графика: $input = array( array('x' => 1, 'y' => 2), array('x' => 2, 'y' => 4), array('x' => 3, 'y' => 6), array('x' => 4, 'y' => 7), array('x' => 6, 'y' => 3), ); $painter = new Painter(500, 500, true); for($i = 1; $i < count($input); ++$i) { $line = new Line(new Point($input[$i - 1]['x'], $input[$i - 1]['y']), new Point($input[$i]['x'], $input[$i]['y'])); $painter->Add($line); } $painter->Draw(); Задание: реализовать свой график.

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP

Лабораторная работа №1 PHP
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
04.04.2018