Php log faylidan grafiklar chizish. - WA sharhlari

Ko'pgina hollarda, ma'lumotlarning grafik taqdimoti ma'lum bir vaziyatda eng mos keladi. Agar diagrammalar ham interaktiv bo'lsa, bu juda zo'r! Nima demoqchiman? Diagramma elementini bosish boshqa diagrammani ochadi.

Bog'langan diagrammalar nima?

Shu paytgacha bunday diagrammalar faqat bitta ma'lumotlar oqimiga to'g'ri kelgan va bir-biri bilan to'liq bog'lanmagan. Agar biz oldinga va orqaga harakat qilishimiz mumkin bo'lgan diagrammalar tuzsak nima bo'ladi? Bu diagrammalar bog‘langan diagrammalar deb ataladi va yangi FusionCharts 3.2 paketining bir qismi bo‘lib, bir manbadan ko‘p darajali diagrammalarni yaratish imkonini beradi. Bunday diagrammalarda hamma narsa bir-biri bilan bog'liq.

Ushbu qo'llanmada biz bunday diagrammalarni kichik loyihaga birlashtirishni ko'rib chiqamiz. Baza MySQL ma'lumotlari ma'lumotlarni o'z ichiga oladi, PHP elim yaratish vazifasini bajaradi XML fayl, FusionCharts ushbu faylni qabul qiladi va ma'lumotlarni chiqaradi.

Bog'langan diagrammalar haqida bir necha so'z:

  • Odatiy bo'lib, asosiy diagramma ota-ona bilan bir xil ko'rinishga ega (masalan, ustunli diagrammalar);
  • Qo'shimcha sozlamalar ierarxiyaning istalgan darajasiga, jumladan, diagramma turining o'ziga qo'shilishi mumkin;
  • Diagrammalar HTML konteynerlarida, jQuey dialoglarida, layt qutilarida, extJS oynalarida va hokazolarda joylashtirilishi mumkin;
  • Voqealar uchun JavaScript-ni qo'llab-quvvatlash;

Biz nima qilmoqchimiz?

Ko'p marta biz saytlarimizga tashrif buyuruvchilarning o'sishini kuzatish vazifasiga duch keldik. Shunday qilib, keling, bir oy/kun/soatda ro'yxatdan o'tgan foydalanuvchilar sonini yoki boshqacha qilib aytganda, ma'lum vaqt oralig'ida saytimizda ro'yxatdan o'tgan foydalanuvchilar sonini ko'rsatadigan kichik loyiha yarataylik.

Talablar:

  • PHP bilan har qanday veb-server;
  • Ma'lumotlar bazasi bilan MySQL serveri;
  • Ularning veb-saytidan yuklab olishingiz yoki sotib olishingiz mumkin bo'lgan FusionCharts;

0-bosqich. Tayyorgarlik

Fctutorials deb nomlangan bo'sh ma'lumotlar bazasini yarating.

Veb-serveringizning ildizida fcdemo deb nomlangan bo'sh papka yarating (odatda www)

Qadam 1. Ma'lumotlar bazasini tayyorlang

Oddiy bo'lishi uchun biz faqat bitta foydalanuvchilar jadvalidan foydalanamiz, unda foydalanuvchilar haqidagi ma'lumotlar ko'rsatiladi. Bizni faqat foydalanuvchilarning ro'yxatdan o'tish vaqti qiziqtiradi. Shunday qilib, bizning jadvalimiz faqat ushbu ma'lumotlarni o'z ichiga oladi. Ushbu kodni phpMyAdmin-ga joylashtiring:

JADVAL YARATISH `foydalanuvchilar` (` ID` int (10) unsigned NO NULL AUTO_INCREMENT, `Time` vaqt tamg`asi NOT NULL DEFAULT" 0000-00-00 00:00:00 ", BIRINCHI KEY (` ID`), KEY `Vaqt` (`Vaqt`))

Biz ikkita maydonni o'z ichiga olgan jadval yaratdik: ID va vaqt. Vaqt foydalanuvchini ro'yxatdan o'tkazish vaqti haqida ma'lumotni o'z ichiga oladi. E'tibor bering, biz ushbu maydonga indeks qo'yganmiz, chunki biz ko'p WHERE bandlaridan foydalanamiz. Indeks bizga namuna olish jarayonini tezlashtirishga imkon beradi.

Bazaga ulanish

Keling, ma'lumotlar bazasiga ulanish uchun kichik skript yozamiz:

Sozlamalarni o'zingizniki bilan almashtiring va ushbu faylni fcdemo papkasida connect-to-database.php nomi ostida saqlang.

Tasodifiy ma'lumotlarni kiriting

Agar bu haqiqiy loyiha bo'lsa, foydalanuvchilar jadvali vaqt o'tishi bilan o'sib boradi, ammo namoyish qilish uchun biz ba'zi ma'lumotlarni kiritishimiz kerak. Keling, jadvalga tasodifiy ma'lumotlarni kiritadigan kichik skript yozaylik. Quyidagi kodni tushunmasangiz, tashvishlanmang - bu qo‘llanma uchun muhim emas.

Genere-random-data.php deb nomlangan ushbu faylni barchasini bitta papkada saqlang.

Birinchidan, biz ma'lumotlar bazasiga ulanish faylini qo'shamiz. Keyin biz foydalanuvchini ro'yxatdan o'tkazish vaqti tasodifiy tanlanadigan vaqt oralig'ini belgilaymiz. Siz kiritilgan qatorlar sonini o'zgartirishingiz mumkin. Buning uchun $ RecordsToInsert o'zgaruvchisini sozlashingiz kerak.

Keyin yaratilgan yozuvlarni ma'lumotlar bazasiga kiritish uchun skriptni ishga tushiramiz. Ushbu jarayonni boshlash uchun ushbu manzilga o'ting - http: //localhost/fcdemo/generate-random-data.php.

Oxir-oqibat siz xabarni ko'rishingiz kerak: "($ RecordsToInsert) Yozuvlar kiritilgan"

Qadam 2. Sayt skeletini tayyorlash

Biz eng ko'p yaratishimiz kerak oddiy sahifa diagramamizni ko'rsatish uchun. Shunga o'xshash narsa:

FusionCharts v3.2 - LinkedCharts PHP demo

Ushbu faylni demo.html sifatida saqlang:

  • Bobda biz FusionCharts.js JavaScript kutubxonasini o'z ichiga olamiz. Siz uni FusionCharts zip faylidagi Charts jildida topishingiz mumkin.
  • Bobda biz diagrammamiz uchun konteyner yaratdik.
  • FusionChart obyektini quyidagi parametrlar bilan ishga tushiradigan kichik kod qismi yaratildi:
    • Diagrammalar / Column3D.swf - swf fayl manzili. Ushbu misol uchun biz Column3D diagrammasidan foydalanamiz.
    • myChartId - bu diagrammaning identifikatori. Agar biz bir nechta diagramma yaratsak, kerak bo'ladi.
    • Keyingi 2 parametr diagrammaning kengligi va balandligidir.
  • myChart.setXMLUrl ("get-data.php? yil = 2010"); - ma'lumotlar manbasini belgilaydi. Ushbu qator yordamida ma'lumotlar get-data.php?Yil = 2010 sahifasidan XML faylidan olinishini ma'lum qilamiz. Ushbu bosqichni tugatgandan so'ng get-data.php faylini yozamiz.

Shunday qilib, biz FusionCharts paketidan 2 ta fayldan foydalandik. Hamma narsa ishlashi uchun ularni fcdemo / Charts papkasiga tashlashingiz kerak.

3-qadam. Orqa tomonni tayyorlash

FusionCharts XML yoki JSON ma'lumotlari bilan ishlaydi. Biz XML dan kengroq auditoriyaga tanish bo'lgani uchun foydalanamiz. Ma'lumotlar faylida nafaqat diagramma ustunlari uchun ma'lumotlar, balki sarlavhalarni loyihalash uchun elementlar ham bo'lishi mumkin. Biz tizimimizni shunday qilishimiz kerakki, PHP ma'lumotlar bazasidan ma'lumotlarni o'qiydi va quyidagi turdagi XML faylini yaratadi:

Ma'lumotlar shunday ko'rinishi kerak. Barcha statistik ma'lumotlar diagramma tegiga joylashtirilishi kerak. Bundan tashqari, siz uslublar va sarlavhalar uchun mas'ul bo'lgan boshqa teglarni ko'rishingiz mumkin.

Endi ma'lumotlar bazasidan ma'lumotlarni oladigan va undan XML fayl yaratadigan get-data.php faylini yaratamiz:

"; // Diagrammaning XML tanasini yarating: foreach ($ ReultArray sifatida $ kalit => $ val) // kalit - oy raqami (1-12) $ Chiqish. =" "; // XML $ Chiqish diagrammasini yoping. =""; // XML sarlavhasini o'rnatish (" Kontent turi: matn / xml "); // Echo $ Chiqish;?>

Ushbu faylni get-data.php sifatida saqlang. Keling, kodni ko'rib chiqaylik:

  • Avvalo, biz kiruvchi ma'lumotlarni filtrlaymiz $ _GET ["yil"];
  • Keyinchalik, ma'lum bir yilda saytimizda ro'yxatdan o'tgan foydalanuvchilar sonini hisoblaymiz. Natija GROUP BY yordamida guruhlangan.
  • Keyin oylar sonining $ ResultArray massivini hosil qilamiz.
  • Diagrammaning nomini X-Axis o'zgaruvchisiga yozamiz.
  • Biz ma'lumotlar bazasiga ulanamiz va so'rov yuboramiz.
  • Keyin natijani qatorga qatorga ko'chiramiz. Agar so'rov natijasida ro'yxatdan o'tgan foydalanuvchi topilmasa, u holda biz 0 qiymatini ko'rsatmoqchimiz. Shuning uchun biz $ ResultArray massivida nollarni yozdik. Bu massivni tartiblash uchun talab qilinadi.
  • Keyinchalik, biz XML faylining sarlavhasini yaratamiz. Biz diagramma haqida barcha kerakli ma'lumotlarni $ ChartHeading da yozamiz. Darhol barcha kerakli sarlavhalar va ranglarni o'rnating.
  • Keyinchalik, $ Output o'zgaruvchisiga satrlarni birlashtirib, XML faylimiz tanasini tayyorlaymiz. U erda hamma narsa teglar .
  • XML hujjatini to'ldirish uchun biz uni teg bilan yopamiz .
  • Dastur qanday format bilan shug'ullanishi kerakligini tushunishi uchun biz kontent turi qiymatini ham o'rnatamiz.

Yaratilgan XML kodini ko'rish uchun http: //localhost/fcdemo/get-data.php? Yil = 2010 ga o'ting.

Ushbu bosqichning boshida ko'rgan narsangizga o'xshash narsani ko'rishingiz kerak.

Kel urinib ko'ramiz

Endi hamma narsa tayyor, biz misolimizni sinab ko'rishimiz mumkin. Brauzeringizni oching va http: //localhost/fcdemo/demo.html saytiga o'ting.

Agar siz hamma narsani to'g'ri bajargan bo'lsangiz, sahifangizda quyidagi diagramma ko'rsatiladi:

Qadam 4. Bizning diagrammamizni bog'langan diagrammaga aylantirish

Diagrammamizni bog'langan diagrammaga aylantirish uchun biz qaysi parametrni bolalar diagrammasiga o'tkazishimizni hal qilishimiz kerak. Biz butun ma'lumotlar qatorini yoki ma'lumotlar URL manzilini o'tkazishimiz mumkin. Agar siz birinchi holatni tanlasangiz, unda har bir bola uchun ma'lumotlar ota-ona diagrammalariga kiritiladi va ular orasidagi munosabatlar noyob identifikatorlarga asoslanadi. Bizning holatlarimizda bizda juda ko'p turli xil diagrammalar mavjud (12 oy, 30 kun, 24 soat). Shunday qilib, biz ma'lumotlarni uzatish uchun url qatoridan foydalanamiz. Shunday qilib, biz qilishimiz kerak bo'lgan yagona narsa ma'lumotlarni hotspotlardagi URL bilan bog'lashdir (bosilganda yangi diagramma ochadigan nuqtalar).

Keling, PHP kodini yaxshilaymiz:

Oylar, kunlar va soatlar bo'yicha tanlov qilishimiz kerakligi sababli, PHP kodini biroz o'zgartirishimiz kerak. Keling, avval uni ko'rib chiqamiz va keyin uni qismlarga ajratamiz.

"; // Diagrammaning XML tanasini yarating: switch ($ Turi) (standart: case" oylik ": foreach ($ ResultArray as $ MonthNumber => $ qiymati) // Oylar (1-12) $ Chiqish. =" "; break; case" daily ": foreach ($ ResultArray as $ DayNumber => $ qiymati) // Kunlar (1-31) $ Chiqish. =" "; break; case" soatlik ": foreach ($ ResultArray as $ HourNumber => $ qiymati) // Soat (0-23) $ Chiqish. =" "; break;) // XMLni yopish: $ Chiqish. ="; // XML sarlavhasini o'rnatish (" Kontent turi: matn / xml "); // Echo $ Chiqish;?>

Biz nimani o'zgartirdik?

  • Endi bizda bir nechta turdagi diagrammalar mavjud bo'lganligi sababli, diagramma turi bizga $ _GET orqali uzatiladi. $ Oy va $ Soat va $ Yil bilan bir xil;
  • Keyin oylar nomlarini o'z ichiga olgan $ MonthNames massivini yaratamiz. Massiv noldan boshlangani uchun birinchi element null;
  • Endi, turiga qarab, $ Query, $ ResultArray, $ ChartHeading va $ XAsixName o'zgaruvchilari kommutatorga tayinlanadi. Agar $ Type o'rnatilmagan bo'lsa, sukut bo'yicha oylar ko'rsatiladi;
  • Keyinchalik, biz ma'lumotlar bazasiga ulanamiz, so'rovni bajaramiz, natijani massivga nusxalaymiz va xml faylining birinchi qismini hosil qilamiz;
  • Keyinchalik, biz XML faylining tanasini yaratamiz. Tana diagramma turiga bog'liq bo'lgani uchun biz yana switchdan foydalanamiz;
  • Oyning: havoladan tashqari hamma narsa bir xil. Endi u shunday bo'ladi: newchart-xmlurl-get-data.php; newchart - biz yangi diagramma yaratayotganimizni aytadi, xmlurl - ma'lumotlarni qaysi manzilda qidirish kerak. Keyingi hamma narsa URLning bir qismidir. Yanvar oyi uchun toʻliq havola: newchart-xmlurl-get-data.php? Turi = soatlik & Yil = 2010 yil va Oy = 1
  • Kunlar: Oy uchun ham xuddi shunday, faqat URLda kunlar haqidagi ma'lumotlar mavjud;
  • Soat: agar biz boshqalar ushbu diagrammaga amal qilishini istamasak, biz unga URL manzilini o'rnatmaymiz;
  • Oxirida XML-ni yoping;

Ushbu faylni get-data.php sifatida saqlang; Endi brauzeringizni oching va skriptni sinab ko'ring. Masalan: http: //localhost/fcdemo/get-data.php? Yil = 2010

Siz shunga o'xshash narsani ko'rishingiz kerak:

Sinov

Endi biz diagrammalar bilan to'liq tugatdik. Ishni tekshirish uchun http: //localhost/fcdemo/demo.html saytiga o'ting

Agar siz hamma narsani to'g'ri bajargan bo'lsangiz, sahifada Column3D diagrammasini ko'rasiz. Agar siz ustunlardan birini bossangiz, yangi diagramma ochiladi. Va boshqalar…

Xulosa

Agar siz ushbu darsni diqqat bilan o'rgangan bo'lsangiz, ehtimol siz PHP / MySQL-da ulangan diagrammalar haqida asosiy tushunchaga egasiz. Aynan shu diagrammalar quyidagi statistik ma'lumotlar uchun tuzilishi mumkin:

  • Muayyan vaqt oralig'idagi sotuvlar soni;
  • Saytingiz necha marta ishlamay qolgan;
  • Muayyan sahifaga tashrif buyuruvchilar soni;

Diagrammaning tuzilishi har qanday mavzu uchun bir xil bo'ladi. Ma'lumotlar bazasidan ma'lumot olish uchun ba'zi parametrlardan foydalaning, so'ngra javobni XML ga aylantiring va tamom, diagramma tayyor!

Ko'proq ilhom olish uchun ushbu demo sahifasiga tashrif buyurishingiz mumkin. E'tiboringiz uchun tashakkur!


Bilasanmi, chol, men anchadan beri bunaqasini ko‘rmaganman. Hatto anime bilan bog'lanish kerakdek tuyuldi. Keksalik sezilmas tarzda o'tib ketdi va bularning barchasi qilich otgan o'g'il bolalar va jonli sochli qizlar qattiq yopishqoq massaga birlashdilar. Hamma qahramonlar faqat ahmoqona, faqat baland ovozda va faqat abadiylik haqida gapirayotganga o'xshardi. Va hamma narsa mo'ynali hayoliy yosh marazmus bilan qaynamoqda, voy! .. Va men "Teatr ..." ni topganimdan qanchalik xursandman. Bu nimaga o'xshaydi? Biz uni ko'rganimizdek - unchalik emas. Ya'ni, namoyish - ha, tushunaman. Va kayfiyat ko'proq "tortadi" "", ehtimol. Yoki eski gruzin qisqa metrajli filmlariga (ular esingizdami?), Ular "nihoyat hayot uchun". Har xil odamlar, yosh va aksincha, suhbatlashadilar, yashaydilar, bir-birlari bilan tanishadilar, ishlaydilar ... Albatta, eng muntazam emas, balki syujet uchun ma'lum bir asosiy moment olinadi. Ammo bu eng muhim daqiqa birinchi o'pish yoki mistik kuchga ega bo'lish emas, balki, masalan, ko'p yillar o'tgach, sinfdoshlar bilan uchrashish yoki yaxshi maoshli ishdan bo'shatish yoki qaynona bilan uchrashish qanchalik yoqimli. "30 dan keyin hayot bormi?", To'g'rimi? Men bor deb o'ylashni yaxshi ko'raman. Rumiko Takaxashi ham shunday deb o'ylashini yaxshi ko'raman.

Qichqirma, mushukcha, men uzoqqa bormayman. Allaqachon tekshirilmoqda. Va umuman olganda, "mening kompyuterim" nimani anglatadi ?! Xo'sh, meniki qayerda? .. Men ham ba'zida bir-ikkita anime tomosha qilishim kerak. Qarang, men hamma narsani "" va "" tashlab qo'ydim ... Hayotda bir marta xotirjam bo'lish mumkinmi, deb hayron bo'ladimi ?! Men nimaga qarayman? "Teatr Rumiko Takahashi", qutilar bor ... Nima uchun "do'zax", bunny? Birinchidan, eski narsa emas, 2003 yil shunchaki, ikkinchidan, "" sizga yoqadi, "" siz zavq bilan o'qiysiz - mangaka bir xil, ammo mahoratni ichmaysiz, ispinoz. Takaxashi-san intrigalarni qanday chizishni va ixtiro qilishni biladi ... Nega unda seriya juda qisqa? Va bu serial emas, bu qisqa metrajli filmlar to'plami - alohida syujetli, turli xarakterli. Kulgilimi yoki ko'z yoshi? Ana o'shalar, o'shalar - ko'rdingizmi, yozilgan: "drama", "komediya", "kundalik hayot" ... "Kundalik hayot" sizga yoqmaydimi? Unday dema, top, aks holda u ham seni sevmaydi. Yaxshi kundalik tartib - bu ajoyib narsa! Men sizga pingvinni qanday qilib yapon so'yishxonasida qo'shnilaridan yashirganliklarini ko'rsataman. Bolalikdagidek onam uchun Seriyushku va men kechki ovqat tayyorlashga boraman, xo'pmi? ..

Men shunchaki yig'ladim, muqaddas so'z! Men hech qachon bunday mavzular bilan singib ketishim mumkin deb o'ylamagan edim! Qiziq, xudo haqqi, kulgili, ayniqsa, komadan tushib, nega tiriltirilganini izlayotgan kampir haqida. Va uning turli ko'zlari bilan tarixdan oldingi sevgi hikoyasi: u o'zi haqida qanday gapiradi va qanday qilib - uning mavzusi; nima deyiladi, "farqni his et!". Kechikayotgan kampirning oyog‘ida esa xushchaqchaqlik, mehr bilan yostiqni kemirdim!.. Va to‘y saroyi haqidagi epizod! Men chinakam romantik hikoyalarni juda yaxshi ko'raman, hamma narsa jozibali jilo bilan porlaganda emas, balki tirik odamga hamdardlik bildira olganingizda. Keksayib qolgan er va xotin haqida esa, bu afsuslar u erda juda yaxshi ifodalangan, yoshlarni qiyin va allaqachon eskirgan dum bilan tutishga urinishlar ... va hamma narsa juda oqilona va yaxshi tugaydi. Men hatto o'yladim: ehtimol mening ajdodlarim ham bir-biriga mutlaqo befarq emas, balki buni yosh bilan qanday ko'rsatishni unutganman ...

Serial uchun tunni tomosha qilish. Sekin-asta. Ular juda boshqacha, men ularni aralashtirmoqchi emasman. Go'yo siz turli xil mehmonlarga borasiz. Kayfiyat esa butunlay boshqacha, taassurotlar esa. Yo'q. Ehtimol, bu sizga yoqmaydi. Chunki hech narsa qiziq emas. VA qo'pol ham. Va hatto "psixologizm" - "og'ir bolalik, vitamin etishmasligi, o'z vaqtida o'yinchi sotib olgan bo'lardi, haromlar, ko'rdingizmi, qotil manyak bo'lib qolmagan bo'lar edi" - yo'q. Va ayniqsa o'rgatuvchi narsa yo'q. Bunday narsalar, qoida tariqasida, hech narsani o'rgatmaydi. Birovning hayoti nimani o'rgatishi mumkin? Faqat u ham bor. Siz bu bilan hisoblashishga harakat qilishingiz mumkin ... Pafos va baland notalarsiz. Bu hatto drama emas, bilasizmi? Karlson aytganidek: "Bu hech narsa emas, bu kundalik hayot masalasidir!" Bularning barchasi kundalik ishlar. Bespontovye. Bizni professional qotillarga va boshqa beva ayollarga hamdardlikda shunchalik ayblashadiki, xizmatchi yoki uy bekasiga hamdardlik bildirish yomon odobdir... Siz so'radingiz - men javob berdim. Keling, yangi mahsulotlaringiz haqida gapirib bering. Keyin “Teatr...” tugagach, olaman. Bu sharobga o'xshaydi, uni bir qultumda ichib bo'lmaydi. Soyalar yetib bormaydi yoki ta'midan keyin bulg'angan bo'ladi. Bu sharmandalik bo'ladi ...

GD kutubxonasidan foydalanib chiziqli syujetni yaratish

Chiziqli grafikni yaratish uchun biz GD kutubxonasining bir nechta foydali funktsiyalari bilan tanishishimiz kerak. Avvalo, bizga chiziqlar chizish uchun asboblar kerak. Buning uchun funksiya tasvir chizig'i (int im, int x1, int y1, int x2, int y2, int col) mavjud bo'lib, unga allaqachon yaratilgan chizma maydonining identifikatori, boshlang'ich va yakuniy nuqtalarning koordinatalari va chiziq rangi parametr sifatida o'tkazilishi kerak. Grafik uchun bizga strelkalar bilan tugaydigan koordinata o'qlari kerak. Ularni chizish uchun sizga ixtiyoriy shakldagi yopiq ko'pburchak yaratuvchi boshqa funksiya kerak bo'ladi. U quyidagi qo'ng'iroq formatiga ega:
imagefilledpolygon (int im, massiv nuqtalari, int num_points, int col),
bu yerda im chizma maydoni identifikatori, nuqtalar massiv,
ko'pburchak nuqtalarining koordinatalarini o'z ichiga olgan (arr = x0; arr = y0; arr = x1; va hokazo),
num_nuqta - ko'pburchak nuqtalari soni,
col - to'ldirish rangi.
Shunga o'xshash funktsiya, imagepolygon, bo'yalmagan ko'pburchak yaratish uchun mo'ljallangan.

Skript yozishni boshlaylik. Keling, yangi fayl yaratamiz va uni line_chart.php deb nomlaymiz. Boshlash uchun biz koordinata o'qlarini chizish funktsiyasini aniqlaymiz, unga biz chizilgan maydonning kengligi va balandligini o'tkazamiz. Kelajakda biz o'qlar bo'ylab chizilgan qiymatlarning yorliqlarini ko'rsatishni rejalashtirganimiz sababli, ushbu omilni hisobga olish kerak va shunga mos ravishda markazga nisbatan koordinatalarning kelib chiqishini bildiruvchi nuqtani biroz siljitish kerak. Kerakli funktsiya shunday ko'rinishi mumkin:

Draw_axises funksiyasi ($ im_width, $ im_heignt) (global $ im, $ black, $ l_grey, $ x0, $ y0, $ maxX, $ maxY; $ x0 = 25.0; // X kelib chiqishi $ y0 = 20.0; / / kelib chiqishi Y o'qi $ maxX = $ im_width- $ x0; // X o'qining maksimal qiymati // o'q piksellarda $ maxY = $ im_heignt- $ y0; // Y o'qining maksimal qiymati // piksellardagi koordinatalar // X o'qi tasvir chizig'ini chizish ($ im, $ x0, $ maxY, $ maxX, $ maxY, $ qora); // Y o'qi tasvir chizig'ini chizish ($ im, $ x0, $ y0, $ x0, $ maxY, $ qora); // X o'qiga o'qni chizish $ xArrow = $ maxX-6; $ xArrow = $ maxY-2; $ xArrow = $ maxX; $ xArrow = $ maxY; $ xArrow = $ maxX-6 ; $ xArrow = $ maxY + 2 ; imagefilledpolygon ($ im, $ xArrow, 3, $ black); // Y o'qiga o'qni chizish $ yArrow = $ x0-2; $ yArrow = $ y0 + 6; $ yArrow = $ x0; $ yArrow = $ y0; $ yArrow = $ x0 + 2; $ yArrow = $ y0 + 6; tasvir to'ldirilgan poligon ($ im, $ yArrow, 3, $ qora);)
Grafikning yana bir muhim atributi - bu to'r. Uni yaratish uchun biz boshqa funktsiyani yozamiz, bu parametr sifatida biz X va Y o'qlari bo'ylab qadam hajmini piksellarda va har bir o'q uchun panjara chiziqlari orasidagi masofani o'tkazamiz: draw_grid funktsiyasi ($ xStep, $ yStep, $). xCoef, $ yCoef) (global $ im, $ qora, $ l_grey, $ x0, $ y0, $ maxX, $ maxY; $ xSteps = ($ maxX- $ x0) / $ xStep-1; // sonini aniqlang // X o'qi bo'ylab qadamlar $ ySteps = ($ maxY- $ y0) / $ yStep-1; // Y o'qi bo'ylab qadamlar sonini // aniqlash // X o'qi bo'ylab to'rni ko'rsatish ($ i = 1; $ i<$xSteps+1;$i++){ imageline($im, $x0+$xStep*$i, $y0, $x0+$xStep*$i,$maxY-1, $l_grey); //при необходимости выводим значения линий сетки по оси X imagestring($im, 1, ($x0+$xStep*$i)-1, $maxY+2, $i*$xCoef, $black); } //выводим сетку по оси Y for($i=1;$i<$ySteps+1;$i++){ imageline($im, $x0+1, $maxY-$yStep*$i, $maxX, $maxY-$yStep*$i, $l_grey); //при необходимости выводим значения линий сетки по оси Y imagestring($im, 1, 0, ($maxY-$yStep*$i)-3, $i*$yCoef, $black); } }
Endi siz grafikni o'zi chizishni boshlashingiz mumkin. Rasm X va Y koordinatalarining massivlari, massivlardagi elementlar soni va ushbu diagrammaning rangi o'tkaziladigan alohida funktsiyani chaqirish orqali yaratiladi. Buni qanday amalga oshirishingiz mumkin: draw_data funksiyasi ($ data_x, $ data_y, $ points_count, $ color) (global $ im, $ x0, $ y0, $ maxY, $ scaleX, $ scaleY; uchun ($ i = 1; $) i<$points_count;$i++){ //рисуем линейный график по точкам из массивов данных imageline($im, $x0+$data_x[$i-1]*$scaleX, $maxY-$data_y[$i-1]*$scaleY, $x0+$data_x[$i]*$scaleX, $maxY-$data_y[$i]*$scaleY,$color); } }
Shunday qilib, grafik yaratishning barcha kichik vazifalari hal qilinadi. Endi biz yaratgan funksiyalarimizdan bevosita tasvirni yaratish uchun foydalanamiz: // 500 piksel kenglik va 400 piksel balandlikdagi rasm yaratish $ im = @ImageCreate (500, 400); $ oq = ImageColorAllocate ($ im, 255, 255, 255); $ qora = ImageColorAllocate ($ im, 0, 0, 0); $ red = ImageColorAllocate ($ im, 255, 0, 0); $ yashil = ImageColorAllocate ($ im, 0, 255, 0); $ ko'k = ImageColorAllocate ($ im, 0, 0, 255); $ sariq = ImageColorAllocate ($ im, 255, 255, 0); $ magenta = ImageColorAllocate ($ im, 255, 0, 255); $ zangori = ImageColorAllocate ($ im, 0, 255, 255); $ l_grey = ImageColorAllocate ($ im, 221, 221, 221); // koordinata o'qlarini chizish_o'qlari (500,400); // diagramma ma'lumotlar massivlarini o'rnatish $ x1 = 1; $ y1 = 1; $ x1 = 2; $ y1 = 4; $ x1 = 3; $ y1 = 8; $ x1 = 4; $ y1 = 16; $ x2 = 1,5; $ y2 = 1; $ x2 = 2,5; $ y2 = 4; $ x2 = 3,5; $ y2 = 8; $ x2 = 4,5; $ y2 = 16; // ma'lumotlar massivlaridan ma'lumotlarni birlashtirish // masshtabni hisoblash uchun $ x = array_merge ($ x1, $ x2); $ y = massiv_birlashtirish ($ y1, $ y2); // har bir massiv uchun elementlarning maksimal qiymatlarini // olish $ maxXVal = max ($ x); $ maxYVal = maksimal ($ y); // ma'lumotlarni // bosqich koordinatalariga aylantirish shkalasini hisoblash $ scaleX = ($ maxX- $ x0) / $ maxXVal; $ miqyosiY = ($ maxY- $ y0) / $ maxYVal; // koordinatalar panjarasi uchun qadamni piksellarda o'rnating $ xStep = 30; $ yBosqich = 30; // grid chizilgan draw_grid ($ xStep, $ yStep, round ($ xStep / $ scaleX, 1), round ($ yStep / $ scaleY, 1), true); // birinchi grafigini chizamiz draw_data ($ x1, $ y1,4, $ red); // draw_data ikkinchi grafigini chizish ($ x2, $ y2,4, $ ko'k); // rasm sarlavhasini ko'rsatish ("Content-Type: image / png"); ImagePNG (im $); // rasm egallagan xotirani bo'shatish imagedestroy ($ im);

Grafikni brauzerda ko'rsatish: echo "

";

Veb-stsenariylarda grafik yaratish vositalarini qo'llash sohalarini aniqlash uchun grafiklardan foydalanish mumkin bo'lgan quyidagi holatlar sonini ko'rib chiqing:

  • O'zingiz yaratgan yoki boshqa joydan olingan statik tasvirlar HTML sahifasiga joylashtirilishi mumkin.
  • Dasturiy ravishda yaratilgan tasvirlardan (HTML + CSS) foydalanish mumkin.
  • Skriptni bajarish vaqtida barcha mumkin bo'lgan stsenariylar uchun statik grafiklarni oldindan yaratish, ularni fayllarga saqlash va ularni shartli ko'rsatish uchun gd kutubxonasidan foydalanishingiz mumkin.

Grafiklarni statik tasvirlar yordamida joylashtirish variantini soddaligi tufayli ko‘rib chiqmaymiz, shuning uchun avval oddiy variantni (HTML + CSS grafiklari) ko‘rib chiqamiz, keyin esa PHP da gd kutubxonasidan foydalanishni ko‘rib chiqamiz.

HTML + CSS grafiklari

Veb-saytga tashrif buyuruvchilar, ayniqsa, so'rov natijalarini tasvirlash uchun ishlatiladigan rangli gorizontal chiziqli diagrammalarni yaxshi bilishadi. Bir qarashda, bunday diagrammalarni yaratish uchun qandaydir grafik vositalardan foydalanilganga o'xshaydi, lekin aslida buning uchun bir nechta oddiy skriptlardan foydalanish kifoya:

". $ ex-> getMessage ().""; } } ?> PHP, HTML, CSS-da grafikalar bilan ishlash

Buyurtma shakli

Meva
Sabzavotlar
Siz buyurdingiz:Apelsinlar:

Olmalar:

Bananlar:

Pomidorlar:

Bodring:

Kartoshka:

EOT; ?>

Bu misol PHP ning hech qanday yangi xususiyatlarini namoyish etmaydi, faqat HTML va CSS (bu holda gistogrammalar) yordamida grafik yaratishning oson usulini ko'rsatadi:

Gd kutubxonasi

Oldingi bo'limda tasvirlangan grafikalar standart HTML imkoniyatlarini deyarli tugatadi (shuni ta'kidlash kerakki, biz HTML5 Canvas grafik yaratish uchun etarlicha kuchli vositani ko'rib chiqmaganmiz). Endi gd kutubxonasidan foydalanib, chinakam ixtiyoriy grafiklarni yaratish usullarini tavsiflashga o'tamiz.

gd kutubxonasining umumiy tavsifi

Umuman olganda, gd asboblar to'plami tasvirlarni yaratish va boshqarish uchun C kod kutubxonasidir. Ushbu kutubxona dastlab Boutel.com ning iqtidorli va saxiy xodimlari tomonidan ishlab chiqilgan va ommaga taqdim etilgan.

Gd o'zi grafik yoki chizmachilik dasturi emas, shuningdek, mustaqil dastur yoki grafik foydalanuvchi interfeysi emas. Buning o'rniga gd kutubxonasi kerakli tasvirni manipulyatsiya qilish uchun har qanday dasturda chaqirilishi mumkin bo'lgan funktsiyalarni taqdim etadi. Bu kutubxona kodidan foydalanishi kerak bo'lgan har qanday C dasturini gd kutubxonasi bilan bog'lashingiz mumkin degan ma'noni anglatadi. PHP tizimini ishlab chiquvchilar aynan shu vazifani hal qilishgan.

Aslida, bu maqsadda PHP skriptidan gd tartiblarini chaqirishni osonlashtiradigan bir qator front-end funktsiyalari yozilgan. Ammo gd kutubxonasining o'zi PHP-ga xos kodni o'z ichiga olmaydi va interfeyslar kutubxonaga bir nechta boshqa dasturlash tillari va dasturlash muhitlari, jumladan Perl, Paskal, Haskell va REXX kirishiga ruxsat berish uchun ishlab chiqilgan.

gd kutubxonasi asl tasvirlarni yaratish (dastlab bo'sh, bo'sh qog'oz varag'iga o'xshash) funktsiyalarini chaqirish imkonini beradi, bu asl tasvirlarni turli usullar bilan chizish va bo'yash va natijada tasvirni ichki gd tasvir formatidan o'zgartirishga imkon beradi. standart tasvir formati, so'ngra yakuniy manzilga yuboring (brauzer oynasiga chiqish yoki fayl yoki ma'lumotlar bazasiga saqlash). Va bu operatsiyalarning barchasi dastur nazorati ostida amalga oshirilganligi va qo'lda bajarilmaganligi sababli, yaratilgan tasvirlar o'zboshimchalik bilan murakkablashishi va dasturni bajarish paytida har qanday holatlarga bog'liq bo'lishi mumkin, bu esa ularni bog'liq qilish maqsadga muvofiqdir.

Tasvir formatlari

Gd kutubxonasi asosan turli formatlardan foydalangan holda tasvirlarni import va eksport qilish imkonini beradi. Eng mashhur rasm formatlari GIF, JPEG va PNG hisoblanadi, ammo bu erda misollar asosan ikkinchisidan foydalanadi.

GIF va PNG formatlari ba'zi qo'shimchalar bilan piksellarga mos keladigan rangli elementlarning panjarasini tasvirlash uchun mo'ljallangan. Birinchi qo'shimcha hujayralar rang raqamlari jadvalidagi haqiqiy rang raqamlari yoki indekslarini o'z ichiga olishi mumkin. (Birinchisi har qanday sonli turli xil ranglarga ruxsat berish orqali yanada ifodali tasvirlarni yaratishga imkon beradi, ikkinchisi esa yanada ixcham tasvirlarga imkon beradi.)

Ikkinchi qo'shimcha quyidagicha. Albatta, GIF va PNG formatlarining kontseptual tasviri juda oddiy, ammo amalda ushbu formatlardagi tasvirlarni o'qish, yozish va uzatish har doim siqilgan shaklda amalga oshiriladi. Siqish zarur, chunki ma'lumotlarni hujayralar tarmog'ida saqlash uchun katta hajmdagi xotira talab qilinadi. 500x400 pikselli oddiy tasvir 200 000 pikselni o'z ichiga oladi va agar har bir pikselni aniqlash uchun uch bayt kerak bo'lsa, unda zarur bo'lgan xotira miqdori allaqachon yarim megabaytdan oshadi.

Siqish mavzusi keng va murakkab, lekin ko'pchilik siqish algoritmlari tasvir hajmini kamaytirish uchun tasvirning ortiqcha miqdorini kamaytirishga asoslangan. (Masalan, agar siz tasvirdagi har bir piksel uchun yashil qiymatni alohida belgilashdan ko'ra, har bir piksel yashil ekanligini belgilasangiz, xotirada kamroq joy egallaydi.) Afsuski, siqish algoritmlari bu xususiyatlardan foydalanishga to'g'ri kelmaydi, chunki ular hal qilishlari kerak. GIF formatidagi tasvirlarni yaratish uchun ishlatiladigan siqish algoritmida amalga oshirilgan ushbu muammolarni hal qilish usullari hatto patentlangan edi.

Kutubxonani o'rnatish

Ochig'ini aytganda, gd kutubxonasini o'rnatish va uning PHP bilan muvaffaqiyatli ishlashini ta'minlash juda qiyin vazifadir. Bu PHP yoki gd dasturiy ta'minotidagi kamchiliklar tufayli emas, balki butunlay konfiguratsiya muammolari bilan bog'liq; xususan, gd kutubxonalari qayerda bo'lishi va aslida yashashini aniqlashingiz kerak va barcha bajariladigan fayllarni kompilyatsiya qilish va bog'lash bosqichlari to'g'ri bajarilganligiga ishonch hosil qilishingiz kerak. Shuning uchun, foydalanuvchi gd kutubxonasi allaqachon o'rnatilganligini va PHP tizimida gd qo'llab-quvvatlashi allaqachon yoqilganligini aniqlashi mumkin bo'lgan eng yaxshi holat (veb hosting kompaniyasining xushmuomalaligi tufayli yoki ushbu kutubxona kiritilganligi sababli). o'rnatilgan PHP tizimida).

Shuning uchun, gd kutubxonasini o'rnatish nol bosqichda boshlanishi kerak - kutubxona allaqachon o'rnatilgan yoki yo'qligini tekshirish. Birinchidan, quyidagi kodni skript fayliga kiriting va brauzerda uning bajarilishi natijalarini ko'ring, skriptlaringiz veb-xosting kompaniyasi ko'magida foydalanilmoqdami yoki o'zingizning o'rnatishingiz buning uchun to'liq ishlatiladimi:

Ushbu sahifani ko'rsatgandan so'ng, brauzer oynasida "gd" matn qatorini qidirish kifoya. Bu sizning PHP o'rnatishingiz gd kutubxonasini qo'llab-quvvatlashga ruxsat etilgan darajani tavsiflovchi kichik bo'limni ko'rsatishi kerak. Agar siz faqat ba'zi turdagi tasvirlarni (masalan, PNG formatida) tayyorlamoqchi bo'lsangiz va phpinfo () funktsiyasi natijalari ushbu turdagi tasvirni qo'llab-quvvatlashga ruxsat berilganligini ko'rsatsa, siz darhol ishlashni boshlashingiz mumkin. Agar gd versiyasida "to'plam" so'zi bo'lsa, PHP bilan birga kelgan gd kutubxonasi ishlatiladi.

Agar gd kutubxonasi haqida eslatib o'tishga urinish muvaffaqiyatsiz tugadi va siz PHP ni o'zingiz o'rnatayotgan bo'lsangiz, gd kutubxonasini o'rnatishingiz va sozlashingiz mumkin. (Boshqa tomondan, agar sizning hosting kompaniyangiz PHP-ni o'rnatsa, siz faqat o'sha kompaniyadan gd kutubxonasini qo'llab-quvvatlashni so'rashingiz yoki boshqa veb-xosting kompaniyasidan foydalanishni so'rashingiz kerak.)

PHP bilan birga kelgan gd kutubxonasidan foydalanish gd ni o'rnatish bilan bog'liq ko'plab qiyinchiliklarni bartaraf qiladi, lekin hammasi emas. Gap shundaki, paket bilan birga kelgan versiyadan foydalanish gd kutubxonasini olish imkonini beradi, lekin gd ishlashi uchun zarur bo‘lgan barcha kutubxonalarni olish shart emas. Gd kutubxonasining o'zi bir nechta boshqa kutubxonalarga bog'liq: libpng (PNG rasmlarini boshqarish uchun), zlib (siqish uchun ishlatiladi) va jpeg-6b yoki undan keyingi (kerak bo'lsa, JPEG rasmlarini boshqarish uchun). Bu kutubxonalar koʻpgina Linux oʻrnatishlarida allaqachon mavjud boʻlib, bu holda oʻrnatish katalogini koʻrsatmasdan, kerakli opsiyani (masalan, --with-zlib) opsiyalarga kiritish kifoya. Agar siz PHP ni o'zingiz sozlayotgan bo'lsangiz, gd ning to'plangan versiyasi bajariladigan faylga kiritilganligiga ishonch hosil qilish uchun --with-gd variantini qo'shishingiz kifoya. Yoki boshqa versiyaga ishora qilmoqchi bo'lsangiz, uning o'rniga --with-gd = path variantidan foydalaning.

Agar siz bir yoki bir nechta kerakli kutubxonalar yo'qligini aniqlasangiz, bu kutubxonalarni alohida qurish kerakligini anglatadi. Joriy versiyalarni qaerdan topish mumkinligi haqida ma'lumot olish uchun www.libgd.org saytida joylashgan hujjatlarni ko'rib chiqishni boshlashingiz mumkin.

gd kutubxonasi bilan ishlashning asosiy tamoyillari

Tasvirni gd asboblar to'plami bilan yaratganingizda yoki boshqarganingizda, tasvir hech qanday umumiy tasvir turiga mos kelmaydigan maxsus gd formatida bo'ladi. Nazariy jihatdan tasvirlarni ushbu gd formatida eksport qilish mumkin, ammo bu operatsiya kamdan-kam qo'llaniladi, chunki natijada olingan tasvir siqilmaydi va brauzerda yoki oddiy grafik dasturda ko'rsatilmaydi.

gd asboblar to'plami bilan ko'rsatilgan rasmda barcha piksellarning kengligi, balandligi va rangi haqida ma'lumot mavjud bo'lib, ularning soni kenglik va balandlikning mahsulotiga teng. Odatda, dastur gd kutubxonasi bilan yangi bo'sh rasm yaratish (chizish va bo'yash uchun) yoki fayldan rasmni import qilish orqali o'zaro ta'sir qilishni boshlaydi. Quyidagi bosqichlarda odatda quyidagi harakatlar amalga oshiriladi: birinchidan, tasvirdagi ranglarni taqsimlash, ikkinchidan, boshqa ba'zi operatsiyalar yordamida tasvirni chizish va bo'yash yoki manipulyatsiya qilish, uchinchidan, tasvirni umumiy qabul qilingan formatga aylantirish (masalan, PNG yoki JPEG ) va uni belgilangan joyga o'tkazing.

Ranglarning ifodalanishi

Gd tasvirlarida ranglarni ifodalashning ikkita usuli mavjud: 256 ta rang bilan cheklangan palitrali tasvir va turli RBG rang raqamlarining ixtiyoriy sonini belgilash imkonini beruvchi real rang tasviri. gd 1.x da yagona variant palitraga asoslangan ranglardan foydalanish edi, gd 2.x va ushbu kutubxonaning PHP versiyasi ham palitraga asoslangan tasvirlarni, ham real rangli tasvirlarni qo'llab-quvvatlaydi. Shuni yodda tutish kerakki, har bir aniq gd tasviri yoki palitraga asoslangan bo'lishi yoki haqiqiy ranglarga (RGB) ega bo'lishi kerak; bu palitraga asoslangan tasvirlarga real ranglarni kiritishning hech qanday usuli yo'qligini anglatadi.

Palitraga asoslangan asl bo'sh tasvirni olish uchun siz funktsiyani chaqirishingiz kerak ImageCreate (), va tasvir real ranglarda olingan kuni, funksiyasi ImageCreateTrueColor ().

Palitraga asoslangan rasmlar

Ranglar "Qizil-Yashil-Ko'k" (RGB) formatida 0 dan 255 gacha bo'lgan uchta raqam yordamida ko'rsatilgan. Masalan, raqamlar bilan ko'rsatilgan rang (255, 0, 0) yorqin qizil, rang ( 0, 255, 0) - yashil, rang (0, 0, 255) - ko'k, rang (0, 0, 0) - qora, rangli (255, 255, 255) - oq va rangli (127, 127, 127) - kulrang . Ko'proq va ko'proq yangi ranglar yaratish, siz tasodifiy uchta rang komponentining qiymatlarini tanlashingiz mumkin.

Tasvirdagi har qanday rasm ma'lum bir rang bilan bajarilishi kerak va ranglar ularni ishlatishdan oldin tasvirda taqsimlanishi kerak. Bundan tashqari, rasmda taqsimlangan birinchi rang avtomatik ravishda fon rangiga aylanadi. Shunday qilib, hech qanday holatda siz ranglarni ko'rsatmasdan qila olasiz deb o'ylamasligingiz kerak va odatda ranglarni taqsimlash operatsiyasi yangi bo'sh tasvirni yaratgandan keyin birinchi operatsiyaga aylanadi.

Palitraga asoslangan tasvirlardagi ranglar tasvirni (ilgari yaratilgan) va qizil, yashil va ko'k nisbati uchun uchta butun sonni oladigan imagecolorallocate () funksiyasi yordamida yaratiladi. Qaytish qiymati tasvirning ichki palitrasidagi yangi rang indeksini belgilaydigan butun sondir. Ushbu qaytarish qiymati o'zgaruvchiga tayinlanishi kerak, chunki belgilangan indeks qiymati ushbu rang yordamida kelajakdagi barcha operatsiyalarni bajarish uchun talab qilinadi.

Palitraga asoslangan tasvirlar maksimal 256 ta rangga ega boʻlishi mumkin. (Oʻquvchini bunday tasvirlar aslida nimaga asoslangani qiziqtirishi yoki qiziqtirmasligi mumkin, lekin palitraga asoslangan tasvirdagi har bir piksel aslida bitta baytdan iborat boʻlib, u indeksni saqlaydi. 256 rangdan iborat palitradagi bitta element.)

Tasvirdagi ranglardan birini tarqatishda qaytarilgan indeks faqat shu tasvir uchun mazmunli ekanligini unutmang. Misol uchun, agar $ qora o'zgaruvchiga PHP skriptida bitta rasmda taqsimlangan rang tayinlangan bo'lsa, u holda bu o'zgaruvchidan boshqa tasvirni qayta ishlash uchun chaqirilgan bo'yoq buyrug'iga rang kiritish sifatida foydalanishdan ma'no yo'q.

Haqiqiy ranglar bilan tasvirlar

gd kutubxonasi 2.0 va undan keyingi versiyalari, shuningdek, har bir piksel o'zboshimchalik bilan RGB rang raqamini saqlaydigan palitraga asoslangan bo'lmagan tasvirlarni yaratish imkoniyatini beradi. Ushbu haqiqiy rang formatida mumkin bo'lgan ranglar soni juda katta. Bu imkoniyat nafaqat badiiy ifoda doirasini cheksiz kengaytiradi, balki gd asboblar to‘plamidan foydalanib xotiraga yuklangan real ranglar bilan PNG va JPEG tasvirlarni ishonchli tarzda qayta ishlab chiqarish imkonini beradi.

Asl tasvirni yaratish uchun boshqa funktsiyadan foydalanilganligi va turli xil ranglarni tanlashda hech qanday cheklovlar yo'qligidan tashqari, haqiqiy ranglarga ega tasvirlar bilan ishlash tamoyillari palitraga asoslangan tasvirlarga o'xshashdir.

Xususan, yangi ranglar yaratish uchun siz hali ham ImageColorAllocate () ga qo'ng'iroq qilishingiz va keyinchalik chizish buyruqlarida foydalanish uchun o'zgaruvchiga qaytarish qiymatini belgilashingiz mumkin. Yagona farq shundaki, qaytarish qiymati palitradagi element indeksi emas, balki RGB rang raqamidir. Shuningdek, real ranglarga ega tasvirlarda ImageColorAllocate () funksiyasining yon effekti sifatida yaratilgan fon rangi tushunchasi mavjud emas; ishga tushirish natijasida barcha piksellarga qora belgi (0, 0, 0) beriladi.

Shaffoflik

gd 2.x versiyalari shaffoflik kontseptsiyasini qo'llab-quvvatlaydi. Buning uchun alfa kanali (qizil, yashil va ko'k uchun qiymatlarga qo'shimcha ravishda ko'rsatilgan) ishlatiladi, bu berilgan rang qanchalik shaffofligini ko'rsatadi. Bu, masalan, bir shaklni boshqasining ustiga qo'yishga imkon beradi, shunda birinchi shakl ikkinchisini to'liq qoplash o'rniga, qisman ko'rinadigan bo'lib qoladi.

PHP-da tasvirlar bilan ishlashning ko'plab funktsiyalari nomida "alfa" so'zini o'z ichiga olgan analogga ega, bu ushbu funktsiyalarda rang to'rtta qiymat (R, G, B, A) bilan ifodalanganligini ko'rsatadi. Misol uchun, imageColorAllocate () funksiyasi uchta parametrni oladi va funksiya chaqirilganda ImageColorAllocateAlpha () to'rtinchi parametr 0 dan 127 gacha bo'lgan qiymat bilan ko'rsatilishi kerak. Nol qiymati rangning butunlay shaffof emasligini va 127 qiymati rangning to'liq shaffofligini ko'rsatadi.

Koordinatalar va buyruqlarni chizish

Gd asboblar to'plamidan foydalangan holda tasvir yaratilgandan so'ng, uning ichida chizish buyruqlarini ko'rsatishga imkon beruvchi yashirin koordinatalar tizimi yaratiladi. Ushbu tizimdagi koordinatalarning chegara qiymatlari tasvirning kengligi va balandligining belgilangan parametrlari bilan belgilanadi.

Koordinatalarga (0, 0) mos keladigan ushbu tizimdagi koordinatalarning kelib chiqishi tasvirning yuqori chap burchagida joylashgan. X qiymatlari uchun ijobiy yo'nalish chapdan o'ngga, Y qiymatlari uchun esa yuqoridan pastga. (Kompyuter grafikasi koordinata tizimlarida kelib chiqishning bunday joylashuvi keng tarqalgan, ammo analitik geometriyani o'rganganlar ko'rinishidan kelib chiqishi diagrammaning pastki chap burchagida ekanligiga o'rganib qolgan ko'rinadi.)

Chizish buyruqlari soni juda katta. Bu buyruqlar qatoriga chiziq segmentlari, toʻrtburchaklar va yoylarni chizish buyruqlari hamda aniq piksel qiymatlarini oʻrnatish buyruqlari kiradi, lekin ular bilan cheklanmaydi. Ammo shuni yodda tutingki, ushbu chizish va chizish buyruqlarining yakuniy natijasi piksel qiymatlarini o'rnatishdir. Piksel qiymatlarini o'zgartiruvchi buyruqlar bajarilgandan so'ng, xotirada izlar qolmaydi (o'zgartirilgan qiymatlarning o'zidan tashqari), shuning uchun chizilgan va chizilgan buyruqlar harakatini bekor qilish yoki turli buyruqlar natijalarini alohida taqdim etishning iloji yo'q.

Belgilangan tasvirdan tashqariga chiqadigan chizish buyruqlariga hech narsa to'sqinlik qilmaydi, lekin chizish ko'rinadigan ta'sirga ega emas. Masalan, barcha koordinatalari manfiy bo'lgan to'rtburchak rasmda ko'rinmaydi.

Formatni o'zgartirish

Barcha chizish va tasvirni manipulyatsiya qilish operatsiyalari ichki gd formatida ifodalangan tasvirda amalga oshiriladi. Va bu amallar bajarilgandan so'ng, ushbu tasvirni kerakli grafik formatga aylantirish va foydalanuvchining brauzer oynasiga (yoki a) chiqarish uchun skriptda o'zgartirish va chiqarish buyruqlaridan biri (imagepng, imagetjpeg va boshqalar) chaqirilishi mumkin. fayl).

Resurslarni bo'shatish

Tayyor tasvirni o'zgartirish natijasi gd foydalanuvchiga o'tkazilgandan so'ng, biz ichki versiya bilan ishlash tugallangan deb taxmin qilishimiz mumkin. Bu shuni anglatadiki, ushbu versiyani yo'q qilish kerak. Buning to'g'ri yo'li funktsiyani chaqirishdir tasvirni yo'q qilish () tasvirni parametr sifatida belgilash.

Gd kutubxonasi funktsiyalari

Biz ushbu maqolada PHP tarjimonining gd interfeysida taqdim etilgan barcha funktsiyalarni alohida sanab o'tmoqchi emasmiz. Ushbu ma'lumot uchun php.net qo'llanmasining Rasmga ishlov berish va yaratish bo'limidan foydalanishni tavsiya qilamiz. Gd funktsiyalarining aksariyati quyidagi jadvalda ko'rsatilgan toifalardan biriga kiradi. E'tibor bering, ushbu jadvalda keltirilgan funksiyalarning nomlari o'qish uchun har bir so'zning birinchi harfi uchun katta harf bilan yozilgan, ammo kod misollarida bu shart har doim ham bajarilmaydi, chunki PHP funksiya nomlari katta-kichik harflarga sezgir emas:

gd funksiyalarining tasnifi

Bir turi Misol Eslatma
Tasvir yaratish funksiyalari ImageCreate (), ImageCreateTruecolor (), ImageCreateFromGd (), ImageCreateFromJpeg () Yangi rasmni qaytaradi gd. ImageCreate () funksiyasi parametr sifatida tasvirning kengligi va balandligini oladi, boshqa funksiyalarning parametrlari esa fayl yo‘li, URL manzili yoki avvaldan yaratilgan tasvirni o‘z ichiga olgan satr bo‘lib, uni yuklash va gd formatiga aylantirish kerak.
Rang taqsimlash operatsiyalarini bajaradigan funktsiyalar ImageColorAllocate (), ImageColorAllocateAlpha (), ImageColorDeallocate () ImageColorAllocate () funktsiyasi rasm deskriptorini va kerakli qizil, yashil va ko'k qiymatlarni parametr sifatida oladi, so'ngra keyinchalik chizish va chizish operatsiyalarida foydalanish uchun rang raqamini qaytaradi. ImageColorAllocateAlpha funktsiyasi qo'shimcha parametr - shaffoflik omilini oladi (0-127)
Ranglarni moslashtirish operatsiyalarini bajaradigan funktsiyalar ImageColorClosest (), ImageColorClosestAlpha (), ImageColorExact (), ImageColorExactAlpha () Palitra tasviridagi mos rang indeksini qaytaradi. O'z nomidagi "Eng yaqin" so'zi bo'lgan funktsiyalar eng yaqin mos rangni qaytaradi (mos keladigan aniqlik RGB maydonidagi nuqtalar orasidagi masofa sifatida o'lchanadi); "Aniq" belgisi bo'lgan funktsiyalar rang raqamini faqat kerakli bilan bir xil bo'lsa, qaytaradi, aks holda ular -1ni qaytaradi, "Alpha" deb nomlangan funktsiyalar qaysi to'rtta qiymatdan foydalanilganligini aniqlash uchun ranglarda ishlaydi (shaffof ranglar bilan)
Chiziqlarni chizish funktsiyalari ImageLine (), ImageDashedLine (), ImageRectangle (), ImagePolygon (), ImageEllipse (), ImageArc () Belgilangan shakldagi chiziq segmentlari yoki egri chiziqlarini chizish uchun ishlatiladi. Odatda bu funksiyalarning har birining birinchi parametri rasm, oxirgi parametri rang, oraliq parametrlari X va Y koordinatalari hisoblanadi.
Chiziqlarni chizish uchun qalamni sozlash funktsiyalari ImageSetStyle (), ImageSetThickness () Keyingi chiziq chizish buyruqlari tomonidan yaratilgan chiziqlar xususiyatlariga ta'sir qiluvchi sozlamalarni o'zgartiring (bu funktsiyalarning ba'zilari faqat gd 2.0.1 yoki undan keyingi versiyalarida amal qiladi)
Chizish va to'ldirish funktsiyalari ImageFilledRectangle (), ImageFilledEllipse (), ImageFilledPolygon (), ImageFilledArc (), ImageFill () Qoida tariqasida, ular chizilgan chiziqlarning tegishli funktsiyalariga o'xshaydi, lekin ular nafaqat maydonlarning konturlarini chizish, balki yaratilgan maydonlarni rang bilan to'ldirishni ta'minlaydi. ImageFill () maxsus funktsiyasi belgilangan to'ldirish rangi qo'llaniladigan to'ldirish operatsiyasini bajaradi. Belgilangan XY nuqtasidan boshlab barcha yo'nalishlarni to'ldiradi (bu funktsiyalarning ba'zilari gd 2.0.1 yoki undan keyingi versiyasini talab qiladi)
Matn bilan ishlash funksiyalari ImageString (), ImageLoadFont () ImageString funksiyasi parametr sifatida rasm deskriptorini, shrift raqamini, X va Y koordinatalarini, matn qatorini va rangni oladi. Agar shrift raqami 1 dan 5 gacha bo'lsa, u holda ushbu rangdagi chiziqni ko'rsatish uchun beshta o'rnatilgan shriftlardan biri ishlatiladi. Boshqa tomondan, 5 dan katta shrift raqami ImageLoadFont () funktsiyasidan foydalangan holda maxsus shriftni yuklash natijasini ko'rsatadi.
Eksport funktsiyalari ImagePng (), ImageJpeg () Gd ichki tasvirini mos formatdagi rasmga aylantiring va keyin bu tasvirni chiqish oqimiga yuboring. Agar faqat bitta parametr (tasvir identifikatori) ko'rsatilgan bo'lsa, u holda foydalanuvchi uchun tasvirning aks sadosi amalga oshiriladi va faylga yo'l bo'lgan qo'shimcha parametrdan foydalanilganda, chiqish oqimining maqsad manzili faylga aylanadi.
Rasmni yo'q qilish funktsiyasi ImageDestroy () Tasvir deskriptorini parametr sifatida qabul qiladi va tasvir bilan bog'liq barcha resurslarni chiqaradi

HTTP tasvirni qo'llab-quvvatlash

Tasvir foydalanuvchi brauzerida to'g'ri ko'rsatilishi uchun tasvir qayerdan kelishi va uning formati qanday ekanligini ko'rsatish kerak. Shuning uchun, afsuski, yaratilgan HTML faylga, masalan, imageToPng () funksiyasiga qo'ng'iroqni oddiygina kiritish va shu bilan tasvirni chiqarish muammosini hal qilish mumkin emas. Asosan, siz PHP skriptingizda yaratilgan HTML bilan tasvirni ko'rsatish kodini aralashtirishingiz kerak va buni quyida tavsiflangan uchta variantdan birini qo'llash orqali qilishingiz mumkin.

To'liq sahifa tasvirlarini yaratish

Butun yaratilgan sahifani rasm shaklida ramkalash mumkin. Bunday holda, tasvir ma'lumotlaridan oldin HTTP sarlavhasini o'tkazish kerak va shu bilan ma'lum bir turdagi tasvir keyingisini e'lon qiladi. Misol uchun, skript oxirida quyidagi qatorlar bo'lishi mumkin:

// ... tasvirni yaratadigan va uni // tayinlaydigan kod, $ tasvir o'zgaruvchisi sarlavhasiga ("Content-type: image / png"); // Brauzerga sarlavhani chiqarish imagepng ($ image); // Tasvirning o'zi ma'lumotlarini uzatish, PNG tasvirni yo'q qilish ($ image); // Resurslarni bo'shatish

Ushbu yondashuvning afzalligi shundaki, har qanday ma'lumot, shu jumladan POST parametrlari kelajakdagi tasvirning tarkibi haqidagi ko'rsatmalarni uzatish uchun ishlatilishi mumkin. Kamchilik shundaki, natijada olingan sahifada hech qanday oddiy HTML kod bo'lishi mumkin emas. Haqiqatan ham, sarlavha va rasm oldidan skriptlarda hech qanday matn chiqishi o'tkazilmasligiga ishonch hosil qilishingiz kerak, chunki bu tarkibni muddatidan oldin yuborish bilan barobar. Ushbu stsenariyda siz "Sarlavhalar allaqachon yuborilgan ..." xato xabarini olasiz.

Fayllarda saqlangan rasmlarni joylashtirish

Birinchidan, HTML identifikatorni qo'llab-quvvatlashiga e'tibor bering Quyidagi misolda bo'lgani kabi rasm fayli yoki URL manziliga yo'lni belgilash orqali rasmni joylashtirish imkonini beradi:

Ushbu konstruksiya statik tasvir fayllari uchun amal qiladi, lekin uni yangi yaratilgan tasvirni joylashtirish uchun ishlatib bo'lmasligi uchun hech qanday sabab yo'q. Shuning uchun siz bunday skriptni tayyorlashingiz mumkin, unda tasvir avval yaratilgan, keyin tasvir ma'lumotlari mahalliy faylga yoziladi, shundan so'ng tegishli identifikator bilan HTML kodi hosil bo'ladi. Siz yaratgan faylga ishora.

Ushbu yondashuvning birgina kamchiliklari shundaki, birinchidan, sahifa yaratish jarayoni fayl yozish operatsiyalarini o'z ichiga oladi, bu uzoq vaqt talab qilishi mumkin, ikkinchidan, ular tugagandan so'ng fayllar bilan nima qilish kerakligini aniqlash kerak.

Ammo ma'lum bir vaziyatda bu yondashuv idealdir. Bu turli xil tanlovlarni ifodalovchi tasvirlarni yaratish va keshlash haqida. Bunday holda, u yoki bu holatni rasm fayli nomi bilan bog'lashning ma'lum bir usuli taqdim etiladi. Agar ushbu holatlardan birortasi tasvirni ko'rsatishni talab qiladigan yuzaga kelsa, tegishli fayl allaqachon mavjudligi tekshiriladi. Ijobiy javob bo'lsa, ushbu faylga havola oddiygina qo'llaniladi, deskriptor shaklida bezatilgan , va agar javob yo'q bo'lsa, u holda rasm yaratiladi, faylga yoziladi va keyin yana ushbu rasmga havola qo'llaniladi. Oxir-oqibat, yangi fayllarni shakllantirish oddiygina talab qilinmaydi.

Skriptlangan tasvirlarni joylashtirish

Va nihoyat, mustaqil tasvirlash skriptini taqdim etish va natijada olingan tasvirni deskriptorda ko'rsatgan holda boshqa skript yordamida yaratilgan dinamik sahifaga joylashtirish imkonsiz bo'lishi uchun hech qanday sabab yo'q. Ushbu skript uchun URL. Bunday holda, yagona qiyinchilik kerakli ma'lumotlarni qaram sahifaga o'tkazish usulini tanlashda yotadi. Masalan, o'rnatilgan tasvirni ko'rsatuvchi deskriptor quyidagicha ko'rinishi mumkin:

Bunday holda, ballpage.php skripti rasmning turli pozitsiyalarida rangli sharlarning PNG tasvirlarini qaytaradi.

Biroq, ushbu yondashuvdan foydalanganda nosozliklar paydo bo'lishi mumkin, chunki veb-serverlar va brauzerlar ba'zida qayta ishlanayotgan fayllarning qo'shimchalarini tekshiradilar va skanerlash natijalarini olgan holda ularga turli yo'llar bilan javob berishadi. Masalan, Apache server tomonida berilgan kod PHP kodi sifatida talqin qilinishi kerakligini aniqlashi uchun ballpage tasvirlash skripti .php kengaytmasini tayinlashi kerak bo'lishi mumkin (garchi kerakli ishlov berish rejimi konfiguratsiya fayllari yordamida ham belgilanishi mumkin).

Shu bilan birga, brauzerlarning nostandart versiyalari ham mavjud bo'lib, ular .php kengaytmali faylning tasvirni shakllantirish imkoniyatini hisobga olmaydi, garchi uzatilgan sarlavha tasvirdan keyin kelishini bildirsa ham. Shuning uchun, ushbu usuldan foydalanganda, siz turli xil brauzerlarda skriptlarni sinab ko'rishingiz va mo'ljallangan auditoriya sahifalarni siz mo'ljallangan shaklda olishiga ishonch hosil qilishingiz kerak.

Quyida tasvirlarni yaratish uchun gd kutubxonasidan foydalanish misollari keltirilgan.

Gd kutubxonasidan foydalanishga misol: oddiy shakllar yaratish

Quyidagi misolda biz gd kutubxonasi yordamida oddiy geometrik shakllarni o'z ichiga olgan chizmani qanday yaratishni ko'rsatamiz:

Gd kutubxonasidan foydalanishga misol: fraktal tasvirlar

Fraktallardan misol sifatida foydalanib, printsipial jihatdan qiziq bo'lmagan ko'rinishi mumkin bo'lgan chiziqlar chizish mavzusining taqdimotini bezash uchun ajoyib an'ana allaqachon rivojlangan. Quyidagi misol nafaqat murakkab tasvirni dasturiy jihatdan yaratishni ko'rsatibgina qolmay, balki PHP tilining imkoniyatlarini yaxshi namoyish etadi. Haqiqat shundaki, ushbu tilning massivlari va erkin aniqlangan ma'lumotlar turlari ko'plab deklaratsiyalarni qo'llamasdan fraktal tasvirlarga mos keladigan murakkab ma'lumotlar tuzilmalarini yaratishni juda oson qiladi.

Fraktal o'ziga o'xshash geometrik shakldir. Bu fraktalning qismlari butun fraktalga o'xshash shaklga ega ekanligini anglatadi, bu qismlarning qismlari ham xuddi shunday shaklga ega va hokazo.

Nazariy jihatdan, siz mukammal fraktalni cheksiz ko'p marta kattalashtirishingiz va bir xil naqshlarning takrorlanishini aniqlashni davom ettirgan holda kichikroq va kichikroq qismlarni yaratishingiz mumkin. Ammo amalda, kompyuterda yaratilgan fraktallar cheklangan miqdordagi qismlarni shakllantirish operatsiyalaridan foydalangandan so'ng, oddiy chiziq segmentlari kabi fraktal bo'lmagan shakllarga aylanadi.

Biz yaratmoqchi bo'lgan ushbu turdagi tasvirning namunasi quyidagi rasmda ko'rsatilgan:

Albatta, bir qarashda, bu uzluksiz egri chiziq kabi ko'rinadi, ammo bu tasvir shunchaki ko'p sonli kichik to'g'ri chiziq segmentlarining yig'indisi bo'lib, ularning oxirgi nuqtalari yopiq siniq chiziq shaklida bog'langan.

Bizning vazifamiz ushbu barcha chiziq segmentlarining so'nggi nuqtalarining koordinatalarini hisoblash va keyin barcha chiziq segmentlarini PNG tasviri sifatida to'g'ri ko'rsatishdir. Biz fraktal tasvirning bitta bo'lagini yig'ishimiz mumkin edi, lekin o'z oldimizga yanada qiyinroq vazifani qo'yishga qaror qildik - nafaqat fraktal tasvirning ko'rinishini ta'minlash, balki fraktal tasvirning parametrlarini osongina o'zgartirishga imkon beradigan kichik infratuzilmani shakllantirish. fraktal va yangi turdagi tasvirlarni yaratish.

Boshlash uchun, ko'rsatilgan murakkab shakllarni ko'rsatishga imkon beruvchi ba'zi ma'lumotlar tuzilmalarini tayyorlaylik. Bunday ma'lumotlar tuzilmalari nafaqat oraliq hisob-kitoblarni, balki joylashuvi va uzunligi natijada olingan yakuniy natijalar bilan belgilanadigan chizilgan segmentlarni ham ta'minlashi kerak. Birinchidan, keling, bir nechta o'zboshimchalik bilan taxminlar qilaylik:

  • koordinatalar sistemasidagi nuqta juft raqamlar bilan belgilanadi;
  • yo'l nuqtalar ro'yxati sifatida ifodalanadi.

Oxir-oqibat, poliliniyani chizish uchun chiziqning barcha nuqtalari orasidagi chiziq segmentlarini chizish kerak. Agar alohida chiziq segmentini chizish kerak bo'lsa, unda bu vazifani ikki nuqtadan o'tuvchi ko'p chiziq chizish, to'rtburchak chizish esa besh nuqtadan o'tuvchi ko'p chiziq tasvirini yaratish sifatida ifodalanishi mumkin edi (buni hisobga olgan holda) boshlang'ich nuqtasi poliliniyada ikki marta sodir bo'ladi va u qayta paydo bo'lganda to'rtburchakni yopadi). (Bu holda, to'g'ri chiziq segmentini ibtidoiy ob'ekt sifatida ko'rib chiqish mumkin edi, lekin, ko'rinishidan, fraktal tasvirlarni yaratish masalasini hal qilishda siniq chiziq shaklida tasvirlash yanada ixchamroq bo'ladi.)

Endi nuqtalar va poliliniyalarni qanday tasvirlash kerakligi haqidagi savolni ko'rib chiqamiz. PHP da ob'ektlar ro'yxatini ko'rsatishning eng oddiy usuli massivlardan foydalanishdir. Shuning uchun, nuqta ikki sonni o'z ichiga olgan massiv, siniq chiziq esa bir qancha nuqtalarni o'z ichiga olgan massiv ekanligini asos qilib olaylik. Ushbu yondashuvni amalga oshirish natijasida ko'p o'lchovli PHP massivlari bo'lgan tuzilmalar yaratilishi kerak, ammo agar biz eslab qolish oson nomlar bilan konstruktor va yordamchi funktsiyalarni aniqlay olsak, biz bu tuzilmalarning qanchalik murakkabligini unutib qo'yishimiz va shunchaki kodni ishlab chiqishimiz mumkin. go'yo bu tuzilmalar haqiqiy ma'lumotlar turlari bo'lgan kabi operatsiyalar.

Yuqoridagi rasmda ko'rsatilgan tasvirni yaratish uchun kod quyida keltirilgan. U ma'lumotlar turlarini yaratish funktsiyalari bo'yicha belgilaydi (ularning nomlari make prefiksi bilan boshlanadi ), ma'lumotlar tuzilmalarining tarkibiy qismlariga kirish funktsiyalari va ma'lumotlarga asoslangan tasvirni ko'rsatish funktsiyalari (bu funktsiyalarning nomlari prefiks displeydan boshlanadi)). Ushbu yondashuvdan foydalanganda nuqtalarni ko'rsatish ekranda ta'minlanmaydi, shuning uchun ular uchun displey funktsiyalari mavjud emas va siniq chiziqlar ketma-ket nuqta juftlari o'rtasida chiziq segmentlarini chizish orqali chiziladi.

Transform_path () funksiyasi birinchi parametr sifatida asl ko'p chiziqli ta'rifni, ikkinchi parametr sifatida esa funksiya nomini oladi, bu esa o'z navbatida parametr sifatida ko'p chiziqli ta'rifni oladi va natijada o'zgartirilgan poliliniya ta'rifini qaytaradi. Transform_path () funksiyasining uchinchi parametri bu funktsiyadan yangi ko'p chiziqni yaratish uchun bir ko'p chiziqni boshqasiga aylantirish uchun necha marta foydalanilganligi qiymatidir. Bunday ikkinchi tartibli funktsiyani joriy qilish maqsadga muvofiq bo'lganligining sababi shundaki, aks holda har safar yangi fraktal hosil bo'lishi kerak bo'lganda ko'proq va ko'proq tsiklik ishlov berish funktsiyasini yaratish kerak bo'lishi mumkin. Ushbu yondashuvdan foydalanish fraktal yaratish kodining turli qismlarini alohida funktsiyaga bog'lash imkonini beradi, uni transform_path () funktsiyasiga o'tkazish va ishning takrorlanishini oldini olish mumkin.

Spike funksiyasi koʻp chiziqli taʼrifni parametr sifatida qabul qiladi va boshqa koʻp chiziqli taʼrifni qaytaradi, bunda ikki nuqtadan oʻtuvchi har bir chiziq segmenti oʻrtasida choʻqqisi boʻlgan besh nuqta orqali oʻtgan koʻp chiziq bilan almashtiriladi. Va yuqori shlyapa funktsiyasi taxminan bir xil ishni bajaradi, faqat natijada olingan poliliniya olti nuqtadan o'tadi va natijada olingan tepalik to'rtburchaklardir. Bunga qo'shimcha ravishda, ushbu misol standart o'lchamlarga ega poliliniyalarni yaratish uchun yana bir nechta funktsiyalarni o'z ichiga oladi, ularda chiziqlar orasidagi burchaklar tekis bo'ladi; bu funksiyalar odatiy namunalar sifatida foydalanish uchun mo'ljallangan.

Qo'shilgan fayllardan barcha funksiyalarning ta'riflarini yuklagandan so'ng, ushbu kod berilgan balandlik va kenglikdagi gd tasvirini yaratadi va keyin ushbu rasmdagi ranglarni taqsimlaydi. (Fon oq, chiziq segmentlari qora rangda.)

Fraktal tasvirni yaratish uchun kodning bajarilishi besh nuqtadan o'tuvchi va shuning uchun to'rtta (bevosita ko'rsatilgan) chiziq segmentini o'z ichiga olgan standart yopiq to'rtburchaklar poliliniyani yaratish bilan boshlanadi. Keyinchalik bu ko'p chiziq ta'rifi transform_path () ga o'sha funksiyaga chaqiruv sifatida uzatiladi, bu parametrlar berilgan to'rtburchakka to'rt marta qo'llangan spike () funksiyasidan kelib chiqadigan ko'p chiziq ta'rifi qaytarilishi kerakligini ko'rsatadi. Yopiq to'rtburchaklar poliliniyani o'zgartirish to'rtta chiziq segmentini qayta ishlashdan boshlanadi va har bir segment to'rtta segment bilan almashtiriladi. Shuning uchun to'rtta ketma-ket takrorlash natijasida mos ravishda 16, 64, 256 va 1024 segmentlar hosil bo'ladi.

Shundan so'ng, ekranda hosil bo'lgan murakkab yopiq poliliniyani ko'rsatishgina qoladi. Tasvirdagi barcha chiziq segmentlarini chizish uchun ushbu kodda belgilangan display_path () funksiyasi chaqiriladi, PNG tasviri kelishini ko'rsatuvchi HTTP sarlavhasi uzatiladi, imagepng () funksiyasi o'zgartirish va chiqarish uchun chaqiriladi, so'ngra ichki tasvir ta'rifi gd yo'q qilinadi:

Ushbu tasvirlarni yaratish va ko'rsatish uchun ko'p vaqt talab qilishi mumkin va yaratilayotgan chiziq segmentlari soni ortib borishi bilan talab qilinadigan vaqt ortadi, shuning uchun veb-server tasvir hali davom etayotganda skriptni tugatish uchun vaqt tugashi mumkin. Ushbu vaziyatdan chiqish uchun siz fraktal tasvirni yaratish uchun koddagi shakllanish bosqichlari sonini kamaytirishingiz yoki veb-server yoki PHP tarjimonining konfiguratsiya fayllarida kutish vaqtini oshirishingiz mumkin.

Albatta, fraktal tasvirlarni yaratish uchun kod bilan tajriba o'tkazish san'at bilan chegaralanadi va ushbu maqolaning kamtar mualliflari o'zlarini chinakam iste'dodli rassomlar deb hisoblamaydilar. Ammo biz o'quvchilarimizga bunday tasvirlarni yaxshilashda muvaffaqiyatlar tilashimiz mumkin.

PHP da chizmalarni ikki xil usulda tuzish mumkin. Siz uni o'zingiz chizishingiz yoki kutubxonadan foydalanishingiz mumkin. Men sizga grafikani o'zingiz yaratishni o'rganishni taklif qilaman. Birinchidan, chunki yaxshi kutubxonalar qimmatga tushadi. Ikkinchidan, har qanday kutubxonadan foydalanib, siz uning funksionalligi bilan cheklanasiz. Grafikani o'zingiz chizishingiz yaxshiroqdir.

Eng oddiy variantdan boshlaylik. Saytda 5 kun ichida ro'yxatdan o'tgan foydalanuvchilar sonini o'z ichiga olgan massiv mavjud.

$ mas = massiv (2, 7, 20, 9, 14);

Ushbu massivni sahifada grafik shaklida ko'rsatamiz. Birinchidan, koordinata o'qlarini chizamiz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Izohlar:

3 - tasvirni yaratish

7, 8 - x va y o'qlari

9-13 - x o'qi bo'yicha seriflar

14-18 - x o'qidagi raqamlar

19, 20 - y o'qi bo'yicha seriflar

21, 22 - y o'qidagi raqamlar

Chizma quyidagicha ko'rinishi kerak:

Chiziqni diagrammada chizish uchun siz uning ustidagi chiziq chizilgan nuqtalarni topishingiz kerak. Amalda siz darhol nuqtani topishingiz va u bo'ylab chiziq chizishingiz mumkin. Ammo misolni aniqroq qilish uchun biz vazifani ikki qismga ajratamiz. Birinchidan, biz barcha nuqtalarni topamiz, keyin ular asosida grafik chizamiz. Buning uchun har bir nuqtaning x va y koordinatalarini o'z ichiga olgan ikki o'lchovli massiv tuzamiz. Koordinatalarni topish uchun bizga mos yozuvlar nuqtasi kerak. Bu koordinata o'qlari kesishgan nuqtadir. Bizning chizamizda uning koordinatalari x: 50, y: 250 piksel. Har bir nuqtaning o'rnini aniqlash uchun siz grafik shkalasidan foydalanishingiz kerak. Misolda biz o'lchovni o'zimiz o'rnatamiz. X o'qida har bir kun uchun 100 piksel yaratiladi. Birinchi kun kelib chiqish joyidan 100 piksel masofada, ikkinchisi 200 piksel masofada va hokazo. Shunday qilib, birinchi kun uchun x koordinatasi 50 + 100 = 150. Ikkinchisi uchun 50 + 200 = 250.

Y o'qida har 10 foydalanuvchi uchun 100 piksel ajratilgan. Bu bitta foydalanuvchi uchun 10 pikselni bildiradi. Tasvirning y o'qi pastga yo'naltirilganligini yodda tutish kerak, ya'ni siz boshlang'ich nuqtaga qiymat qo'shishingiz shart emas, balki uni olib tashlashingiz kerak. Birinchi kuni saytga 2 ta tashrif buyuruvchi ro'yxatdan o'tdi. Ushbu qiymat uchun koordinata 250 - (2 * 10) = 230. Ikkinchi kun uchun 250 - (7 * 10) = 180. Shunday qilib, nuqtalar koordinatalari bilan massiv quyidagicha:

Grafik quyidagicha ko'rinadi:

Biz chizmachilikning eng oddiy variantini ko'rib chiqdik. Men kunlar sonini va foydalanuvchilarning maksimal sonini oldindan bilardim. Shuning uchun men grafikning masshtabini o'zim tanladim. Lekin, odatda, bu ma'lumotlar boshqacha bo'lishi mumkin va o'lchovni hisoblash kerak. Va grafikning o'zi biroz boshqacha ko'rinadi. Biz koordinata o'qlari noldan boshlanishiga o'rganib qolganmiz. Ammo ko'rsatish qulayligi uchun bu qoida ba'zan bajarilmaydi. X o'qi 0 dan emas, balki 1 dan boshlanadi, shuning uchun chiziqning chap tomonida bo'sh joy qolmaydi. Va y o'qi barcha qiymatlar grafikga mos kelishi uchun ko'rsatilgan. Misol uchun, agar minimal qiymat 60 va maksimal qiymat 70 bo'lsa, y o'qi faqat shu diapazonni o'z ichiga oladi. Bunday grafikni yaratishni ko'rib chiqing.

Misolda, x o'qi 570 piksel uzunlikda. Har bir kun uchun uni teng segmentlarga bo'lish kerak. X o'qi 0 dan emas, balki 1 dan boshlanadi. Shuning uchun 0 va 1 orasida segment bo'lmaydi va segmentlar soni 1 ga kam bo'ladi. Agar 5 kun bo'lsa, siz 4 ta segmentni olasiz. Segment uzunligini hisoblash formulasi quyidagicha:

uzunlik = o'q uzunligi / (kunlar soni - 1)

Raqam kasr bo'lib chiqishi mumkin, shuning uchun natijani yaxlitlash kerak.

570 - 50 - x o'qining uzunligi. Bu rasmning o'lchamiga bog'liq.

Biz y o'qini barcha qiymatlar mos kelishi uchun qilamiz. Siz minimal va maksimal qiymatlarni olishingiz kerak. Ular grafikning butun balandligini egallashi kerak. Diapazonni bilib, biz grafikdagi bitta foydalanuvchiga qancha piksel to'g'ri kelishi kerakligini hisoblashimiz mumkin.

diapazon = maksimal - minimal

uzunlik = o'q uzunligi / diapazoni

Olingan raqamni ham yaxlitlash kerak.