INHOUDSOPGAWE:

Interessante verwerkingsprogrammeringsbegeleiding vir ontwerper-laai van media en gebeurtenisse: 13 stappe
Interessante verwerkingsprogrammeringsbegeleiding vir ontwerper-laai van media en gebeurtenisse: 13 stappe

Video: Interessante verwerkingsprogrammeringsbegeleiding vir ontwerper-laai van media en gebeurtenisse: 13 stappe

Video: Interessante verwerkingsprogrammeringsbegeleiding vir ontwerper-laai van media en gebeurtenisse: 13 stappe
Video: Webinar: administratieve en financiële begeleiding bij een werknemer op een melkveebedrijf. 2024, Julie
Anonim
Interessante verwerkingsprogrammeringsbegeleiding vir ontwerper-laai van media en geleenthede
Interessante verwerkingsprogrammeringsbegeleiding vir ontwerper-laai van media en geleenthede

Verwerking kan baie eksterne data gelaai word, waaronder drie soorte wat baie gereeld gebruik word. Dit is beeld, klank en video afsonderlik.

In hierdie hoofstuk gaan ons praat oor hoe om klank en video in detail te laai, gekombineer met gebeure. Uiteindelik kan u u eie musiektoetsenbord of musiekpalet skep.

Stap 1: Lees prentjie

Voordat ons begin, kyk ons terug na die metode vir die laai van foto's.

Stap 2: Beeldverwante funksies

Voordat ons hierdie funksies gebruik, moet ons 'n beeldvoorwerp deur PImage skep. Dan kan ons hierdie funksies gebruik om allerhande beeldeienskappe te definieer.

Moenie vergeet om u beeldbronne in die datalêer te stoor voordat u u program begin nie.

Stap 3: Musiek laai, speel en stop

In die volgende begin ons die oproep van musiek formeel aan u bekendstel. Baie soortgelyk aan die laai van foto's, moet u aan die begin 'n klankvoorwerp verklaar. U kan na die onderstaande voorbeeld verwys na die werklike grammatika.

Kode Voorbeeld (10-1):

[cceN_cpp tema = "dagbreek"] invoerverwerking.geluid.*;

SoundFile klank;

ongeldige opstelling () {

grootte (640, 360);

agtergrond (255);

sound = nuwe SoundFile (hierdie, "1.mp3");

}

nietige trekking () {

}

void keyPressed () {

//Speel klank

as (sleutel == 'p') {

klank.speel ();

}

// Stop geluid

as (sleutel == 's') {

klank.stop ();

}

} [/cceN_cpp]

Voorbereiding:

Die verwerking self bevat geen klankbiblioteek nie. U moet dit self aflaai. Dus, voordat u u kode skryf, moet u die volgende voorbereidings tref.

Voeg biblioteek by verwerking. Hier is die algemene praktyk. Kies uit die menubalk vir "Tool"- "Add Tool" en skuif dan na "Libraries". Voer die sleutelwoorde van die biblioteek in die soekkolom in, sodat u dit direk kan aflaai en installeer.

As ons hierdie funksie egter in ons land (in China) gebruik, kan ons dit nie aflaai deur die internet direk te verbind nie. Ons moet VPN begin. Alhoewel ons daarmee begin, sal daar onstabiele toestande wees. U moet dus geduldig wees om dit verskeie kere te probeer. Dit is die maklikste manier om te laai. As u nie kan installeer nie, moet u dit per handleiding aflaai van die amptelike webwerf. (https://processing.org/reference/libraries/) Omdat die handmatige installeringsmetode baie ingewikkeld is, bespreek ons dit verder in die ander hoofstuk.

Kode Exaplain:

Die klankbiblioteek kan behoorlik werk nadat die voorbereiding voltooi is. Bepaal die kode hierbo, klik op RUN, dan werk dit. Druk die sleutel "P" om musiek te speel, "S" om musiek te stop.

As dit aan die program gewoond is, moet ons dit eers laai. Aan die begin moet ons 'n sin byvoeg "import processing.sound.*". "invoer" is die sleutelwoord, wat letterlik laai. Voeg die biblioteeknaam by agter "invoer", dan laai dit die biblioteek. Die stert volg gewoonlik 'n "*", en laai dus al die biblioteekverwante klasse in die program sonder om dit een vir een met die hand by te voeg.

In die tweede sin het 'SoundFile sound' 'n klankvoorwerp verklaar. SoundFile is soortgelyk aan PImage.

Binne funksieopstelling word "sound = new SoundFile (hierdie," 1.mp3 ");" gebruik om 'n voorwerp te skep en die leespad daarvan te definieer. Hier het ons eintlik reeds 'n nuwe konsep klas begin gebruik. Op die oomblik bespreek ons dit nie diep nie. Ons hoef net te weet dat dit 'n vaste skryfmetode is, en die laaste parameter is om die adres van die musiekbron in te vul.

Onder keyPressed () -gebeurtenisse werk "sound.play ()" en "sound.stop ()" relatief as die effek van speel en stop. "." in die middel dui 'n lidfunksie aan wat speel en stop behoort aan klankvoorwerpe. Ons kan lidfunksie beskou as die funksie wat in die voorwerp ingesluit is. Dit behoort aan hierdie voorwerp, wat vooraf gedefinieer word. As ons later meer klankvoorwerpe moet speel, hoef ons slegs '.play ()' agter die naam van die relatiewe veranderlike by te voeg.

Klankbronne moet in dieselfde datalêer onder dieselfde katalogus van sketsbestand (met pde -agtervoegsel) gestoor word. As daar geen is nie, kan u een met die hand maak.

Moenie vergeet om funksie teken te skryf nie. Alhoewel u geen grafika geteken het nie, is dit nodig om musiek suksesvol te speel.

Bogenoemde prosedure lyk baie ingewikkeld, maar u moet slegs 'n paar kode -sinne byvoeg, dan kan u die speelfunksie besef. Dit is baie gerieflik.

Verwerking ondersteun algemene klankformate soos mp3, wav, ogg, ens.

Stap 4: Musiek spoedbeheer

Die volgende voorbeelde sal baie interessant word. Verwerking het 'n paar funksies verskaf wat die spelsnelheid van musiek kan beheer. Terselfdertyd verander die toon met die spelsnelheid van musiek. As ons die muis gebruik om te beheer, sal dit 'n baie psigedeliese effek hê.

Video -webwerf:

Kode Voorbeeld (10-2):

[cceN_cpp tema = "dagbreek"] invoerverwerking.geluid.*;

SoundFile klank;

ongeldige opstelling () {

grootte (640, 360);

agtergrond (255);

sound = nuwe SoundFile (hierdie, "1.mp3");

}

nietige trekking () {

vlot spoed = mouseX/(float) breedte * 3;

klank.snelheid (spoed);

float vol = mouseY/(float) hoogte * 4;

klank.amp (vol);

}

void keyPressed () {

//Speel klank

as (sleutel == 'p') {

klank.speel ();

}

// Stop geluid

as (sleutel == 's') {

klank.stop ();

}

} [/cceN_cpp]

Kode Verduidelik:

Funksie.rate () beheer die spoed van die klank. Die waarde tussen hakies bepaal die vinnige en stadige speelsnelheid. As die waarde 1 is, is die speelsnelheid normaal. As dit meer as 1 is, versnel dan; terwyl dit onder 1 is, vertraag dan.

Funksie.amp () beheer die klankvolume. Die waarde tussen hakies bepaal die volume waarde. As dit 1 is, is die volume waarde normaal. As dit meer as 1 is, verhoog dan die volume; terwyl dit onder 1 is, verlaag dan die volume.

Hier het ons twee plaaslike veranderlikes snelheid en vol as parameters gebou om in te laai. Daarom verander die horisontale koördinaat van die muis die musiektoon en die vertikale koördinaat die musiekvolume.

Stap 5: Video speel en stop

In die verwerking is video laai soortgelyk aan klank laai. U moet eers die videobiblioteek aflaai. (https://processing.org/reference/libraries/video/index.html)

Kode Voorbeeld (10-3):

[cceN_cpp tema = "dagbreek"] invoerverwerking.video.*;

Fliek mov;

ongeldige opstelling () {

grootte (640, 360);

agtergrond (0);

mov = nuwe fliek (hierdie, "1.film");

}

void movieEvent (filmfliek) {

mov.read ();

}

nietige trekking () {

beeld (mov, 0, 0, 640, 360);

}

void keyPressed () {

as (sleutel == 'p') {

mov.play ();

}

as (sleutel == 's') {

mov.stop ();

}

as (sleutel == 'd') {

mov.pause ();

}

} [/cceN_cpp]

Video skermkiekie:

Kode Verduidelik:

Die eerste sin "import processing.video.*;" Word gebruik om die videobiblioteek te laai.

Die tweede sin "Movie mov;" word gebruik om video -voorwerp te verklaar. Die funksie van "Movie" is soortgelyk aan PImage.

In funksie -opstelling is die effek van "mov = new Movie (hierdie," 1.mov ");" om 'n voorwerp te skep en die leespad daarvan te definieer. Die laaste parameter word ingevul met die adres van die videobron.

Agter die opstelling verteenwoordig movieEvent 'n video -gebeurtenis. Dit word gebruik om video -inligting op te dateer en te lees. "mov.read ()" in die geval beteken gelees.

Behalwe vir die vertoon van beelde, kan funksiebeeld ook video vertoon. Ons kan video -voorwerpe as 'n dinamiese prentjie beskou. Die eerste parameter, vul ons die veranderlike naam van die video -voorwerp in. Die tweede en derde parameters is die horisontale en vertikale koördinaat wat deur video geteken word. Die vierde en vyftigste parameters bepaal die lengte en breedte van die videovertoning.

Funksie.play () beteken speel. Funksie.stop () beteken stop, en dit sal die video herstel. Funksie.pause () beteken pouse. Dit sal die huidige spel onderbreek, wat sal voortduur totdat funksie.play () opgeroep word.

Stap 6: Beheer van videosnelheid

Kode Voorbeeld (10-4):

[cceN_cpp tema = "dagbreek"] invoerverwerking.video.*;

Fliek mov;

ongeldige opstelling () {

grootte (640, 360);

agtergrond (0);

mov = nuwe film (hierdie, "transit.mov");

}

void movieEvent (filmfliek) {

mov.read ();

}

nietige trekking () {

beeld (mov, 0, 0, breedte, hoogte);

float newSpeed = mouseX/(float) breedte * 4;

mov.speed (newSpeed);

}

void keyPressed () {

as (sleutel == 'p') {

mov.play ();

}

as (sleutel == 's') {

mov.stop ();

}

as (sleutel == 'd') {

mov.pause ();

}

}

[/cceN_cpp]

Kode Verduidelik:

Funksie.snelheid () kan gebruik word om die videospelsnelheid te beheer. As die parameterwaarde 1 is, is die speelsnelheid normaal. As die waarde meer as 1 is, versnel dan; terwyl dit onder 1 is, moet u dit dan aflaai.

Omdat ons 'n plaaslike veranderlike newSpeed gebou het en dit in funksie setSpeed () ingevoer het, beïnvloed die muiskoördinaat die speelsnelheid van die video direk.

Wat meer voorbeelde oor video betref, kan u na biblioteke - video in die kasbiblioteek verwys.

Stap 7: Verwerking van algemene gebeurtenisse

Voorheen het ons slegs keyPressed () -gebeurtenis bekendgestel. Dit word geaktiveer nadat die sleutelbord ingedruk is. In die volgende sal ons ander algemene gebeurtenisse in die verwerking vir u bekendstel.

Die gebruike van die bogenoemde gebeure is soortgelyk aan keyPressed. Hulle het geen volgorde in kode skryf nie. Met ander woorde, maak nie saak watter gebeurtenis u voor of agter die funksie -opstelling plaas nie, u kry dieselfde resultaat. Die uitvoeringsbevel hou slegs verband met die aanleiding tot die gebeurtenis self. Slegs as aan die voorwaarde voldoen word, sal dit uitgevoer word. Gebeure hierbo is almal baie maklik om te verstaan. U hoef net 'n klein eksperiment te doen, dan kan u die gebruik daarvan vinnig begryp.

Gebeurtenisstroom

Ons kan 'n voorbeeld gebruik om die volgorde van gebeurtenisse te ken.

Kode Voorbeeld (10-5):

[cceN_cpp tema = "dagbreek"] leemte -opstelling () {

frameRate (2);

println (1);

}

nietige trekking () {

println (2);

}

leegte mousePressed () {

println (3);

}

leegte mouseMoved () {

println (4);

}

leegte mouseReleased () {

println (5);

}

void keyPressed () {

println (6);

}

void keyReleased () {

println (7);

} [/cceN_cpp]

Kode Verduidelik:

In funksie -opstelling het funksie frameRate () die werkende snelheid van die program op 2 rame per sekonde gestel. Deur die raamtempo te verlaag, kan ons die uitset in die konsole waarneem ingeval gebeurtenisse wat onmiddellik veroorsaak word, onmiddellik deur nuwe data na agter geborsel word.

Probeer om jou muis te beweeg, klik op die muis, laat die muis los en kyk na die uitsetresultaat. Maak kennis met die uitvoeringsbevel vir gebeurtenisse via println.

Dit is die moeite werd om aandag te skenk: tekenfunksies kan nie in ander gebeurtenisse ingeskryf word nie, behalwe funksieteken, of dit kan nie vertoon word nie. As ons die verberging en vertoning van grafiese komponente deur gebeurtenisse soos keyPressed wil beheer, kan ons dit oorweeg om 'n bool -veranderlike as medium op te stel.

Gebeurtenisse sal in volgorde uitgevoer word. Eers nadat al die kode in die huidige gebeurtenis geïmplementeer is, sal dit die kode in die volgende gebeurtenis uitvoer.

Stap 8: Omvattende voorbeeld-musieklavier

In kombinasie met die nuut aangepaste gebeure, kan ons nuwe interaksies by ons program voeg. Vervolgens kan ons slegs met 'n paar minute 'n musiektoetsenbord maklik analoog.

Video -webwerf:

Kode Voorbeeld (10-6):

[cceN_cpp tema = "dagbreek"] invoerverwerking.geluid.*;

SoundFile klank1, klank2, klank3, klank4, klank5;

boolean key1, key2, key3, key4, key5;

ongeldige opstelling () {

grootte (640, 360);

agtergrond (255);

noStroke ();

sound1 = nuwe SoundFile (hierdie, "do.wav");

sound2 = nuwe SoundFile (hierdie, "re.wav");

sound3 = nuwe SoundFile (hierdie, "mi.wav");

sound4 = nuwe SoundFile (hierdie, "fa.wav");

sound5 = nuwe SoundFile (hierdie, "so.wav");

}

nietige trekking () {

agtergrond (255, 214, 79);

rectMode (SENTRUM);

vlot w = breedte * 0,1;

vlot h = hoogte * 0,8;

as (sleutel1) {

vul (255);

} anders {

fill (238, 145, 117);

}

reg (breedte/6, hoogte/2, w, h);

as (sleutel2) {

vul (255);

} anders {

fill (246, 96, 100);

}

regs (breedte/6 * 2, hoogte/2, w, h);

as (sleutel3) {

vul (255);

} anders {

fill (214, 86, 113);

}

regs (breedte/6 * 3, hoogte/2, w, h);

as (sleutel4) {

vul (255);

} anders {

fill (124, 60, 131);

}

regs (breedte/6 * 4, hoogte/2, w, h);

as (sleutel5) {

vul (255);

} anders {

fill (107, 27, 157);

}

regs (breedte/6 * 5, hoogte/2, w, h);

}

void keyPressed () {

as (sleutel == 'a') {

klank1.spel ();

sleutel1 = waar;

}

as (sleutel == 's') {

klank2.speel ();

sleutel2 = waar;

}

as (sleutel == 'd') {

klank3. speel ();

sleutel3 = waar;

}

as (sleutel == 'f') {

klank4.spel ();

sleutel4 = waar;

}

as (sleutel == 'g') {

klank5.spel ();

sleutel5 = waar;

}

}

void keyReleased () {

as (sleutel == 'a') {

sleutel1 = vals;

}

as (sleutel == 's') {

sleutel2 = vals;

}

as (sleutel == 'd') {

sleutel3 = vals;

}

as (sleutel == 'f') {

sleutel4 = vals;

}

as (sleutel == 'g') {

sleutel5 = vals;

}

} [/cceN_cpp]

Kode Verduidelik:

Ons moet verskeie klankvoorwerpe skep om die relatiewe klankinligting te lees om verskillende klanke te speel wanneer verskillende sleutels geaktiveer word.

Hier gebruik ons 'n nuwe gebeurtenis keyReleased (). Die funksie van hierdie gebeurtenis is om die sleutelbordkleur in sy oorspronklike kleur te herstel. As u die sleutel loslaat, word dit geaktiveer.

Die 5 booleaanse waardes wat in die kop verklaar word, word gebruik om die status van die sleutel op te spoor.

Stap 9: Omvattende voorbeeld-Musiekpalet 1

Benewens die sleutelbordgebeurtenis, is die muisgebeurtenis ook goed dat ons dit buigsaam moet gebruik. Die volgende voorbeeld is om 'n musiekpalet te skep, waaronder ons twee muisverwante gebeurtenisse gebruik het.

Video -webwerf:

Kode Voorbeeld (10-7):

[cceN_cpp tema = "dagbreek"] invoerverwerking.geluid.*;

SoundFile klank1, klank2, klank3, klank4, klank5;

boolean isDragging;

ongeldige opstelling () {

grootte (640, 360);

agtergrond (255, 214, 79);

noStroke ();

sound1 = nuwe SoundFile (hierdie, "do.wav");

sound2 = nuwe SoundFile (hierdie, "re.wav");

sound3 = nuwe SoundFile (hierdie, "mi.wav");

sound4 = nuwe SoundFile (hierdie, "fa.wav");

sound5 = nuwe SoundFile (hierdie, "so.wav");

}

nietige trekking () {

as (isDragging) {

fill (107, 27, 157, 100);

ellips (mouseX, mouseY, 16, 16);

}

}

leegte mouseDragged () {

isDragging = waar;

as (mouseX> 100 && mouseX <105) {

klank1.spel ();

}

as (mouseX> 200 && mouseX <205) {

klank2.speel ();

}

as (mouseX> 300 && mouseX <305) {

klank3. speel ();

}

as (mouseX> 400 && mouseX <405) {

klank4.spel ();

}

as (mouseX> 500 && mouseX <505) {

klank5.spel ();

}

}

leegte mouseReleased () {

isDragging = vals;

} [/cceN_cpp]

Kode Verduidelik:

Ons hoop dat ons slegs prentjies kan teken as ons met die muis gedruk en gesleep het. Ons moet dus 'n booleaanse veranderlike isDragging bou om die huidige status te verkry.

As u met die muis sleep, word isDragging ware waarde, sodat tekenfunksies in Draw uitgevoer sal word. Dit sal spore op die skerm laat. As ons die muis loslaat, word isDragging 'n vals waarde. Die tekenfunksies in funksie trek sal die uitvoering stop.

Ons het verskillende aanvangstoestande ontwerp vir die sleep van 'n gebeurtenis. As die horisontale koördinaat van die muis byvoorbeeld tussen 100 en 105 pixels is, word musiek outomaties gespeel. Dit maak dat die skerm verskeie onsigbare snare skep. Slegs as die muis deur die sekere gebiede gaan, sal dit die relatiewe musiek veroorsaak.

Stap 10: Omvattende voorbeeld-Music Palette 2 (opgedateerde weergawe)

Die effek van die voorbeeld hierbo is reeds goed genoeg. Maar as ons dit noukeurig bekyk, vind ons baie probleme. As die muis byvoorbeeld baie vinnig beweeg, sal dit elke keer 'n ronde punt op die skerm laat. Dit is nie 'n samehangende reguit lyn nie. Intussen veroorsaak dit ook 'n mate van musieklek. Terwyl die muis baie stadig beweeg en deur die posisie beweeg wanneer die horisontale koördinaat tussen 100 en 105 is, sal dit binne 'n baie kort tyd verskeie kere musiek uitstuur, wat u 'n gevoel van vassteek gee. Al hierdie probleme, ons kan dit oplos deur middel van die onderstaande voorbeeld.

U kan video's op die onderstaande skakel kyk:

v.qq.com/x/page/w03226o4y4l.html

Kode Voorbeeld (10-8):

[cceN_cpp tema = "dagbreek"] invoerverwerking.geluid.*;

SoundFile klank1, klank2, klank3, klank4, klank5;

boolean isDragging;

ongeldige opstelling () {

grootte (640, 360);

agtergrond (255, 214, 79);

noStroke ();

sound1 = nuwe SoundFile (hierdie, "do.wav");

sound2 = nuwe SoundFile (hierdie, "re.wav");

sound3 = nuwe SoundFile (hierdie, "mi.wav");

sound4 = nuwe SoundFile (hierdie, "fa.wav");

sound5 = nuwe SoundFile (hierdie, "so.wav");

}

nietige trekking () {

as (isDragging) {

beroerte (107, 27, 157, 100);

beroertegewig (10);

line (mouseX, mouseY, pmouseX, pmouseY);

}

}

leegte mouseDragged () {

isDragging = waar;

as ((mouseX - 100) * (pmouseX - 100) <0) {

klank1.spel ();

}

as ((mouseX - 200) * (pmouseX - 200) <0) {

klank2.speel ();

}

as ((mouseX - 300) * (pmouseX - 300) <0) {

klank3. speel ();

}

as ((mouseX - 400) * (pmouseX - 400) <0) {

klank4.spel ();

}

as ((mouseX - 500) * (pmouseX - 500) <0) {

klank5.spel ();

}

}

leegte mouseReleased () {

isDragging = vals;

} [/cceN_cpp]

Kode Verduidelik:

Hier het ons twee veranderlikes pmouseX en pmouseY gebruik in die verwerkingstelsel self. Hulle is soortgelyk aan mouseX en mouseY, maar wat hulle gekry het, is die koördinaat van die muis in die laaste raam.

In Funksietrekking het ons funksielyn () gebruik om die oorspronklike funksie -ellips () te vervang. Dit maak die koördinaat van die laaste raam direk verbind met die koördinaat van die huidige raam. Ons kan dus samehangende reguit lyne of krommes teken.

In die geval van mouseDragged, het ons 'n nuwe ontstekingstoestand ontwerp. Deur te oordeel of die koördinaat van die laaste raam en huidige raam in dieselfde kant is om te weet of 'n sekere koördinaat gekruis is. Neem hierdie voorwaarde as 'n voorbeeld: "if ((mouseX - 100) * (pmouseX - 100) <0)". Onder die positiewe en negatiewe waarde wat voortspruit uit "mouseX - 100", kan ons weet of mouseX regs of links van die horisontale koodinaat 100 is. Net soos "pmouseX - 100". As die twee punte voor en agter nie aan dieselfde kant is nie, vermenigvuldig 'n positief 'n negatief, kry dit 'n nuwe negatiewe getal. Die uitvoeringstoestand is dus nagekom.

Bogenoemde is 'n vereenvoudigde uitdrukking wat 'n sekere wiskundige algoritme slim gebruik het-twee negatiewe vermenigvuldiging sal 'n positiewe resultaat skep. U kan dit ook in twee situasies verdeel om afsonderlik te bespreek. Dit is egter baie ingewikkelder om oordeelvoorwaardes te skryf. Die beoordelingsvoorwaardes "if ((mouseX = 100) || (mouseX> 100 && pmouseX <= 100))" is gelykstaande aan die bepalende voorwaardes van die bronkode.

Stap 11: Relatiewe funksies oor klank- en videobeheer

Bogenoemde funksies is voldoende vir algemene gebruiksscenario's. As u dit diep wil verdiep, het ek 'n paar algemene funksies vir klank en video vir u versamel. U kan die gebruik daarvan volgens u eie vereistes ondersoek.

Vir meer inleiding, kan u verwys na dokumente van die amptelike webwerf.

Oudio (https://processing.org/reference/libraries/sound/index.html)

Video (https://processing.org/reference/libraries/video/index.html)

Hierdie artikel kom van ontwerper Wenzy.

Stap 12: Relatiewe lesings:

Interessante programmeergeleiding vir ontwerper-verwerking van eerste aanraking

Interessante programmeergeleiding vir ontwerpers - skep u eerste verwerkingsprogram

Interessante programmeergeleiding vir ontwerper-laat u prentjie loop (deel een)

Interessante programmeergeleiding vir ontwerpers-laat u prentjie aan die gang wees (deel twee)

Interessante programmeergeleiding vir ontwerper- programprosesbeheer- lusverklaring

Interessante programmeergeleiding vir ontwerper-Programprosesbeheer-toestandverklaring (deel een)

Interessante programmeergeleiding vir ontwerper-Programprosesbeheer-toestandverklaring (deel twee)

Interessante programmeergeleiding vir ontwerpers-pasgemaakte funksies en fraktale rekursie

Interessante programmeergeleiding vir ontwerpers-pasgemaakte funksies en fraktale rekursie

Interessante verwerkingsprogrammeringsbegeleiding vir ontwerper-kleurbeheer

Stap 13: Bron

Hierdie artikel is afkomstig van:

As u enige vrae het, kan u kontak: [email protected].

Aanbeveel: