3 курс (заочка) - Кроссплатформенные технологии программирования / Лабы (выполнить первые 4)
.pdfВыможетещелкнутьпоразличным |
вадратам,чтобысделатьизних |
барьерыкрасные( )илипроходимыеклеткибелые( )С. клеткиниеобозначают |
|
началоиконецпути.Нажавнакнопку"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,которогобунаслдутвсвашифрактальныедованы