next up previous contents
Next: About this document Up: C-programmering for musikere Previous: Lydbehandling

Grafikk

Vi har valgt å se litt på computergrafikk i dette kurset, fordi grafikk er interessant også i musikksammenheng. Visualisering av lyd, og andre kombinasjoner av lyd og bilde (f.eks. musikkvideoer), er aktuelle temaer for tiden.

2D-grafikk

Grafikk er ikke en integrert del av C, men det finnes mange ulike biblioteker som man kan bruke. Et av de mest avanserte og mest brukte er GL (Graphics Library), som opprinnelig ble utviklet av SGI, men som nå også er tilgjengelig for PC. GL kan håndtere både todimensjonal og tredimensjonal grafikk, men vi skal holde oss til 2-D foreløpig.

Det er endel initialisering og mekk med GL, så vi har laget et eget lite grafikkbibliotek som forenkler ting.

Eksempel 11: Streker

Dette programmet tegner masse streker:

#include <stdio.h>
#include "/local/ckurs/grafikk.h"

void main(void)
{
  int i, x, y;

  openwin(800,800);
  for (i=0; i<1000; i++) {
    setcolor(1, i/1000., i/1000.);
    drawline(rand()/41, rand()/41, rand()/41, rand()/41);
  }
  sleep(100); /* Heng i 100 sekunder (stopp med ctrl-c) */
}

Funksjonen openwin lager et grafikkvindu med den oppgitte bredde og høyde.

setcolor setter en farge. De tre parametrene går fra 0 til 1, og bestemmer hvor mye vi vil ha av hhv. rødt, grønt og blått (RGB).

Programmet må kompileres med -lgl for å lenke inn grafikkbiblioteket.

Eksempel 12: Faseplott av lyd

Her følger et litt stort og komplisert eksempel som lager et animert forsinket faseplan-plott av en lyd. Programmet leser først en hel lydfil inn i minnet. C-funksjonen malloc brukes til å opprette en tabell lyd med en størrelse som avgjøres av lengden på lydfilen.

Deretter går programmet i en løkke som tegner ut ett punkt for hvert sample i lyden. X-koordinatet bestemmes av sample-verdien, mens y-koordinatet bestemmes av verdien 100 samples tidligere. For at vi ikke bare skal få flere og flere punkter, fjernes også "gamle" punkter etterhvert, ved å tegne dem i svart.

#include <stdio.h>
#include "/local/ckurs/grafikk.h"
#include "/local/ckurs/lydfil.h"

Lydfil *lydfil;
int antsamp;
short int *lyd=NULL;

void lesfil()
{
  int i, R;

  lydfil=lydfil_openles("lydfil", &antsamp, &R);

  /* Lag et array som kan lagre hele lyden */
  lyd=(short int *)malloc(antsamp*sizeof(short int));

  for (i=0; i<antsamp; i++)
    lyd[i]=lydfil_lessample(lydfil);
  lydfil_lukk(lydfil);
}

void tegnpunkt(int n)
{
  int x, y;

  /* Fjern et 40000 samples gammelt punkt */

  if (n>=40100) {
    x=(lyd[n-40000]/32768.+0.5)*768;
    y=(lyd[n-40000-100]/32768.+0.5)*576;
    setcolor(0., 0., 0.);
    drawpoint(x, y);
  }

  /* Tegn nytt punkt */

  x=(lyd[n]/32768.+0.5)*768;
  y=(lyd[n-100]/32768.+0.5)*576;
  setcolor((n%40000)/40000., 1.0, 1.-(n%40000)/40000.);
  drawpoint(x, y);
}

void main(void)
{
  int n;

  lesfil();
  openwin(768, 576);
  for (n=100; n<antsamp; n++) tegnpunkt(n);
  sleep(10);
}

Oppgaver

1

Lag et program som tegner en logaritmisk spiral:

  x = exp(8*t)*cos(40*t)/10
  y = exp(8*t)*sin(40*t)/10

der t løper fra 0 til 1 i fine steg.

2

Plott det kaotiske systemet fra eksempel 2.

3D-grafikk

Vi skal ikke styre 3D-grafikk direkte på skjermen i dette kurset, det blir for komplisert. Vi skal heller skrive en beskrivelse av 3D-scenen til en fil, som så kan leses av en egen 3D-framviser. Filen kodes i Inventor-formatet, som er en standard på SGI. Inventor er også noenlunde kompatibel med VRML (Virtual Reality Modelling Language) som er standard-formatet på web. Du kan altså legge filen på hjemmesiden din, og den blir da vist fram i 3D i Netscape.

Eksempel 13: Kulefigur

#include <stdio.h>
#include <math.h>

void main(void)
{
  int i;
  float phi;

  printf("#Inventor V2.0 ascii\n");
  printf("Separator {\n");

  for (i=0; i<20; i++) {
    phi = i*2.*3.14159/20.;
    printf("  Separator {\n");
    printf("    Material { diffuseColor [ %f %f 0.7 ] }\n",
      i/20., rand()/32768.);
    printf("    Transform { translation %f %f %f }\n",
      cos(phi)*2, sin(phi)*2, cos(2.*phi)*2);
    printf("    Sphere { radius 1 }\n");
    printf("  }\n");
  }
  printf("}\n");
}

Se på filen som dette programmet lager. Definisjonen av hver kule er pakket inn i en Separator. Hver kule har et Material med farge, matthet etc., en Transform med posisjonen i rommet, og en objekttype med typen av geometrisk objekt.

Lag en fil som heter f.eks. kuler.iv, og bruk programmet ivview for å se resultatet (blir best på maskinen "leon"):

  ivview kuler.iv

En komplett beskrivelse av VRML finner du på

  http://vag.vrml.org/vrml10c.html

Oppgave

Skriv et program som lager 100 kuber i tilfeldige posisjoner. Bruk Inventor-objektet Cube:

  Cube { height 1 depth 1 width 1 }


next up previous contents
Next: About this document Up: C-programmering for musikere Previous: Lydbehandling

\yvind Hammer
Tue Oct 1 17:56:30 MDT 1996