Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Пример Курсовой Программирование 1

.docx
Скачиваний:
18
Добавлен:
03.06.2015
Размер:
813.05 Кб
Скачать

Федеральное агентство по образованию

ГОУ ВПО Уральский государственный горный университет

Кафедра информатики

ОТЧЁТ ПО КУРСОВОЙ РАБОТЕ по дисциплине Программирование на языках высокого уровня на тему: «Задача по обходу плоской фигуры»

Проверил: ДРУЖИНИНА Е.А.

Выполнил: ГЛАЗМАН М.В. АСУ-09-1

Екатеринбург, 2011

Формулировка задания

Фамилия: Глазман

Имя: Михаил

Отчество: Владимирович

группа АСУ-09-1

Алгоритмический язык: JAVA ECLIPSE

Необходимо обойти простую плоскую фигуру посредством запрограммированного красящего робота и максимально закрасить её. Робот умеет находить точку отсчёта, шагать, красить клетку, в которой находится.

Описание базового класса (Image)

init () – первоначальная инициализация;

paint () – метод, отвечающий за вывод графики;

findFirst () – поиск стартовой точки робота;

fill () – окраска пути.

Описание метода решения

Для решения поставленной задачи я использовал следующий алгоритм:

  1. Создаём обходимую область

    1. Для создания простой плоской фигуры строим прямоугольник;

    2. Для усложнений плоской фигуры, достраиваем необходимое количество прямоугольников;

  2. Запускаем робота на обход.

Примеры

Листинг программы

Класс Image

package DegWork2;import java.applet.*;

import java.awt.*;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

public class Image extends Applet{

/**

*

*/

private static final long serialVersionUID = 1L;

/**Количество клеток*/

private Point dimension;

/**Размер клетки*/

private int size;

/**Смещение сетки*/

private int offset;

/**Ввод плоской фигуры*/

private int map[][];

/**Возможно ли посторить поле, возможно, при clickCount=2 */

private int clickCount;

private Point fstClick;

private FieldsManager fields;

private Robot robot;

/**Карта с номерами шагов*/

private String[][] numericMap;

/**Номер шага*/

private int nomberOfStep;

/**test variable*/

boolean flag;

int rbClickCount;

boolean stage;

public Image(){

}

public void init(){

dimension = new Point(25, 40);

size = 20;

offset = 10;

map = new int[dimension.y][dimension.x];

fields = new FieldsManager(10);

robot = new Robot(dimension.x, dimension.y, fields);

numericMap = new String[dimension.y][dimension.x];

stage = true;

flag = false;

//Инициализация карты

for (int i=0; i<dimension.y; i++)

for (int j=0; j<dimension.x; j++){

map[i][j] = -1;

numericMap[i][j] = "";

};

rbClickCount = 0;

this.addMouseListener(new MouseAdapter(){

public void mouseClicked(MouseEvent event){

//System.out.println(getCursorPos(event));

switch (event.getButton()){

case 1: clickCount++;

switch (clickCount){//Нажата левая кнопка мыши

case 1: fstClick = getCursorPos(event);

System.out.println("fst point detected");

break;

case 2: fillField(new Field(fstClick, getCursorPos(event)), 0);

clickCount = 0;

System.out.println("snd point detected");

break;

}

break;

case 3: flag = true;

nomberOfStep = 0;

rbClickCount++;

if(rbClickCount==2){

rbClickCount=0;

for (int i=0; i<dimension.y; i++)

for (int j=0; j<dimension.x; j++){

if (map[i][j] == 1){

map[i][j] = 0;

numericMap[i][j+1] = "";

}

}

} else

findFirst();

break;

}

repaint();

}

});

}

public void paint(Graphics graphics){

//Ограничение окна

this.setSize(820,520);

for (int i=0; i<dimension.y; i++)

for (int j=0; j<dimension.x; j++){

switch (map[i][j]){

case -1:graphics.setColor(Color.RED);//Заблокированные

fillSquare(new Point(j,i), graphics);

break;

case 1: graphics.setColor(Color.GREEN);//Пройденые

fillSquare(new Point(j,i), graphics);

break;

case 2: graphics.setColor(Color.YELLOW);//Пройденые

fillSquare(new Point(j,i), graphics);

break;

}

if (numericMap[i][j]!=""){

graphics.setColor(Color.DARK_GRAY);

drawChar(numericMap[i][j].toCharArray(), i, j, graphics);

}

}

drawWeb(graphics);

graphics.setColor(Color.BLUE);

}

public void findFirst(){

int i,j; j=0;

label1:

for (i=0; i<dimension.y; i++)

for (j=0; j<dimension.x; j++)

if (map[i][j]==0){

break label1;

}

System.out.println("Start from here "+new Point(i,j));

fill(new Point(i,j));

}

public void fill(Point enter){

System.out.println("fill() was started");

Point next;

if (stage){

System.out.println("Stage is "+stage);

if (enter.y-1>=-1 || map[enter.x][enter.y-1]==-1){

System.out.println("lineDown() from "+enter);

next = lineDown(enter);//Выше некуда

if (map[next.x][next.y]==0){

stage=false;

fill(next);

} else return;

}

} else {

System.out.println("Stage is "+stage);

if (enter.y+1<=dimension.x || map[enter.x][enter.y+1]==-1){

System.out.println("lineUp() from "+enter);

next = lineUp(enter);//Ниже некуда

if (map[next.x][next.y]==0){

stage=true;

fill(next);

} else return;

}

}

}

public Point lineDown(Point fst){

int length = 0;

while (map[fst.x][fst.y+length+1]!=-1 && (fst.y+length+1<dimension.x)){

map[fst.x][fst.y+length] = 1;

numericMap[fst.x][fst.y+length+1] = String.valueOf(nomberOfStep++);

++length;

}

{

map[fst.x][fst.y+length] = 1;

numericMap[fst.x][fst.y+length+1] = String.valueOf(nomberOfStep++);

++length;

}

System.out.println("The result of lineDown() is "+new Point(fst.x, fst.y+length-1));

return new Point(fst.x+1, fst.y+length-1);

}

public Point lineUp(Point fst){

int length = 0;

while (map[fst.x][fst.y-length-1]!=-1 && (fst.y-length-1>0)){

map[fst.x][fst.y-length] = 1;

numericMap[fst.x][fst.y-length+1] = String.valueOf(nomberOfStep++);

++length;

}

{

map[fst.x][fst.y-length] = 1;

numericMap[fst.x][fst.y-length+1] = String.valueOf(nomberOfStep++);

++length;

}

System.out.println("The result of lineUp() is "+new Point(fst.x, fst.y-length+1));

return new Point(fst.x+1, fst.y-length+1);

}

/**@return Координаты, пригодные для взятия значений в массиве

* */

public Point getCursorPos(MouseEvent event){

Point pos = event.getPoint();

if (pos.x>offset && pos.x<offset+size*dimension.y){

if (pos.y>offset && pos.y<offset+size*dimension.x){

pos = new Point(pos.x-offset, pos.y-offset);

return new Point((int)pos.x/size, (int)pos.y/size);

}

}

return new Point(0,0);

}

/**Изменить значения в map и добавить в fields*/

public void fillField(Field field, int color){

Point fst, snd;

fst = field.getFst();

snd = field.getSnd();

for (int i=fst.x; i<=snd.x; i++)

for (int j=fst.y; j<=snd.y; j++)

map[i][j] = color;

fields.push(new Field (fst, snd));

}

/**Закрасить клетку*/

public void fillSquare(Point coord, Graphics graphics){

graphics.fillRect(offset+size*coord.y, offset+size*coord.x, size, size);

}

/**Нарисовать сетку*/

public void drawWeb(Graphics graphics){

//Горизонтальные линии сетки

for (int i=0; i<=dimension.x; i++){

graphics.setColor(Color.LIGHT_GRAY);

graphics.drawLine(offset, offset+i*size, size*dimension.y+offset, offset+i*size);

}

//Вертикальные линии сетки

for(int i=0; i<=dimension.y; i++){

graphics.setColor(Color.LIGHT_GRAY);

graphics.drawLine(offset+i*size, offset, offset+i*size, size*dimension.x+offset);

}

}

/**Совершить роботом обход указанного поля

* @param Поле, которое необходимо обойти

* */

public void drawPass(Field field){

Point[] pass = robot.getPass(field);

Point curPoint;

for (int i=0; i<pass.length; i++){

curPoint = pass[i];//Принять точку

map[curPoint.x][curPoint.y-1] = 1;

numericMap[curPoint.x][curPoint.y] = String.valueOf(nomberOfStep++);

}

}

public void drawChar(char chr[], int i , int j, Graphics graphics){

graphics.drawChars(chr, 0, chr.length, offset+i*size+1, offset+j*size);

}

public void drawRect(Field field, Graphics graphics){

graphics.drawRect(offset+size*field.getFst().x, offset+size*field.getFst().y, size*field.getSnd().x, size*field.getSnd().y);

}

}

Класс Field

package DegWork2;

import java.awt.Point;

public class Field {

private Point fst;

private Point snd;

private Point[][] points;

public Field(Point fst, Point snd){

this.fst = fst;

this.snd = snd;

//Инвертируем вершины, если они заданы не по диагонали слева направо и вниз

int temp;

if (fst.x>snd.x){

temp = fst.x; fst.x = snd.x; snd.x = temp;

}

if (fst.y>snd.y){

temp = fst.y; fst.y = snd.y; snd.y = temp;

}

//Заполняем поле объектами Point - его экранными координатами

Point dim = getDimension();

points = new Point[dim.x][dim.y];

for (int i=0; i<dim.x; i++)

for (int j=0; j<dim.y; j++)

points[i][j] = new Point(fst.x+i, fst.y+j+1);

}

public Point getDimension(){

return new Point(Math.abs(fst.x-snd.x-1), Math.abs(fst.y-snd.y-1));

}

/**@return координаты для поля на экране по заданным координатам для данного поля*/

public Point getWindowCoord(int i, int j){

return points[i][j];

}

public Point getFst(){

return fst;

}

public Point getSnd(){

return snd;

}

}

Класс FieldsManager

package DegWork2;

public class FieldsManager {

private Field fields[];

public int countEl;//Доступно из вне, количество полей

private int maxCount;

FieldsManager(int maxCount){

fields = new Field[maxCount];

this.maxCount = maxCount;

countEl = 0;

}

public void push(Field field){

if (countEl+1<maxCount){

fields[countEl++] = field;

}

}

public Field get(int nom){

return fields[nom];

}

}