3 курс (заочка) - Кроссплатформенные технологии программирования / Лабы (выполнить первые 4)
.pdfгенераторы.Каквымоглизаметитьданныйфайлпредоставляеттакже |
|
||
некоторыеполезныеоперациидляреводаизэкранныхкоординатсистему |
|
||
координатвычисляемогофрактала. |
|
|
|
Видыфракталов,скоторыминужнобудетработать,вычисляются |
|
||
комплексномвивде |
|
ключаютвсебяпросматыеематическиефункции, |
|
которыевыполняютсямног, неоквыполнитсяратноопределенноеусловие. |
|
||
ФункциядляфракталаМандельбротаимеетвид: |
zn = zn-12 + c,гдевсезначения |
||
— эток мплексныечисла, |
z0 = 0,и с - определеннаяточк |
афрак,которуюала |
|
мыотображанаэкран.Вычислповтемдтехпорния,ряютсяпока |
|
|z| > 2 (в |
|
даннойситуацииочканаходитсяневомножествеМандельброта),илипока |
|
||
читерацийслодостигнетмаксимзначения, льногопример, 2000вэтом( |
|
|
|
случаеделает |
сяпредп,чтонаходитсяложениечкавнаборе). |
|
Процесспостф Мандельакталаоенияпрост:необхродимота перебратьвсепикселиизображения,рассчколичествоитатьерацийдля соответствующейкоордин,затемустпикснотыц,основанныйитьль нак оличерасситерацийтвечит.Всеэтобунныхсдепозжетлано,наданном
этапенеобходреализоприведенныевышемоычислать. ния
•СоздайтеподклассFractalGeименемMaвнемnвамeratordelbrot.
необудобходимоетолькоспечитьдваметода: getInitialRan |
ge()и |
||
numIterations(). |
|
|
|
• |
getInitialRange (Rectangle2D.Double) - методпозволяетгенера ору |
||
фракталовопределитьнаинтер«более»областькомплекснойснуюплоскости |
|
||
дляконкфр.Обративниманиеетногоакталанато,чметодуокачестве |
|
||
аргумперентадается |
прямоугольныйобъ,и долженкттодизменитьполя |
||
прямдляоугольтобпраженвачальнильногокадиапазонадляго |
|
||
фрактала. Примерможноувидетьметоде( |
|
|
|
FractalGeneratorВклассеMandelbrotэтот.recenterAndZoomRange()метод |
.) |
||
долженустаначаовить |
льныйдиапазонв |
(-2 - 1.5i) - (1 + 1.5i).Т.е.значенияx |
|
ибудутравныy |
-2и |
-1соответствен.5 ,ашивысотаринабудут3вны. о |
|
•МетодnumIterations(double,реализуетитеративную double)
функциюдляфракталаМандельброКонстанту. максимальнымколи чеством
итерацийможнопределитьследующимобразом:
public static final int MAX_ITERATIONS = 2000;
Затемвысможессылатьсянаэпеуремввашейреализациинную.
Обративниманато,чутнетJavaоиеподходящеготипаданныхдля
комплексныхчисел,поэт |
|
омунеобходимобудетреализитеративнуювать |
функцию,используяотдельныепеременныедлядействительноймнимой |
||
частей.Вы(можетереализоватьотдельныйклассдлякомплексныхчисел.Ваш) |
|
|
алгдолженобладатьритмбыстродействием,например, |
нестоит сравнивать|z| |
|
ссравните2; |z| |
2 с 2 2 |
длятого,чтобыизбежатьсложныхмедленных |
вычисленийквадратнкор.ТакжестяиспользоватьгоитметодMath.pow () |
||
длявычислениянебольшихстепеней,лучшеперзначениемножьте,инв ш |
|
|
быстродействиевашегокодасил |
|
ьноупадет. |
Вслучае,ес игдошелритмзначенияMAXнужноITERATIONS
вернуть -1,чтобыпоказать, тоневыходитчказаграницы.
Вашизадачи
СоздклаFractalExplorer,ссйтекотповамрыйзволитисследовать
различныеобластифрак,пуегоалаемзда |
отображения, через |
графическийинтерфеобраSwingсосб,воткиытийзванных
взаимодействиемприл льзователемжения.
Каквидноихпривышееденныхизображенийпользовательского
интерфейса, FractalExploоченьпрост,онсостоитизJFкоrame,erорый |
всвою |
очередьсодержитобъектJImageDisplay,которыйотобфраиобъекткталжает
JButtonдлясбросаизображения,необходимыйдляотображенияцелого
фракт.Данныймможнолакетсоздать,установивдляфреймаBorderLayout,
затемпоотображениеестивцент |
рмаикнопкуетасбросавюжной" "ч сти |
макета.
• КлассFractalExplorerдолженотсл живатьскольковажныхполей
длясостоянияпрограммы:
1)Целоечислоразмер« экрана»,котороеявляетсяширинвысотой
отображвпикс.Отоб( еляхнияфрабудеткжениеталав |
адратным.) |
2)СсылкаJImageDisplay,дляобновленияотображенияразных
методахвпроцессевычисленияфрактала.
3)ОбъектFractalGeneratorБудетиспользовссылканабазовый.ться классдляотобдрвидовугихаженияфракталовбудущем.
4)ОбъектRectangle2D.Double, указывающийдиапазонакомплексной
плоск,которвыводитсястинэкран.
Всевышепривполябудутимтипдоступаетьденныеprivate.
•Уклассадолженбытьконструктор,которыйприз ачениеимает
размераотобрвк ачествеженияргум,затсохраняетэтомнтазн |
|
|
|
ачениев |
|
соотвеполе,атакжествующинициалобъдиапазонаектымзирует |
|
|
|
||
фрактальгенератора.Даконструкторныйогодолженустакакиеавливать |
|
|
- |
||
либокомпSwing;онбусиендутановленыследующметоде. |
м |
|
|
|
|
• |
СоздайтеметодcreateAndShowGUIкоторый |
(), |
инициализирует |
||
графическийинтерфесодержащийSwing:объектJFrame,JimageDisplay, |
|
|
|
||
кнопкудлясбросаотображения.Используйтеjavaдля.awt.BorderLayout |
|
|
|
||
содержимогоокна;добавьтеобъектотображенизображениявпозицию |
|
|
|
||
BorderLayoutикнопкув .CENTER |
позициюBorderLayout.SOUTH. |
|
|||
Вамнеобходимодатьокнуподходящийзаг ловокбеспечить |
|
|
|
||
операциюзакрытияокнапоумолчаниюсм. етод( |
|
|
|
|
|
JFrame.setDefaultCloseOperation ()). |
|
|
|||
Послетого,какмпонентыпользовательскогоинтерфейса |
|
|
|
||
иницирализированызмещены, |
|
|
добавьтеследующуюпоследовательность |
|
|
операций: |
|
|
|
|
|
frame.pack ();
frame.setVisible (true);
frame.setResizable (false);
Данныеопераразметятцвисодержимоельноокна,сдеголают видимымокна(первнеотобначальноприхсозданииажаютсядля, го чтобы можнобылсконфигурироватьихпрежде,чемвыводитьнаэкран),
затемзапретятизменеразмеровок. ние
• Реализуйогательныйвспометодсипомдоступаprivateдля выводанаэкранфракт,можетедатьемуимялаdrawFractalЭтотме од ().
долженциклическ ипроходчерезкаждыйивтьотображенииксель..(
значенияxбудутyменятьсяодо0размераотображения),сделайте
следующее:
ØВычислитеколичествоитерацийдлясоответствующихкоординат
областиотобфра.Выможетежениякталаопределитькоордина |
тыс |
плавающточкойдляопренаборайделенногокоординатпик, селейпользуя |
|
вспометодогательныйFractalGeneratorнапример,чтобыполучить.getCoord (); |
|
координатуx,соответствующуюкоординатепиксX,сделяедующееайте: |
|
//x - пикоординатасельная; x |
Coord - координатавпространстве |
фрактала |
|
double xCoord = FractalGenerator.getCoord (range.x, range.x + range.width, displaySize, x);
ØЕсличитерацийслоравно -1т.е.точка(невыходитзаграницы,
установитепиксельчерныйцветдля( значениеrgbИн0). |
ачевыберите |
значцв,основанноениетанаколичествеитераций.Можнотакжедляэтого |
|
использцветпровстранстпосколькуоеатьHSV:значцвениета |
|
варьируетсяотдо0получается1, плавнаяпоследцветоввательность |
|
красногожелтзеленому, ,сине |
му,фиолетовомузатемобратнок |
красн!Дляэтвыможетемугоиспоследующийьзоватьфрагмент:
float hue = 0.7f + (float) numIters / 200f;
int rgbColor = Color.HSBtoRGB(hue, 1f, 1f);
Есливыприддрспособумалигойотображенияпикселейвзависимости
отк оличтпопробуйте, стварацийреализоватьего!
ØОтображеннеобходимообновлятьсоответствиицветомдля
каждогопикселя.
ØПослетого,каквызакончилиотривпикселие,вамывать
необходимообновить JimageDisplay всоостекущимветствииизображением .
Дляэтоговызовитефункциюrepaint()длякомпонента.Вслучае,есливы воспользуетесьданнымметодом,изображениенаэкранебудетобновляться!
•Создайтевнутрклассдляобраннийсоботкиытий
java.awt.event.ActionListener откнопкисброса.Обработчи |
кдолженсбросить |
диапазонкначальному,определеннгенерат,затперерисоватьмромму
фрактал.
Послетого,каквысоздалиэтоткласс,обновитеметод |
createAndShowGUI |
().
•Создайтедругойвнутреннийклассдляобрасоботкиытий
java.awt.event.MouseListener сдисплея.Вамнеобходимообработатьсобытия |
|
|
мыши,поэтвыдолжныунаследоватьмуэтотвнутреннийклассоткласса |
|
|
MouseAdapterAWT.Приполучениисобытиящелчкемышью,классдолжен |
|
|
отобразитьпиксельныекооринатыщелчкавобластьфр,заквыземала |
вать |
|
методгенератора |
recenterAndZoomRange()скоордината,покоторыми |
|
щелкнули,масштабом0Таким.5обр. ,н нажимаязомкакое |
|
-либоместона |
фрактальномотображении,выувеличиваетеего! |
|
|
Незабывайтеперерисовыватьфрактпослетого, меняетекоб |
ласть |
|
фрактала. |
|
|
Далееобновитеметод |
createAndShowGUI |
(),чтобызарегистрировать |
экземплярэтогообработчиотображениявкомпонентефра ального.
•Взаключении,вамнеобходимосоздатьстатическийметодmain()
дляFractalExplorerтак,чтоможнобыегол |
запустить.Вmainнеобходимо |
бусде: лать
ØИнициализироватьновыйэкземплярклассаFractalExplorer
размеромотображения800.
ØВызовите метод createAndShowGUI () класса FractalExplorer.
ØВызовитеметодdrawFractal()классаFractalExplorerдля
отображения ачальногопредставления.
Послевыприолнвышееденныхдейния,высможететвийдетально
рассмотретьфракталМандельбр |
ота.Есливыувеличиможетемасш,товы аб |
столкнутьсядвумяпроблемами:
• Во-первых, сможзаметить,чтовконечномитогеуровень детализацзаканч;этовызваноитем,чваетсяиакомслучаенеобходимо
более2000итерацийдляпоискаточкивомножествеМандельбр ота!Можно увеличитьмаксимальнколичествоитерац,ноэтпр замедлениюведетй
работыалгоритма. |
|
|
• |
Во-вто,псильнорых |
мувеличениимасштаба,выстолкнетесь |
пиксельнымвыводомотображения!Этовызванотем,чтоработаете пределетого,чтомпредогутзначенсплавающейтавзапятойисдвойнойть точностью.
Пририсовфрактэкрненииазнлависаетдолго.Следующая
лабораторнаяработабудетнаправ |
ленарешениеданнойпроблемы. |
Лабораторнаяработа№5Выбор. исох анени |
е фракталов |
Вданнойлаборатоработегенефрнойбудетакталовторрасширен двумяновымифункциями.Во -первых, добавитеподдержкунескольких фракталовиреализуетевозможностьвыбиратьнужныйфрактализ
выпадающегосписка.Во -вторых,выдобавитеподдесохржкуане ниятекущего изображениявфайл. Нижепривескриншот,гпродемонстрировано,как будетвыглядетьноваяпрограмма
Рисунок5Графическ.5. |
ийинтерфейсновогоприложения |
|
Верхняяпанельгенефравкторалючаетталовсебявиджета2, |
|
|
позвпользовяющихвыбирафрак,нижтелюпаньвключаетяяель |
|
|
себякнопку"SaveкотсоImage",храняетраятекущееизобфра. женияктала |
|
|
Таккактеперьбуд |
етнесколькоисточниковсобытий(action |
-event |
sources),высможетепопрактиквобрабвсехисточниковватьсятке |
|
|
использоднметодаActionListenerгованиемвашемклассе. |
|
|
Поддержканесколькихфракталов |
|
|
|
|
ТаккаквреализбылавведенаабстракцияциюFracta |
|
|
lGenerator, |
|
добавлениенесколькихфракталовбудетпроблем.Вданнолабораторной |
|
|
||
рабвыдобавитеподдержкунесколькихфракталов,пользсм вательжет |
|
|
|
|
выбиратьмеждун, миспользуя |
|
combo-box.Программныйинтерфейс |
Swing |
|
(Swing API)предоставляет |
combo-box черезкласс |
javax.swingа |
.JComboBox, |
|
такжезапускает |
ActionEvents привыбореновогоэлемента.Необходимосделать: |
|
|
•Создатьновые2 реализацииFractalGenerator
Первымбудетфрактал |
tricorn,котдонаходитьсярыйлженвфайле |
|
||
Tricorn.java.Дляэтогон |
ужносоздатьподкласс |
FractalGenerator иреализация |
||
будетпочтиидентичфракталуМан,кромедельбротадвухизменений.Вы |
|
|
|
|
дажеможетескопирисхфродвМандельбертаныйтькталаипросто |
|
|
||
внестиследующиеизменения: |
|
|
|
|
Ø |
Уравнимеетвидние |
zn = zn-12 |
+ c.Ед инственнотличиетольков |
|
том,что |
используетсякомплексноесопряжение |
zn-1 накаждойитераци |
и. |
|
Ø |
Начальныйдиапазондлятрехцветногофрактала |
долженбыоть |
(- |
|
2, -2) до (2, 2). |
|
|
|
|
Втофрактал,которыйнеобходимореализовать |
- этофрактал«Burning |
|||
Ship», которыйвреальнепохожнапылающийстикор.Данныйфракталбль |
|
|
||
имеслесвойствадующие: |
|
|
|
|
Ø |
Уравнимеетвидние |
zn = (|Re(zn-1)| + i |Im(zn-1)|)2 + c. Другими |
||
слов,выберетеабсолютмизначекаждогокомпноеи нента |
|
zn-1 накаждой |
||
итерации. |
|
|
|
|
Ø |
Начальныйдиап |
азондляданногофракталадолженбыоть |
|
(-2, -2.5) |
до (2, 1.5).
•Сombo -boxeв Swingможетуправколобъектовлятьекцией,но
объектыдолжныпредоставлятьметод |
toString()Убедитесь. ,чтовкаждой |
|
реализациифракталметодtcnmв |
toString(),котвозвращарый |
етимя, |
например«Mandelbrot», «T |
ricorn» и «Burning Ship». |
|
• |
Настроить |
JComboBox ввашемпользовательскоминтерфейсе |
|
можносисп конструкторальзованиембезпараметров,затемиспользовать |
|
||
метод addItem(Object)длятого,чтобыдобавитьреализациивашегоге |
нератора |
||
фракт.Какукаловзывалосьпредыдущемшаге,выпадающийсписокбудет |
|
||
использоватьметод |
toString ()ввашихреализацияхдляотображения |
|
|
генератороввыпадающемсписке. |
|
|
|
Необходимобудеттакжедобавитьобъект |
|
label вразрабатываемый |
|
пользовательскийинтепередвыпадающимфейссписком, |
вкачестве |
||
поясненияквыпадающсписку.Этом сджно,создавелатьмуобъектвый |
|
||
Jpanel идобавивнегообъекты |
JLabel и JcomboBox,азатемразместитьпанель |
||
напозиции NORTH навашеммаокна. ете |
|
||
Инаконец,необход |
имодобавитьподдержку |
выпадающего спискав |
|
реализацию ActionListener.Вслучае, лиобытиепосотвыупилоадающего |
|
||
списка, |
выможетеизвыбранныйлэлементчьизвиджустановитьего |
|
|
качтекущегоствегенефра.Используйтекталовтора( метод |
|
getSelectedItem()) |
|
Приэтомнезабудьтесброситьначалдиапазонпереныйфрактал!исовать |
|
||
Нижепризобведеныфракталов«Tricorn»жения |
Burning Ship»для |
||
провеправильностикиаботыалгоритма |
|
|
Рисунок5Фра.6.«Tricorn»тал
Рисунок5Фра.7.« тал |
Burning Ship» |
СохраненияизображенияФрактала