Скачиваний:
36
Добавлен:
15.02.2021
Размер:
804.3 Кб
Скачать

Выможетещелкнутьпоразличным

вадратам,чтобысделатьизних

барьерыкрасные( )илипроходимыеклеткибелые( )С. клеткиниеобозначают

 

началоиконецпути.Нажавнакнопку"FindпрограммавычислитPath",путь

 

используяалгоритмА*,затеотобразитегозеленымцве.Вслучаееслиом

 

путьнебудетнайден,топрограмманетобразитстопуть.

 

АлгоритмA*содержитмногоинфдлярмациитслеж,классывания

 

Javaидеальнопо такляходятродазадач.гоСуществуетдваосновныхвида

 

инфдляормацииганизацииуправленияалгор тмом

A*:

Локации – этонаборыкоордиконкреклетокнадвумернойных карте.АлгоритмдолженA*иметьвозможностьссылатьсянаопределенные

местанакарте.

Вершины - этоотдельныешагинапути,которыегенерирует

алгоритмА*На. ,примеродемонстрированныевышезе

леныеячейки

- это

последовательностьвершиннакарте.

 

 

Каждаяпутевточкавлследующейетя информацией:

 

 

Ø

Расположениеячейкидлявершины.

 

 

Ø

Ссылканапредыдущуювершинумаршр.Конечныйутьа

 

- это

последвершинопунктавательностьназначениядоисход

нойточки.

 

ØФакстическаяоимостьпуначальнместопд голожения

текущейвершиныпоопределенномупути.

ØЭвристическаяоценкаприблизитель( оценка)остаточнаяой стоимостипутекущейвершиныдоконц. чнойли

ТаклгоритмкА*строитсвойпу ь

,ондолжениметьдваосновных

наборавершин:

 

Первыйнабхранито"ткрытыевершвершины"или,которые всеещедолжныучиталгоритмомАваться*.

Второйнаборхранитзакрытые" вершвершины"ил ,которые

ужебылиучтеныалгоритмомA*ихненужнобу

детбольшерассматривать.

КаждаяитерацияалгоритмаА*довольнопроста:найтивершину

 

наименьшейстоимоспутиизнабораоткрытыхьювершин,сделатьшаг

 

кажднаправленсозданияоэтоймвершдляиныоткрытыхвыхвершин,а

 

затпереместитьвершины

зоткрытогонаборавзакрытый.Этоп вторяется

дотехпор,поканебудетдосконигнутаве!ршиначнвремяЕсливоэтого

 

процессазаканчиваюоткрытыевершины,топуначальнойсявершиныдо

 

конвершинычнойнет.

 

Даннобрвпервуюаяботкаочередьзави

ситорасположениявершин,

поэтомуоченьполезносохраняпуточотображениеевыекакь

 

местопдосооложентве.Такимтствующихршобразом,выйнбудете

 

использоватьхранилищеjava.

util.HashMapдлякаждогоизэтихнаборовс

объектLocationв ачествми

еключей,иобъектWaypointв амичестве

значений.

 

Прчемначатьжде

Прчемначатьжде,вамнеобходимоскачатьисходнфайлдляданнойые

лабораторнойработы:

Map2D.java - представлякарту,покотопереоймещается алгоритмА*,включаясебяинфопроходимостимациюячеек

Location.java - этоткласспредставляеткоординатыконкретной

ячейкинакарте

Waypoint.java - представляетотдельныевершины

сгенерированномпути

AStarPathfinder.java - этотклассреалгориизуетпоискапуА* м

ввидестатическогометода.

AStarState.java - этотклассхранитнабороткзакрытытых вершин,ипредоставляосновныоперации,необходимыедлят

функциалгорпоисканА*.рованиятма

AStarApp.java - простоеSwing

-прил,котороеобж спечиваетние

редактируемыйв

ид2D

-карты,изапускаетпоискпутизапросу

 

JMapCell.java - этоSwing

-компонент,которыйисподльзуется

отображсостоянияячеекнакарте

 

 

 

Обратитевнимание,чтоп

риложбуспешнодкомпилироватьсяние

томвиде,какоеоноесть,нофункцияпоискапутинебудетраб,повынеткать

завершзадани.Ед теклассынственные,которыедолжныизменитьэто

LocationиAStarStateВсеостальное.

- этокплатфд,которамы

япозволяет

редактировапоказыватькартупуть,которыйгенерируеталгоритм.Не(

рекомендуетсяредактироватьисходдругихфайловный)

Локации

ДляначаланеобходимоподготовитьклассLocationдлясовместного

использклассамиколлекцииванJavaПо я.

сколькувыбудетеиспользовать

контейневыполдляхешидляровданзаданияного,тоениядляэтого

необходимо:

Обеспечитьреализациюметодаequals ().

 

Обеспечитьреализациюметодаhashcode().

 

Добавьтереализациюкаждогоэтихметодовкласс

Location,следуя

шабвкл.Послеонамасэтоговыожетеиспоклассьзовать

Locationв

качестве ключевоготипаконтхешированияйнерах,такикакHashSet

 

HashMap.

 

 

СостоянияА*

Послетого,каккласс

Location готовкиспользованию,выможете

завершреализть

ациюклассаAStarStateЭтокласс,котпорыйддерживает.

наборыоткрытизакрвершины,поэтомутыхондействительнообеспечивает

основнуюфункциональностьдляреализацииалгоритмаА*.

Какупоминалосьранее,состА* изяниестоитдвухнабороввершин,

один изоткрытыхвершиндругойиззакрытых.Чтобыупроститьалгоритм,

вершиныбудутхранитьсяхэш -карте,гдем стоповершинявложениеяется ключом,асамивершиныявляютсязначен.Такобри,увямиабудетзомс такойтип:

HashMap<Location, Waypoint> (Очеви днвыизвсегойводэтогозаключвтом,чтос аждымется

местоположенинакартеможетбытьсвязанатолькооднае.ршинам)

Добавьнестатичедва( )повкласяAStarStateсстакимхтипом,одно

дляоткрытых" вершин"другойдлязакрытых" вершин"Кроме. того,не забудьтеинициализироватькаждэтихп дляессылкиейнановуюпустую коллекцию.

Послесозданияинициализполей,выдолжныреацизоватьи следующиеметодывклассAStarState:

1)public int numOpenWaypoints()

Этотмевозвращаетодколичество

точеквнабореоткрытыхвершин.

2)public Waypoint getMinOpenWaypoint()

Этафункциядолжнапровсвернаборешиныитьоткрытыхвершин,

 

ипослеэтогоонадолжверссылкуннаутьвершнаиобщейменьшейну

 

стоимостью.Есливоткрытом" "набонетве, ешин

функциявозвращает

NULL.

 

Неудаляйтевершинуизнаборапослетого,квывернуликее;просто

 

вернитессылкунаточкунаименьшейобщейстоимостью.

 

3)public boolean addOpenWaypoint(Waypoint newWP)

ЭтосамыйсложныйметодвклассесостояА*Да. методнныйий усложто,чтодолженяетдобавлятьуказаннуювершинутолькотом случае, лиуществующаявершинахуженов.Вчтодйделатьлженэтот метод:

Есливнабореоткрытых« в »ршинвнастоящеевремянетвершины

дляданногомест,тонепопросложениябхдимо

тодобановершинуитьую.

Есливнабореоткрытых« в »ршинужеестьвершинадляэтой

 

локации,добановершинуьтеуютольковтомсл,еусчаелитоимостьпутидо

 

новойвершиныменьшестоимостипутидотекущей. Убедитесь(,что

 

испнеользбщстоимостьу. етею

)Другимисловами,еслпутьчерезновую

вершинукороче,чемпучерезтьекущуювершину,замт книтевершинущую

 

нановую

 

 

Каквымоглизаметить,чвакомслучаевампотребуетсяизвлечь

 

существующуювершинуизоткры« набора»,еслиакогомеется.Двая

анный

шагдовольнопрост

- заменитепредыдущуюточкунановую,используяметод

HashMapкоторыйзаместарое.put(),нитачениенановое.Пустьданныйметод вернетзначенвершинаtrue,еслноваябылауспешнодобавленанабор,и falseвпротивномслучае.

4)public boolean isLocationClosed(Location loc)

Этафункциядолжнавозвращатьзначениееслиtrue,указанное местоположвстречаетсянабозаквершинниеытых, falseпротивном

случ.Таккакз крытыевершиныхранятсяхэш

-касрасположениямитев

качествеключевыхзначений,данныйметоддостаточнопростовреализации.

 

5)public void closeWaypoint(Location loc)

Этафункцияперемещаетвершинуизнабораоткрытых« вершин»набор

«закрытыхвершин»Так.каквершиобозначеныместоположением,метод принимает естоположениевершины.

Процессдолженбытьпростым:

Удалитевершину,соответствующуюуказаннместоположениюму

изнабораоткрытых« вершин».

Добавьвершину,ковытудалилиорую,внаборзаквершинытых.

Ключомдолжноявлятьсяместоположениеточки.

Компиляциятестирование

Кактольковыреализуетевышеф канкциональность,запуститенную программупоискапу,чтпроверобыправеевыполненияльность.Если реализовсеправи,тоунедолжсьноивозпроблемникнутьпри созданиипрепятствийосле дующимпоискомпутейвокругних.

Скомпилируйтезапуспрограите, авсжемму: гда javac *.java

java AStarApp

Лабораторнработа№4:Рисованиефр кталовя

Вследующихнесколькихлабораторныхрабвы здадитенебольшое

JAVA-приложение,котороес можетрисоватьфракталы.Есливын некогда игралисфракталамираньше,выбудудивленытем,какпростоможно

создкризображсивыеть.Этобудеспомощьютланонияфреймворка

 

SwingиJavaкотпAPI,орыйзволяетсоздграфическиеватьпользовательские

 

интерфейсы.

 

Начальнаяверсприбудетложедовольнопроста, ия

 

следующихлабораторудутотахдобавленынекоторыеыхполезные

 

фунтакиекак,циисохрасгенеризображеи,рованныхий

 

возможностьпереключениямеждуразл фракталодамичными

в.И

графическийинтерфе(GUI),механизмдляподдержкисразличных

 

фракталовбудутзавиерархийсетьклассов.

 

Вотпростойпримерграфичинтвеначальномскогорфейса

 

состоянии:

 

Рисунок5Пример.2графич. интерфейсаского

И,вотнекоторыеинтерес

ныеоблафрактала:слонытиморскиеконьки!

Рисунок5Фра.3.Слоны« »тал

Рисунок5Фра.4.Морские« конькитал»

 

Созданпользовательскогоинтерфейса

 

Прчемрисоватьждефракталы,необходимосоздграфическийть

 

виджет,которыйбудетихотображать. Swi

ngнепредоставляеттакой

компонент,ноегооченьпросоздатьамостоя.Обравниманиенательноите

 

то,чтовэтойлабораторнмыбудемотеиспширользйспеокватьийтр

 

классовJavaиSwing,деталиAWTкоторыхздесьбудутнераскрыты.Дляболее

 

подробнойинформациивыможетевоспользоватьсяонлайн

-документамипо

APIПростоперейдитеJavaкпакету.данногоклассаJava,выберитесамкласс,

 

затемпрочтитеподробнуюинфортом,какиспоациюкл. ассьзовать

 

СоздклассйтепроизводныйJImageDisplay,от

javax.swingКлассадолжениметь.JComponentоднополестипомдоступа. private,экземпляпjava.awtКласс.imageBuffуправляетBufferedImage. .

изображен,содержкоторогоможнзаписатьеммое.

КонструкторJImageDisplayдолженприниматьцелочисленные значенияш высотырины,инициализироватьобъектBufferedImageновым изображениемсэтойширинвыстип, йоймбражения

TYPEТипопределяетINT,какцветааждогоRGBпикселябудут.

представленыизобр;зн чениеженииTYPEобозначает,чтоINT RGB

красные,зеленыеисиниекомпонентыимеютби8,представленныеов

формintвуказанномпорядкете.

КонструктортакжедолжвызватьметодsetPreferredSize()

родительскогокламетодуказаннойсаширинвыс.Выдолжны( той

будетепередатьэтизнач

ениявобъектjavaТаким.awtобразом,.Dimension)

когдавашкомпонентбудетвключенпользовательскийинтерфейс,он

отобразитнаэкраневсеизображение.

ПользкомпонентыватеSwingдопредоставлятььскиежнсвой

собственныйкоддляотрисовки,переопределя язащищенныйметодJComponent paintComponentТаккакнашомппрвывонент(Graphicsстонаэкрандит g).

данныеизобр, еабудпростализацияженияоч !ньВо -пер,нужновсегдаых вызыватьметодсуперклассаpaintComponentтак,чтобыобъекты (g)

отображалисьправильно.Послевызоваверсиисуперкласса,выможете нарисоватьизображениекомпоненте,используяследующуюоперацию:

g.drawImage (image, 0, 0, image.getWidth(), image.getHeight(), null); (МыпередазначдляnullениемImageObserver,посколькуданная

функциональностьнетребуется.)

Вытакжедолжнысозддвмеастоьступомдаpublicдлязаписи данныхвизображение:методclearImageкоторыйустанавливаетвсепиксели(),

изображениявчерныйцветзначение( RGBметодdrawPixel0), (int x, int y, int rgbColor),которыйустанавливапиксельопредцв.Обаметодаленный будутнеобходимыдляиспользвметsetRGBоклассадеванияBufferedImage() .

Незабывайтепрок мментарии!

ВычислефракталаМандельбротаия

Следующдлявашазад:накодписатьч вычи

сленияфрактала

Мандельброта.

Длясозданияфрактаиспользследовисходныйуфайлющиййте

FractalGenerator.java,которогобунаслдутвсвашифрактальныедованы